[med-svn] [r-cran-rmarkdown] 01/02: New upstream version 1.8

Andreas Tille tille at debian.org
Mon Dec 11 15:41:21 UTC 2017


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository r-cran-rmarkdown.

commit 5ff00c3afe7f6a014cea30feb8838d8c1ab58533
Author: Andreas Tille <tille at debian.org>
Date:   Mon Dec 11 16:40:20 2017 +0100

    New upstream version 1.8
---
 DESCRIPTION                                        |   108 +
 MD5                                                |   338 +
 NAMESPACE                                          |    90 +
 R/base64.R                                         |    49 +
 R/beamer_presentation.R                            |   258 +
 R/draft.R                                          |   159 +
 R/github_document.R                                |    94 +
 R/html_dependencies.R                              |   296 +
 R/html_document.R                                  |   645 +
 R/html_document_base.R                             |   195 +
 R/html_extras.R                                    |    43 +
 R/html_fragment.R                                  |    49 +
 R/html_notebook.R                                  |   463 +
 R/html_notebook_output.R                           |    95 +
 R/html_paged.R                                     |   226 +
 R/html_parser.R                                    |    88 +
 R/html_resource_copy.R                             |   120 +
 R/html_resources.R                                 |   477 +
 R/html_vignette.R                                  |    71 +
 R/includes.R                                       |    61 +
 R/ioslides_presentation.R                          |   265 +
 R/knit_print.R                                     |    42 +
 R/latex_dependencies.R                             |    70 +
 R/list_builder.R                                   |    45 +
 R/md_document.R                                    |   103 +
 R/odt_document.R                                   |    89 +
 R/output_format.R                                  |   765 +
 R/pandoc.R                                         |   663 +
 R/params.R                                         |   476 +
 R/pdf_document.R                                   |   256 +
 R/performance.R                                    |    81 +
 R/relative_to.R                                    |    37 +
 R/render.R                                         |   847 ++
 R/render_html.R                                    |    20 +
 R/render_site.R                                    |   442 +
 R/rtf_document.R                                   |    98 +
 R/shiny.R                                          |   599 +
 R/shiny_module.R                                   |     0
 R/shiny_prerendered.R                              |   591 +
 R/slidy_presentation.R                             |   163 +
 R/stack.R                                          |    28 +
 R/tufte_handout.R                                  |    36 +
 R/util.R                                           |   655 +
 R/word_document.R                                  |   108 +
 R/zzz.R                                            |    31 +
 inst/COPYING                                       |   678 +
 inst/NEWS                                          |   564 +
 inst/NOTICE                                        |   565 +
 .../templates/github_document/resources/default.md |    28 +
 .../templates/github_document/resources/github.css |   692 +
 .../github_document/resources/preview.html         |    31 +
 .../github_document/skeleton/skeleton.Rmd          |    30 +
 .../templates/github_document/template.yaml        |     4 +
 .../templates/html_vignette/resources/vignette.css |   206 +
 .../templates/html_vignette/skeleton/skeleton.Rmd  |    65 +
 .../templates/html_vignette/template.yaml          |     5 +
 inst/rmd/fragment/default.html                     |    11 +
 inst/rmd/fragment/default.tex                      |     1 +
 inst/rmd/h/_navbar.html                            |    21 +
 inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css |   587 +
 .../h/bootstrap-3.3.5/css/bootstrap-theme.css.map  |     1 +
 .../h/bootstrap-3.3.5/css/bootstrap-theme.min.css  |     5 +
 inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css       |  6799 +++++++++
 inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css.map   |     1 +
 inst/rmd/h/bootstrap-3.3.5/css/bootstrap.min.css   |     5 +
 inst/rmd/h/bootstrap-3.3.5/css/cerulean.min.css    |    11 +
 inst/rmd/h/bootstrap-3.3.5/css/cosmo.min.css       |    30 +
 inst/rmd/h/bootstrap-3.3.5/css/flatly.min.css      |    30 +
 inst/rmd/h/bootstrap-3.3.5/css/fonts/Lato.ttf      |   Bin 0 -> 81980 bytes
 inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoBold.ttf  |   Bin 0 -> 82368 bytes
 .../rmd/h/bootstrap-3.3.5/css/fonts/LatoItalic.ttf |   Bin 0 -> 81332 bytes
 inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycle.ttf |   Bin 0 -> 28716 bytes
 .../h/bootstrap-3.3.5/css/fonts/NewsCycleBold.ttf  |   Bin 0 -> 28724 bytes
 inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSans.ttf  |   Bin 0 -> 34112 bytes
 .../h/bootstrap-3.3.5/css/fonts/OpenSansBold.ttf   |   Bin 0 -> 35760 bytes
 .../css/fonts/OpenSansBoldItalic.ttf               |   Bin 0 -> 33064 bytes
 .../h/bootstrap-3.3.5/css/fonts/OpenSansItalic.ttf |   Bin 0 -> 32808 bytes
 .../h/bootstrap-3.3.5/css/fonts/OpenSansLight.ttf  |   Bin 0 -> 35340 bytes
 .../css/fonts/OpenSansLightItalic.ttf              |   Bin 0 -> 32680 bytes
 inst/rmd/h/bootstrap-3.3.5/css/fonts/Raleway.ttf   |   Bin 0 -> 63796 bytes
 .../h/bootstrap-3.3.5/css/fonts/RalewayBold.ttf    |   Bin 0 -> 62224 bytes
 inst/rmd/h/bootstrap-3.3.5/css/fonts/Roboto.ttf    |   Bin 0 -> 32652 bytes
 .../rmd/h/bootstrap-3.3.5/css/fonts/RobotoBold.ttf |   Bin 0 -> 32500 bytes
 .../h/bootstrap-3.3.5/css/fonts/RobotoLight.ttf    |   Bin 0 -> 32664 bytes
 .../h/bootstrap-3.3.5/css/fonts/RobotoMedium.ttf   |   Bin 0 -> 32580 bytes
 .../h/bootstrap-3.3.5/css/fonts/SourceSansPro.ttf  |   Bin 0 -> 35064 bytes
 .../css/fonts/SourceSansProBold.ttf                |   Bin 0 -> 34908 bytes
 .../css/fonts/SourceSansProItalic.ttf              |   Bin 0 -> 33864 bytes
 .../css/fonts/SourceSansProLight.ttf               |   Bin 0 -> 35368 bytes
 inst/rmd/h/bootstrap-3.3.5/css/fonts/Ubuntu.ttf    |   Bin 0 -> 73608 bytes
 inst/rmd/h/bootstrap-3.3.5/css/journal.min.css     |    24 +
 inst/rmd/h/bootstrap-3.3.5/css/lumen.min.css       |    37 +
 inst/rmd/h/bootstrap-3.3.5/css/paper.min.css       |    36 +
 inst/rmd/h/bootstrap-3.3.5/css/readable.min.css    |    24 +
 inst/rmd/h/bootstrap-3.3.5/css/sandstone.min.css   |    24 +
 inst/rmd/h/bootstrap-3.3.5/css/simplex.min.css     |    24 +
 inst/rmd/h/bootstrap-3.3.5/css/spacelab.min.css    |    36 +
 inst/rmd/h/bootstrap-3.3.5/css/united.min.css      |    18 +
 inst/rmd/h/bootstrap-3.3.5/css/yeti.min.css        |    50 +
 .../fonts/glyphicons-halflings-regular.eot         |   Bin 0 -> 20127 bytes
 .../fonts/glyphicons-halflings-regular.svg         |   288 +
 .../fonts/glyphicons-halflings-regular.ttf         |   Bin 0 -> 45404 bytes
 .../fonts/glyphicons-halflings-regular.woff        |   Bin 0 -> 23424 bytes
 .../fonts/glyphicons-halflings-regular.woff2       |   Bin 0 -> 18028 bytes
 inst/rmd/h/bootstrap-3.3.5/js/bootstrap.js         |  2363 +++
 inst/rmd/h/bootstrap-3.3.5/js/bootstrap.min.js     |     7 +
 inst/rmd/h/bootstrap-3.3.5/js/npm.js               |    13 +
 inst/rmd/h/bootstrap-3.3.5/shim/html5shiv.min.js   |     7 +
 inst/rmd/h/bootstrap-3.3.5/shim/respond.min.js     |     8 +
 inst/rmd/h/default.html                            |   508 +
 inst/rmd/h/font-awesome-4.5.0/css/font-awesome.css |  2085 +++
 .../h/font-awesome-4.5.0/css/font-awesome.min.css  |    11 +
 .../fonts/fontawesome-webfont.ttf                  |   Bin 0 -> 142072 bytes
 inst/rmd/h/highlightjs/default.css                 |    21 +
 inst/rmd/h/highlightjs/highlight.js                |     2 +
 inst/rmd/h/highlightjs/textmate.css                |    19 +
 inst/rmd/h/ionicons-2.0.1/LICENSE                  |    21 +
 inst/rmd/h/ionicons-2.0.1/css/ionicons.css         |  1480 ++
 inst/rmd/h/ionicons-2.0.1/css/ionicons.min.css     |    14 +
 inst/rmd/h/ionicons-2.0.1/fonts/ionicons.ttf       |   Bin 0 -> 188508 bytes
 inst/rmd/h/jquery-1.11.3/jquery.min.js             |     5 +
 inst/rmd/h/jquery-AUTHORS.txt                      |   217 +
 inst/rmd/h/jqueryui-1.11.4/README                  |     8 +
 .../images/ui-icons_444444_256x240.png             |   Bin 0 -> 6992 bytes
 .../images/ui-icons_555555_256x240.png             |   Bin 0 -> 6988 bytes
 .../images/ui-icons_777620_256x240.png             |   Bin 0 -> 4549 bytes
 .../images/ui-icons_777777_256x240.png             |   Bin 0 -> 6999 bytes
 .../images/ui-icons_cc0000_256x240.png             |   Bin 0 -> 4549 bytes
 .../images/ui-icons_ffffff_256x240.png             |   Bin 0 -> 6299 bytes
 inst/rmd/h/jqueryui-1.11.4/index.html              |   505 +
 inst/rmd/h/jqueryui-1.11.4/jquery-ui.css           |  1060 ++
 inst/rmd/h/jqueryui-1.11.4/jquery-ui.js            | 14546 +++++++++++++++++++
 inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.css       |     7 +
 inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.js        |    12 +
 inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.css |   668 +
 .../h/jqueryui-1.11.4/jquery-ui.structure.min.css  |     5 +
 inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.css     |   410 +
 inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.min.css |     5 +
 inst/rmd/h/jqueryui-AUTHORS.txt                    |   315 +
 inst/rmd/h/navigation-1.1/codefolding.js           |    59 +
 inst/rmd/h/navigation-1.1/sourceembed.js           |    12 +
 inst/rmd/h/navigation-1.1/tabsets.js               |   141 +
 inst/rmd/h/pagedtable-1.1/css/pagedtable.css       |   142 +
 inst/rmd/h/pagedtable-1.1/js/pagedtable.js         |  1151 ++
 inst/rmd/h/rmarkdown/rmd_loader.css                |    18 +
 inst/rmd/h/rmarkdown/rmd_loader.gif                |   Bin 0 -> 6820 bytes
 inst/rmd/h/rmarkdown/rmd_loader.js                 |    29 +
 inst/rmd/h/rmarkdown/rmd_perf.css                  |    21 +
 inst/rmd/h/rmarkdown/rmd_perf.js                   |    64 +
 inst/rmd/h/rsiframe-1.1/rsiframe.js                |   148 +
 inst/rmd/h/tocify-1.9.1/jquery.tocify.css          |    80 +
 inst/rmd/h/tocify-1.9.1/jquery.tocify.js           |  1002 ++
 inst/rmd/ioslides/default.html                     |   181 +
 .../ioslides/ioslides-13.5.1/fonts/OpenSans.ttf    |   Bin 0 -> 36492 bytes
 .../ioslides-13.5.1/fonts/OpenSansItalic.ttf       |   Bin 0 -> 34416 bytes
 .../ioslides-13.5.1/fonts/OpenSansSemibold.ttf     |   Bin 0 -> 37568 bytes
 .../fonts/OpenSansSemiboldItalic.ttf               |   Bin 0 -> 34652 bytes
 .../ioslides-13.5.1/fonts/SourceCodePro.ttf        |   Bin 0 -> 42380 bytes
 inst/rmd/ioslides/ioslides-13.5.1/fonts/fonts.css  |    30 +
 .../images/google_developers_icon_128.png          |   Bin 0 -> 4316 bytes
 inst/rmd/ioslides/ioslides-13.5.1/js/hammer.js     |   586 +
 .../ioslides-13.5.1/js/modernizr.custom.45394.js   |     4 +
 inst/rmd/ioslides/ioslides-13.5.1/js/order.js      |     8 +
 .../ioslides-13.5.1/js/polyfills/classList.min.js  |     2 +
 .../ioslides-13.5.1/js/polyfills/dataset.min.js    |     2 +
 .../ioslides-13.5.1/js/polyfills/history.min.js    |     1 +
 .../ioslides/ioslides-13.5.1/js/prettify/lang-r.js |    57 +
 .../ioslides-13.5.1/js/prettify/lang-tex.js        |     1 +
 .../ioslides-13.5.1/js/prettify/lang-yaml.js       |     2 +
 .../ioslides-13.5.1/js/prettify/prettify.css       |     1 +
 .../ioslides-13.5.1/js/prettify/prettify.js        |    28 +
 .../ioslides-13.5.1/js/require-1.0.8.min.js        |    33 +
 .../ioslides-13.5.1/js/slide-controller.js         |   122 +
 inst/rmd/ioslides/ioslides-13.5.1/js/slide-deck.js |   809 ++
 .../ioslides/ioslides-13.5.1/theme/css/default.css |  1514 ++
 .../ioslides/ioslides-13.5.1/theme/css/phone.css   |     6 +
 inst/rmd/ioslides/ioslides_presentation.lua        |   520 +
 inst/rmd/latex/default-1.14.tex                    |   244 +
 inst/rmd/latex/default-1.15.2.tex                  |   285 +
 inst/rmd/latex/default-1.17.0.2.tex                |   290 +
 inst/rmd/latex/default.tex                         |   235 +
 inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.gif |   Bin 0 -> 161 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.png |   Bin 0 -> 2905 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet-fold.gif     |   Bin 0 -> 163 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet-fold.png     |   Bin 0 -> 2901 bytes
 .../slidy/Slidy2/graphics/bullet-nofold-dim.gif    |   Bin 0 -> 142 bytes
 .../slidy/Slidy2/graphics/bullet-nofold-dim.png    |   Bin 0 -> 2892 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet-nofold.gif   |   Bin 0 -> 157 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet-nofold.png   |   Bin 0 -> 2888 bytes
 .../slidy/Slidy2/graphics/bullet-unfold-dim.gif    |   Bin 0 -> 166 bytes
 .../slidy/Slidy2/graphics/bullet-unfold-dim.png    |   Bin 0 -> 2913 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet-unfold.gif   |   Bin 0 -> 163 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet-unfold.png   |   Bin 0 -> 2909 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet.gif          |   Bin 0 -> 86 bytes
 inst/rmd/slidy/Slidy2/graphics/bullet.png          |   Bin 0 -> 167 bytes
 inst/rmd/slidy/Slidy2/graphics/example.png         |   Bin 0 -> 6652 bytes
 inst/rmd/slidy/Slidy2/graphics/example.svg         |   223 +
 inst/rmd/slidy/Slidy2/graphics/face1.gif           |   Bin 0 -> 5279 bytes
 inst/rmd/slidy/Slidy2/graphics/face2.gif           |   Bin 0 -> 2378 bytes
 inst/rmd/slidy/Slidy2/graphics/face3.gif           |   Bin 0 -> 800 bytes
 inst/rmd/slidy/Slidy2/graphics/face4.gif           |   Bin 0 -> 846 bytes
 inst/rmd/slidy/Slidy2/graphics/fold-bright.gif     |   Bin 0 -> 145 bytes
 inst/rmd/slidy/Slidy2/graphics/fold-dim.bmp        |   Bin 0 -> 306 bytes
 inst/rmd/slidy/Slidy2/graphics/fold-dim.gif        |   Bin 0 -> 56 bytes
 inst/rmd/slidy/Slidy2/graphics/fold.bmp            |   Bin 0 -> 306 bytes
 inst/rmd/slidy/Slidy2/graphics/fold.gif            |   Bin 0 -> 56 bytes
 inst/rmd/slidy/Slidy2/graphics/icon-blue.png       |   Bin 0 -> 204 bytes
 inst/rmd/slidy/Slidy2/graphics/keys2.jpg           |   Bin 0 -> 42807 bytes
 inst/rmd/slidy/Slidy2/graphics/nofold-dim.bmp      |   Bin 0 -> 306 bytes
 inst/rmd/slidy/Slidy2/graphics/nofold-dim.gif      |   Bin 0 -> 48 bytes
 inst/rmd/slidy/Slidy2/graphics/nofold.bmp          |   Bin 0 -> 306 bytes
 inst/rmd/slidy/Slidy2/graphics/unfold-bright.gif   |   Bin 0 -> 170 bytes
 inst/rmd/slidy/Slidy2/graphics/unfold-dim.bmp      |   Bin 0 -> 306 bytes
 inst/rmd/slidy/Slidy2/graphics/unfold-dim.gif      |   Bin 0 -> 59 bytes
 inst/rmd/slidy/Slidy2/graphics/unfold.bmp          |   Bin 0 -> 306 bytes
 inst/rmd/slidy/Slidy2/graphics/unfold.gif          |   Bin 0 -> 59 bytes
 inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.gif   |   Bin 0 -> 1791 bytes
 inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.svg   |    14 +
 .../rmd/slidy/Slidy2/graphics/w3c-logo-slanted.jpg |   Bin 0 -> 26539 bytes
 inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.gif  |   Bin 0 -> 793 bytes
 inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.svg  |    14 +
 inst/rmd/slidy/Slidy2/scripts/img.srcset.js        |   153 +
 inst/rmd/slidy/Slidy2/scripts/slidy-irc.js         |    49 +
 inst/rmd/slidy/Slidy2/scripts/slidy.js             |  3079 ++++
 inst/rmd/slidy/Slidy2/scripts/slidy.js.gz          |   Bin 0 -> 13240 bytes
 inst/rmd/slidy/Slidy2/styles/slidy.css             |   436 +
 inst/rmd/slidy/Slidy2/styles/w3c-blue.css          |   497 +
 inst/rmd/slidy/default.html                        |    75 +
 man/all_output_formats.Rd                          |    26 +
 man/beamer_presentation.Rd                         |   125 +
 man/compile_notebook.Rd                            |    60 +
 man/default_output_format.Rd                       |    29 +
 man/draft.Rd                                       |    77 +
 man/find_external_resources.Rd                     |    65 +
 man/github_document.Rd                             |    54 +
 man/html-dependencies.Rd                           |    42 +
 man/html_document.Rd                               |   245 +
 man/html_document_base.Rd                          |    63 +
 man/html_fragment.Rd                               |    78 +
 man/html_notebook.Rd                               |    97 +
 man/html_notebook_metadata.Rd                      |    16 +
 man/html_notebook_output.Rd                        |    52 +
 man/html_vignette.Rd                               |    64 +
 man/includes.Rd                                    |    47 +
 man/ioslides_presentation.Rd                       |   402 +
 man/knit_params_ask.Rd                             |    29 +
 man/knitr_options.Rd                               |    35 +
 man/knitr_options_html.Rd                          |    34 +
 man/knitr_options_pdf.Rd                           |    28 +
 man/latex_dependency.Rd                            |    16 +
 man/md_document.Rd                                 |    88 +
 man/metadata.Rd                                    |    18 +
 man/navbar_html.Rd                                 |    24 +
 man/odt_document.Rd                                |    72 +
 man/output_format.Rd                               |    87 +
 man/paged_table.Rd                                 |    14 +
 man/pandoc_args.Rd                                 |    77 +
 man/pandoc_available.Rd                            |    46 +
 man/pandoc_convert.Rd                              |    59 +
 man/pandoc_options.Rd                              |    43 +
 man/pandoc_path_arg.Rd                             |    24 +
 man/pandoc_self_contained_html.Rd                  |    20 +
 man/pandoc_template.Rd                             |    25 +
 man/parse_html_notebook.Rd                         |    22 +
 man/pdf_document.Rd                                |   147 +
 man/relative_to.Rd                                 |    22 +
 man/render.Rd                                      |   165 +
 man/render_delayed.Rd                              |    51 +
 man/render_site.Rd                                 |   139 +
 man/render_supporting_files.Rd                     |    23 +
 man/resolve_output_format.Rd                       |    33 +
 man/rmarkdown-package.Rd                           |    43 +
 man/rmarkdown_format.Rd                            |    47 +
 man/rmd_metadata.Rd                                |    32 +
 man/rtf_document.Rd                                |    58 +
 man/run.Rd                                         |    87 +
 man/shiny_prerendered_chunk.Rd                     |    20 +
 man/shiny_prerendered_clean.Rd                     |    15 +
 man/shiny_prerendered_server_start_code.Rd         |    15 +
 man/slidy_presentation.Rd                          |   135 +
 man/tufte_handout.Rd                               |    43 +
 man/word_document.Rd                               |    86 +
 man/yaml_front_matter.Rd                           |    17 +
 tests/shiny/01-basic-input.Rmd                     |    17 +
 tests/shiny/02-data-table.Rmd                      |    30 +
 tests/shiny/03-rm-all.Rmd                          |    28 +
 tests/shiny/04-prerendered-envir.Rmd               |    14 +
 tests/testthat.R                                   |     3 +
 tests/testthat/resources/csvs/csv1.csv             |     0
 tests/testthat/resources/csvs/csv2.csv             |     0
 tests/testthat/resources/csvs/other/csv3.csv       |     0
 tests/testthat/resources/directory-refs.Rmd        |    13 +
 tests/testthat/resources/empty.Rmd                 |     3 +
 tests/testthat/resources/empty.bib                 |     0
 tests/testthat/resources/empty.csl                 |     9 +
 tests/testthat/resources/empty.css                 |     3 +
 tests/testthat/resources/empty.csv                 |     3 +
 tests/testthat/resources/empty.html                |     3 +
 tests/testthat/resources/empty.jpg                 |   Bin 0 -> 539 bytes
 tests/testthat/resources/empty.js                  |     3 +
 tests/testthat/resources/empty.md                  |     3 +
 tests/testthat/resources/empty.png                 |   Bin 0 -> 150 bytes
 tests/testthat/resources/empty.tsv                 |     3 +
 tests/testthat/resources/empty/empty.csv           |     0
 tests/testthat/resources/file-exists.Rmd           |     6 +
 tests/testthat/resources/has-css.Rmd               |     7 +
 tests/testthat/resources/has-image.css             |     6 +
 tests/testthat/resources/html.html                 |    10 +
 tests/testthat/resources/markdown.md               |    17 +
 tests/testthat/resources/nonempty/empty.csv        |     3 +
 tests/testthat/resources/nonempty/empty.jpg        |   Bin 0 -> 539 bytes
 tests/testthat/resources/pdf.Rmd                   |     8 +
 tests/testthat/resources/period.Rmd                |    10 +
 tests/testthat/resources/quotes.Rmd                |    14 +
 tests/testthat/resources/r-notebook.Rmd            |    36 +
 tests/testthat/resources/readcsv-source.R          |     2 +
 tests/testthat/resources/readcsv.R                 |     2 +
 tests/testthat/resources/readcsv.Rmd               |     5 +
 tests/testthat/resources/resource-files.Rmd        |    12 +
 tests/testthat/resources/rmarkdown.Rmd             |    37 +
 tests/testthat/resources/tinyplot.png              |   Bin 0 -> 8174 bytes
 tests/testthat/site/PageA.Rmd                      |    27 +
 tests/testthat/site/PageB.rmd                      |    21 +
 tests/testthat/site/PageC.md                       |    17 +
 tests/testthat/site/_site.yml                      |    23 +
 tests/testthat/site/docs.txt                       |     0
 tests/testthat/site/index.Rmd                      |    21 +
 tests/testthat/site/script.R                       |     0
 tests/testthat/site/styles.css                     |     4 +
 tests/testthat/test-dependencies.R                 |   157 +
 tests/testthat/test-encode-decode.R                |     8 +
 tests/testthat/test-formats.R                      |    79 +
 tests/testthat/test-formats.Rmd                    |    32 +
 tests/testthat/test-htmlparse.R                    |    78 +
 tests/testthat/test-ioslides.R                     |   185 +
 tests/testthat/test-notebook.R                     |   109 +
 tests/testthat/test-params.R                       |    90 +
 tests/testthat/test-resources.R                    |   214 +
 tests/testthat/test-site.R                         |    35 +
 339 files changed, 62947 insertions(+)

diff --git a/DESCRIPTION b/DESCRIPTION
new file mode 100644
index 0000000..ee82ae9
--- /dev/null
+++ b/DESCRIPTION
@@ -0,0 +1,108 @@
+Package: rmarkdown
+Type: Package
+Title: Dynamic Documents for R
+Version: 1.8
+Authors at R: c(
+  person("JJ", "Allaire", role = "aut", email = "jj at rstudio.com"),
+  person("Yihui", "Xie", role = c("aut", "cre"), email = "xie at yihui.name", comment = c(ORCID = "0000-0003-0645-5666")),
+  person("Jonathan", "McPherson", role = "aut", email = "jonathan at rstudio.com"),
+  person("Javier", "Luraschi", role = "aut", email = "javier at rstudio.com"),
+  person("Kevin", "Ushey", role = "aut", email = "kevin at rstudio.com"),
+  person("Aron", "Atkins", role = "aut", email = "aron at rstudio.com"),
+  person("Hadley", "Wickham", role = "aut", email = "hadley at rstudio.com"),
+  person("Joe", "Cheng", role = "aut", email = "joe at rstudio.com"),
+  person("Winston", "Chang", role = "aut", email = "winston at rstudio.com"),
+  person("Jeff", "Allen", role = "ctb", email = "jeff at rstudio.com"),
+  person("Roy", "Storey", role = "ctb"),
+  person("Rob", "Hyndman", role = "ctb", email = "Rob.Hyndman at monash.edu"),
+  person("Ruben", "Arslan", role = "ctb", email = "ruben.arslan at uni-goettingen.de"),
+  person(family = "RStudio, Inc.", role = "cph"),
+  person(family = "jQuery Foundation", role = "cph",
+         comment = "jQuery library"),
+  person(family = "jQuery contributors", role = c("ctb", "cph"),
+         comment = "jQuery library; authors listed in inst/rmd/h/jquery-AUTHORS.txt"),
+  person(family = "jQuery UI contributors", role = c("ctb", "cph"),
+         comment = "jQuery UI library; authors listed in inst/rmd/h/jqueryui-AUTHORS.txt"),
+  person("Mark", "Otto", role = "ctb",
+         comment = "Bootstrap library"),
+  person("Jacob", "Thornton", role = "ctb",
+         comment = "Bootstrap library"),
+  person(family = "Bootstrap contributors", role = "ctb",
+         comment = "Bootstrap library"),
+  person(family = "Twitter, Inc", role = "cph",
+         comment = "Bootstrap library"),
+  person("Alexander", "Farkas", role = c("ctb", "cph"),
+         comment = "html5shiv library"),
+  person("Scott", "Jehl", role = c("ctb", "cph"),
+         comment = "Respond.js library"),
+  person("Ivan", "Sagalaev", role = c("ctb", "cph"),
+         comment = "highlight.js library"),
+  person("Greg", "Franko", role = c("ctb", "cph"),
+         comment = "tocify library"),
+  person("John", "MacFarlane", role = c("ctb", "cph"),
+         comment = "Pandoc templates"),
+  person(family = "Google, Inc.", role = c("ctb", "cph"),
+         comment = "ioslides library"),
+  person("Dave", "Raggett", role = "ctb",
+         comment = "slidy library"),
+  person(family = "W3C", role = "cph",
+         comment = "slidy library"),
+  person("Dave", "Gandy", role = c("ctb", "cph"),
+         comment = "Font-Awesome"),
+  person("Ben", "Sperry", role = "ctb",
+         comment = "Ionicons"),
+  person(family = "Drifty", role = "cph",
+         comment = "Ionicons"),
+  person("Aidan", "Lister", role = c("ctb", "cph"), 
+         comment = "jQuery StickyTabs")
+  )
+Maintainer: Yihui Xie <xie at yihui.name>
+Description: Convert R Markdown documents into a variety of formats.
+Depends: R (>= 3.0)
+Imports: tools, utils, knitr (>= 1.14), yaml (>= 2.1.5), htmltools (>=
+        0.3.5), evaluate (>= 0.8), base64enc, jsonlite, rprojroot,
+        mime, methods, stringr (>= 1.2.0)
+Suggests: shiny (>= 0.11), tufte, testthat, digest, tibble
+SystemRequirements: pandoc (>= 1.12.3) - http://pandoc.org
+URL: http://rmarkdown.rstudio.com
+License: GPL-3
+RoxygenNote: 6.0.1
+NeedsCompilation: no
+Packaged: 2017-11-17 04:07:06 UTC; yihui
+Author: JJ Allaire [aut],
+  Yihui Xie [aut, cre] (0000-0003-0645-5666),
+  Jonathan McPherson [aut],
+  Javier Luraschi [aut],
+  Kevin Ushey [aut],
+  Aron Atkins [aut],
+  Hadley Wickham [aut],
+  Joe Cheng [aut],
+  Winston Chang [aut],
+  Jeff Allen [ctb],
+  Roy Storey [ctb],
+  Rob Hyndman [ctb],
+  Ruben Arslan [ctb],
+  RStudio, Inc. [cph],
+  jQuery Foundation [cph] (jQuery library),
+  jQuery contributors [ctb, cph] (jQuery library; authors listed in
+    inst/rmd/h/jquery-AUTHORS.txt),
+  jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in
+    inst/rmd/h/jqueryui-AUTHORS.txt),
+  Mark Otto [ctb] (Bootstrap library),
+  Jacob Thornton [ctb] (Bootstrap library),
+  Bootstrap contributors [ctb] (Bootstrap library),
+  Twitter, Inc [cph] (Bootstrap library),
+  Alexander Farkas [ctb, cph] (html5shiv library),
+  Scott Jehl [ctb, cph] (Respond.js library),
+  Ivan Sagalaev [ctb, cph] (highlight.js library),
+  Greg Franko [ctb, cph] (tocify library),
+  John MacFarlane [ctb, cph] (Pandoc templates),
+  Google, Inc. [ctb, cph] (ioslides library),
+  Dave Raggett [ctb] (slidy library),
+  W3C [cph] (slidy library),
+  Dave Gandy [ctb, cph] (Font-Awesome),
+  Ben Sperry [ctb] (Ionicons),
+  Drifty [cph] (Ionicons),
+  Aidan Lister [ctb, cph] (jQuery StickyTabs)
+Repository: CRAN
+Date/Publication: 2017-11-17 08:35:18 UTC
diff --git a/MD5 b/MD5
new file mode 100644
index 0000000..73bb5cb
--- /dev/null
+++ b/MD5
@@ -0,0 +1,338 @@
+c7f12bc481314b2be950fc953813a9e7 *DESCRIPTION
+c6b57a7c453d3e655a6f9a91e7caffde *NAMESPACE
+55c72c080e59135f464e368c7708c818 *R/base64.R
+6163775035ac1b46965ae619a1b64331 *R/beamer_presentation.R
+d7d5a45f1f89b448d86e6dc65de7c5ef *R/draft.R
+aa3d7f7a9a9a77bbcf758f9fb61ffc3f *R/github_document.R
+57dd23ee1dd074be293308366dc5b8df *R/html_dependencies.R
+f171d2d2212f1e3f948150e5f0f51ac3 *R/html_document.R
+b49460dbb25226fbbf5c81c33e12cf73 *R/html_document_base.R
+67bac8e857852b0264cb37c3924d4154 *R/html_extras.R
+6718e2bfea2f66273e4539ae3ccfe640 *R/html_fragment.R
+0da2d5e02f1ab486682d340d616bb9f9 *R/html_notebook.R
+4f772bc9e2ea514144894c41f8037b34 *R/html_notebook_output.R
+65b3c52d61eb42f6c418733af3e7b0c0 *R/html_paged.R
+22f03c250f0bb80e0f41938bcea0d3d5 *R/html_parser.R
+26a49c766e532319c213e1cc5b277d60 *R/html_resource_copy.R
+4bf25b5719b3fb93e24cd79a53769b42 *R/html_resources.R
+d224261d65b6d3f360f7f1e54b1902ba *R/html_vignette.R
+f0495ab0df7e10fdaf2378c5c493a00f *R/includes.R
+7ec1a23042e4e9070cb2b3a9f4f7d477 *R/ioslides_presentation.R
+640bc07dfa77c859231aa0c879e04c4f *R/knit_print.R
+499b914dc030ac4d4452393e9361c215 *R/latex_dependencies.R
+36d1d8edabcabd992f3a21c7e0d3f362 *R/list_builder.R
+569bd86dbe249296202e147fe6f0b198 *R/md_document.R
+d8a5ad369fc1fbdb647051513387c948 *R/odt_document.R
+061bba6ffb0974267b605cc3ba6a1cb5 *R/output_format.R
+1df20a22f91d85d9d350fb0f1f24cbc9 *R/pandoc.R
+63761b0fa495ebab1a7a59a02b8d0ce9 *R/params.R
+4512772996654ab4d2a5388a08a36375 *R/pdf_document.R
+52c5b4cfc58698e5125d62ed68d741d7 *R/performance.R
+a853b76e7dbae077be3ba48dbe2fce18 *R/relative_to.R
+b5e6017afb4f3d445511900831806561 *R/render.R
+8cbf93cfa5003b0132c4ccccfa9b7aaf *R/render_html.R
+081c7004ee53031432d2727e6d65d3ba *R/render_site.R
+48e34d64e00d49a434857146735cd6f2 *R/rtf_document.R
+88c2f374cc791a0fee144d278c4ce487 *R/shiny.R
+d41d8cd98f00b204e9800998ecf8427e *R/shiny_module.R
+02de39b97c0c3e0e09a0f1a44ba0b4d6 *R/shiny_prerendered.R
+239aba0ab334a733679c84f2934e85eb *R/slidy_presentation.R
+6877020019b49c4e292d0cb49a563692 *R/stack.R
+2c272d7fdc2007e2e4f2fb88206a84a7 *R/tufte_handout.R
+ecbe083345e2997a98aa1c864b528f9c *R/util.R
+f6591a4161904723d7f4cf2ac1d5f381 *R/word_document.R
+58ab4f92fc4b737ae91abe3adbef59ce *R/zzz.R
+b550b2c6aa8b6547482dc99e87039d94 *inst/COPYING
+0ddb0e780cf41758284112f91f17d065 *inst/NEWS
+59a0b73ba11a11a27ef15b768cc63169 *inst/NOTICE
+060510a734931c689db9e98a5db7999a *inst/rmarkdown/templates/github_document/resources/default.md
+c26fdeae4ba88184addba460eba0719a *inst/rmarkdown/templates/github_document/resources/github.css
+54fd05129dc83b9aa074062ef81c2a9f *inst/rmarkdown/templates/github_document/resources/preview.html
+6c933733ac200cf5659ce68596361cb7 *inst/rmarkdown/templates/github_document/skeleton/skeleton.Rmd
+17561f00e810bf8661c238674614c86d *inst/rmarkdown/templates/github_document/template.yaml
+2246172d518c725290a708911fabc5af *inst/rmarkdown/templates/html_vignette/resources/vignette.css
+1cb7f8246ba1e086a8c1d8cae8c44015 *inst/rmarkdown/templates/html_vignette/skeleton/skeleton.Rmd
+24adf7aba300f81cf89440d07c795868 *inst/rmarkdown/templates/html_vignette/template.yaml
+bd6b2bda2044a762bd719067e2cccbec *inst/rmd/fragment/default.html
+19d105294c1d422922753638097d1975 *inst/rmd/fragment/default.tex
+98415569827375ef1835f5c914cd887a *inst/rmd/h/_navbar.html
+659231dde1c53bd14bbcffa1456df892 *inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css
+ca7ee393ea214c018d316eee3acc7f39 *inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css.map
+bf3499da1c31113720e9e395691730ba *inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.min.css
+4f159defb2641645834d0138a185a0e5 *inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css
+ea1c5719baebc520c82606bf36408d4d *inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css.map
+aa3db69dbd9b05d8dfd439d464d02969 *inst/rmd/h/bootstrap-3.3.5/css/bootstrap.min.css
+1d2c43758806d7f185143edbdb17e7e0 *inst/rmd/h/bootstrap-3.3.5/css/cerulean.min.css
+0ec01aa9d795cf2def140724344d668e *inst/rmd/h/bootstrap-3.3.5/css/cosmo.min.css
+04d98cd29a49176152a183ba608020f2 *inst/rmd/h/bootstrap-3.3.5/css/flatly.min.css
+c45152a20fcaa8ae5d5611e947399dcc *inst/rmd/h/bootstrap-3.3.5/css/fonts/Lato.ttf
+a30435e0c5edc583b1f3552e48068e69 *inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoBold.ttf
+4ffd11cfd26127dbd8c716fddeffa1e0 *inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoItalic.ttf
+9e3bb4acbffda54ebe710e081be3626d *inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycle.ttf
+d754ba196153cfeef847cf2a68b68a0a *inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycleBold.ttf
+56edff6cd9c40bf507851c7af6d724ba *inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSans.ttf
+68b46e7ec5ff26f8c5948686ef0795e9 *inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansBold.ttf
+5e1cdd683bb56d6e69d5338e1c33dd79 *inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansBoldItalic.ttf
+9e5e2bc48802a75eb9f0d954f3d4e45b *inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansItalic.ttf
+a957943fff1355620393d35cb3d6c7d1 *inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansLight.ttf
+147ab98830dc2ba625dfcab85ca069dd *inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansLightItalic.ttf
+f1f45bc019ec18a7705714b3478e6b1d *inst/rmd/h/bootstrap-3.3.5/css/fonts/Raleway.ttf
+9adbc922343f1b4b4b62b8bf85225e2c *inst/rmd/h/bootstrap-3.3.5/css/fonts/RalewayBold.ttf
+38861cba61c66739c1452c3a71e39852 *inst/rmd/h/bootstrap-3.3.5/css/fonts/Roboto.ttf
+ad97d029a11d8b39692037e753d23d1f *inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoBold.ttf
+634f53eb79efa455a9e9d85d608b3447 *inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoLight.ttf
+88f29ea5a372d06f521395134f62ab91 *inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoMedium.ttf
+f2d83436dcf3f53375518292e917643c *inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansPro.ttf
+206f41ff7cdb7df5dbfeda33c847b793 *inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProBold.ttf
+b5a02317c3d2de0275cfd1efef086f6f *inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProItalic.ttf
+6a9d4d28a117a8364376de2f17ee5ff9 *inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProLight.ttf
+725b5e2f8b7e0bfac66edad5c2291b86 *inst/rmd/h/bootstrap-3.3.5/css/fonts/Ubuntu.ttf
+301b69d57caada69fa1091c07a3da5ed *inst/rmd/h/bootstrap-3.3.5/css/journal.min.css
+cc8777d594a028bcd9d2b5181f445a2f *inst/rmd/h/bootstrap-3.3.5/css/lumen.min.css
+82ed16ec394450ee8165044db775d810 *inst/rmd/h/bootstrap-3.3.5/css/paper.min.css
+5a3dd680e4bc9fecfbe73b6fb6053df2 *inst/rmd/h/bootstrap-3.3.5/css/readable.min.css
+bd322f2bb56fd796f9b25a4d8143e32a *inst/rmd/h/bootstrap-3.3.5/css/sandstone.min.css
+4e852706d1a055001b1b261bb278f1c3 *inst/rmd/h/bootstrap-3.3.5/css/simplex.min.css
+fdc6659ea67a4f2eb3c2ea705fa7638e *inst/rmd/h/bootstrap-3.3.5/css/spacelab.min.css
+5481733846a5b753f5968693089b4130 *inst/rmd/h/bootstrap-3.3.5/css/united.min.css
+1f4bfa38bc583e334ba1a749fd6e0d23 *inst/rmd/h/bootstrap-3.3.5/css/yeti.min.css
+f4769f9bdb7466be65088239c12046d1 *inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.eot
+89889688147bd7575d6327160d64e760 *inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.svg
+e18bbf611f2a2e43afc071aa2f4e1512 *inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.ttf
+fa2772327f55d8198301fdb8bcfc8158 *inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff
+448c34a56d699c29117adc64c43affeb *inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff2
+8015042d0b4ac125867af5b096b175ce *inst/rmd/h/bootstrap-3.3.5/js/bootstrap.js
+4becdc9104623e891fbb9d38bba01be4 *inst/rmd/h/bootstrap-3.3.5/js/bootstrap.min.js
+ccb7f3909e30b1eb8f65a24393c6e12b *inst/rmd/h/bootstrap-3.3.5/js/npm.js
+ae8fceae0e07d55b5cfaa9af6bc43a6d *inst/rmd/h/bootstrap-3.3.5/shim/html5shiv.min.js
+506fe393e9f296d14b63733c0aff6205 *inst/rmd/h/bootstrap-3.3.5/shim/respond.min.js
+9ccd3d4ac87d8d329249398cc247ec61 *inst/rmd/h/default.html
+a96bc579d5acb24e05a75b20b5f2e1aa *inst/rmd/h/font-awesome-4.5.0/css/font-awesome.css
+e02ecc5a7f94de10240bee0bae6fa865 *inst/rmd/h/font-awesome-4.5.0/css/font-awesome.min.css
+a3de2170e4e9df77161ea5d3f31b2668 *inst/rmd/h/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf
+6dbd2fae386badeb491287fa2393c988 *inst/rmd/h/highlightjs/default.css
+810ac820fbe3db99ed70600fc80e6f2f *inst/rmd/h/highlightjs/highlight.js
+777aa1e5c865776dcc39c2edd9502661 *inst/rmd/h/highlightjs/textmate.css
+11c960a3f0bc008428616bffe574b258 *inst/rmd/h/ionicons-2.0.1/LICENSE
+200d4ef57f77711113679efa655f42aa *inst/rmd/h/ionicons-2.0.1/css/ionicons.css
+e1de926b1fb1c249103f8e123ed7fef0 *inst/rmd/h/ionicons-2.0.1/css/ionicons.min.css
+24712f6c47821394fba7942fbb52c3b2 *inst/rmd/h/ionicons-2.0.1/fonts/ionicons.ttf
+895323ed2f7258af4fae2c738c8aea49 *inst/rmd/h/jquery-1.11.3/jquery.min.js
+12b40fddbb08ec43e278e7d8a0ab5543 *inst/rmd/h/jquery-AUTHORS.txt
+209ed8e314e0e913f7d2eb5c9e5ec785 *inst/rmd/h/jqueryui-1.11.4/README
+d80747d34afb87753b51d45a36f8bd17 *inst/rmd/h/jqueryui-1.11.4/images/ui-icons_444444_256x240.png
+1e70a2d46244ee4070fd47152bd71db1 *inst/rmd/h/jqueryui-1.11.4/images/ui-icons_555555_256x240.png
+eb4a975c630f379279fe78c604d0b36c *inst/rmd/h/jqueryui-1.11.4/images/ui-icons_777620_256x240.png
+68855e6e3d288ab126a1f1dd82b64e26 *inst/rmd/h/jqueryui-1.11.4/images/ui-icons_777777_256x240.png
+7c81a6253b77a9fdaf51bb1038f8c840 *inst/rmd/h/jqueryui-1.11.4/images/ui-icons_cc0000_256x240.png
+41612b0f4a034424f8321c9f824a94da *inst/rmd/h/jqueryui-1.11.4/images/ui-icons_ffffff_256x240.png
+35c5b4c500d766e04a9b3a7b05701b2e *inst/rmd/h/jqueryui-1.11.4/index.html
+a14ebdbb782f62a97b0bfc1d0749e138 *inst/rmd/h/jqueryui-1.11.4/jquery-ui.css
+4156bf51d2d5144087fd8766e433a3d8 *inst/rmd/h/jqueryui-1.11.4/jquery-ui.js
+a0fd52784e4da798e7d6a4b52e991db1 *inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.css
+991c88f48d11ebce6828a6b2be17dad2 *inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.js
+c762a2f34b42e912713542ebdc16ba4b *inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.css
+c68383f6186ce6de68fdb44abdfdebce *inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.min.css
+f05390e630b6c940d8d86c65596f62f5 *inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.css
+d3ea6df653da3d8ac16cc34452214d52 *inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.min.css
+3885a63530f03a7e562164f52fd18b58 *inst/rmd/h/jqueryui-AUTHORS.txt
+795f65a1c60e18803e968d419877c6c8 *inst/rmd/h/navigation-1.1/codefolding.js
+a1a9d728fbf33ed607aa465e6e8a42ba *inst/rmd/h/navigation-1.1/sourceembed.js
+3838523138b4d71acb5ea1c5c45ecc00 *inst/rmd/h/navigation-1.1/tabsets.js
+8a728416d2c85663b6d23fa6b5f88a96 *inst/rmd/h/pagedtable-1.1/css/pagedtable.css
+8b657fbd2add193c16394a3f8339d3cf *inst/rmd/h/pagedtable-1.1/js/pagedtable.js
+01ea138fe0f8fd680d7a44f1c43d4f0e *inst/rmd/h/rmarkdown/rmd_loader.css
+a1c5ab2a04900fd9835b97055b0172a5 *inst/rmd/h/rmarkdown/rmd_loader.gif
+8097be8d86d420750b0ffce4166fd721 *inst/rmd/h/rmarkdown/rmd_loader.js
+f872de2d078e48d355b0d079549be4f3 *inst/rmd/h/rmarkdown/rmd_perf.css
+8c23c50c5b13afa7a731fe37d72f24b3 *inst/rmd/h/rmarkdown/rmd_perf.js
+c36c01dfc405cdf606969b46bb94642c *inst/rmd/h/rsiframe-1.1/rsiframe.js
+caa7b102e2a6b7726284a62fd8f32143 *inst/rmd/h/tocify-1.9.1/jquery.tocify.css
+a07b7eec33de9d8cf31d7e4883e0e77d *inst/rmd/h/tocify-1.9.1/jquery.tocify.js
+655c7684bad5ffc8d6b3c820c724287a *inst/rmd/ioslides/default.html
+27e96de4a343c0fa9d03e51d0d81f9b6 *inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSans.ttf
+a2e27c1441396c1802bea75caac30b8d *inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansItalic.ttf
+b803528fd83b293389dd58c6d70fff3c *inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansSemibold.ttf
+1174600d65ffe4a9d5f06842be690b8d *inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansSemiboldItalic.ttf
+dd12ba0e0f7054dad248945e03e784a5 *inst/rmd/ioslides/ioslides-13.5.1/fonts/SourceCodePro.ttf
+6c830b17741d80b2abcdca430f51c512 *inst/rmd/ioslides/ioslides-13.5.1/fonts/fonts.css
+05688da750d8686b322620b02dafb31e *inst/rmd/ioslides/ioslides-13.5.1/images/google_developers_icon_128.png
+b73d07e9635ed987a3bca8dc135998f1 *inst/rmd/ioslides/ioslides-13.5.1/js/hammer.js
+d1de2ffcc8324468813319b2cc02f0a0 *inst/rmd/ioslides/ioslides-13.5.1/js/modernizr.custom.45394.js
+32b1e7af128090950364e378afea4e54 *inst/rmd/ioslides/ioslides-13.5.1/js/order.js
+fddb024a3e9cebd818e741a96fd7a52a *inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/classList.min.js
+a8fc49c6134b4f347299a54c876e255d *inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/dataset.min.js
+23af0170640a0895ea629c1279a71785 *inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/history.min.js
+b81b168454da749af1382ce79365d260 *inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-r.js
+cc32652924e7e4988d3f222578a1e301 *inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-tex.js
+e0367f932b3ea37ef511ecb4d1d236e1 *inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-yaml.js
+ecd4a5d6c0cbee10b168f6aa000c64ea *inst/rmd/ioslides/ioslides-13.5.1/js/prettify/prettify.css
+709bfcc456c694bfe8ee86d184a1c360 *inst/rmd/ioslides/ioslides-13.5.1/js/prettify/prettify.js
+67dc464f2b428dca72ed0c2fb6c12846 *inst/rmd/ioslides/ioslides-13.5.1/js/require-1.0.8.min.js
+72dd6aaf10c2ab49470eb5957d740e1f *inst/rmd/ioslides/ioslides-13.5.1/js/slide-controller.js
+22bc9c6077f211be450e3abf7437427a *inst/rmd/ioslides/ioslides-13.5.1/js/slide-deck.js
+abde897cd05efbe30e23ac486d08a3fd *inst/rmd/ioslides/ioslides-13.5.1/theme/css/default.css
+9d8eee8a213e6589266351635302b187 *inst/rmd/ioslides/ioslides-13.5.1/theme/css/phone.css
+807561157169e24ffc4ad7246f70fb0e *inst/rmd/ioslides/ioslides_presentation.lua
+1e5598f4c0b0dc97d3c5c880a6cebac0 *inst/rmd/latex/default-1.14.tex
+e55622ca6e768691d60801d09153d42e *inst/rmd/latex/default-1.15.2.tex
+935d11eec7e5cba6b0f3d657e694cbc4 *inst/rmd/latex/default-1.17.0.2.tex
+d3b0e41b9fcc9737b5b67b67a1c9277d *inst/rmd/latex/default.tex
+8e0dcaacd3607c27c8e7fff78a7b6cc0 *inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.gif
+a02a2211d8aebfee2c8fc717bcb62813 *inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.png
+d1ed4a6feb15fa1da992bdab410f9d4e *inst/rmd/slidy/Slidy2/graphics/bullet-fold.gif
+ee568a5b49d27053329150cc9020a07f *inst/rmd/slidy/Slidy2/graphics/bullet-fold.png
+8f0af44ed2925e55467ba0af9fc65a86 *inst/rmd/slidy/Slidy2/graphics/bullet-nofold-dim.gif
+b1384d33b389cd91247c8e15170e5a45 *inst/rmd/slidy/Slidy2/graphics/bullet-nofold-dim.png
+bc4dd3f1a09306c1f60736d7a478e41e *inst/rmd/slidy/Slidy2/graphics/bullet-nofold.gif
+4bac81581c8c4618e931358274f9bb00 *inst/rmd/slidy/Slidy2/graphics/bullet-nofold.png
+69796a17a7cc63b93fda228a7174bcbd *inst/rmd/slidy/Slidy2/graphics/bullet-unfold-dim.gif
+fded489f43505b7edeac727715ffdb46 *inst/rmd/slidy/Slidy2/graphics/bullet-unfold-dim.png
+610a00c9e936678baeaf59154c35a2c2 *inst/rmd/slidy/Slidy2/graphics/bullet-unfold.gif
+254487b7bdde4040727d72884a5db377 *inst/rmd/slidy/Slidy2/graphics/bullet-unfold.png
+035449013a0b70438658af4a6ca4c25b *inst/rmd/slidy/Slidy2/graphics/bullet.gif
+0b034784cfbe415da4c078606b1d8786 *inst/rmd/slidy/Slidy2/graphics/bullet.png
+7c080679e0acc94d6302fa3a2989cad6 *inst/rmd/slidy/Slidy2/graphics/example.png
+66511fcd49af3580d9660d2cb4fb9cc8 *inst/rmd/slidy/Slidy2/graphics/example.svg
+76283465d94576434da26aaa783ed695 *inst/rmd/slidy/Slidy2/graphics/face1.gif
+614e96dd3ef512adeaa9e06f34bdd839 *inst/rmd/slidy/Slidy2/graphics/face2.gif
+ee36adc62b675778ef08327490531a17 *inst/rmd/slidy/Slidy2/graphics/face3.gif
+621cf7469236ca41918659da792d3005 *inst/rmd/slidy/Slidy2/graphics/face4.gif
+5cfb671361cd28318abe061e0c06839f *inst/rmd/slidy/Slidy2/graphics/fold-bright.gif
+b6c7a4267a72ae40c7edbb7c0285bc42 *inst/rmd/slidy/Slidy2/graphics/fold-dim.bmp
+bb3731f8aaa02c5891b1fc5640a1c5c7 *inst/rmd/slidy/Slidy2/graphics/fold-dim.gif
+aa4bac5a795f1a371facd99aebbabd92 *inst/rmd/slidy/Slidy2/graphics/fold.bmp
+67f3eddd4d08facff08be56e7482d508 *inst/rmd/slidy/Slidy2/graphics/fold.gif
+b7542eadabd7df10dcf01bd2fe7049b1 *inst/rmd/slidy/Slidy2/graphics/icon-blue.png
+2a062ee3d28a2c272b672f4c6510d4a0 *inst/rmd/slidy/Slidy2/graphics/keys2.jpg
+a1b37a6a4024d999370ac0560ae7cf9b *inst/rmd/slidy/Slidy2/graphics/nofold-dim.bmp
+ed5fbd797be549ba229a1f44e90dca43 *inst/rmd/slidy/Slidy2/graphics/nofold-dim.gif
+fd05516f11dce8b33dacfc64a4d2f9af *inst/rmd/slidy/Slidy2/graphics/nofold.bmp
+5d7d17f3a0dc89aa7394f2f6a146fad3 *inst/rmd/slidy/Slidy2/graphics/unfold-bright.gif
+5da71cd100b4d4135e63d15ae0ce95b1 *inst/rmd/slidy/Slidy2/graphics/unfold-dim.bmp
+b99c74e898c9969d91cf49125d066962 *inst/rmd/slidy/Slidy2/graphics/unfold-dim.gif
+d402a501d217b46895eabe4e1ce3d70e *inst/rmd/slidy/Slidy2/graphics/unfold.bmp
+73c35dabdc41113cf5984e581e9b5d43 *inst/rmd/slidy/Slidy2/graphics/unfold.gif
+1f4c0fb3393f6cd394b2c227a266e996 *inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.gif
+ea414bb886c358c2edcaf115450b7da2 *inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.svg
+3c5979621fdc83669d0be3592d9fa5b6 *inst/rmd/slidy/Slidy2/graphics/w3c-logo-slanted.jpg
+e338dfdd96afd07aa92fd05a4391c991 *inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.gif
+4ff6663ca827f5361eebe33e39e9f906 *inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.svg
+f9495604a9ab1fceb3166a0da568ce67 *inst/rmd/slidy/Slidy2/scripts/img.srcset.js
+e21f5d3dbffe0d0ea2f145dbeab2dc0b *inst/rmd/slidy/Slidy2/scripts/slidy-irc.js
+1ace3bc1228dd5c858fbbd117870b72e *inst/rmd/slidy/Slidy2/scripts/slidy.js
+6d48a98fa9d941c5e9f1735b2bf199c3 *inst/rmd/slidy/Slidy2/scripts/slidy.js.gz
+7f31790fc15e7f45b3ffbdbe5b98a3e1 *inst/rmd/slidy/Slidy2/styles/slidy.css
+65178a013ea4d6101126253e0fd0b1ad *inst/rmd/slidy/Slidy2/styles/w3c-blue.css
+482ca3d8b487a36c266dff07f1dd93b3 *inst/rmd/slidy/default.html
+2fd2d35c33782fbf2ffed14aba74f241 *man/all_output_formats.Rd
+46cc35692c45efbeff7bda666bb49b64 *man/beamer_presentation.Rd
+bcd490d571097e08a22c77b8da636eaf *man/compile_notebook.Rd
+594c9f86d5ebe342254fa776b852a431 *man/default_output_format.Rd
+41b177a41fa19664473e3732f6a9d79e *man/draft.Rd
+d5abe2e102ec2090318db542eba09fba *man/find_external_resources.Rd
+1a0fe2954faf4bdcec767f6976db4622 *man/github_document.Rd
+a02e73704f475e2eed79123bd1cb7915 *man/html-dependencies.Rd
+32f49b435e79b144c88d5255c1b23e33 *man/html_document.Rd
+5bb6ff5315bd51806f9f7f5bcc1b0d37 *man/html_document_base.Rd
+349dbbf9a4913869a36a04f44a62377d *man/html_fragment.Rd
+e44152f34b92a1d9f4bb775fbc0ae174 *man/html_notebook.Rd
+38bc611522c2a4dd41cf809a46c0953f *man/html_notebook_metadata.Rd
+ad7333cf870c7e1e32f2ed89ec2e1928 *man/html_notebook_output.Rd
+331df7e5ac2c4eb8c7a7727ff0ad5b9a *man/html_vignette.Rd
+c7e1d5baa810d7de5336829b06907b29 *man/includes.Rd
+0ae49644866aa84c1f0e669eb4630ef6 *man/ioslides_presentation.Rd
+ea43c2b22fa5970526551dfa39c7ddc8 *man/knit_params_ask.Rd
+965d1b502b6329cb574ebc18ec98e52e *man/knitr_options.Rd
+fc5a79b5b7c71dded14090be1066404d *man/knitr_options_html.Rd
+e28985134c8d0658b1299956bb3d2e1b *man/knitr_options_pdf.Rd
+be5342094e995a058dc825307e895c8f *man/latex_dependency.Rd
+62629c71cd184d37710e7c4a3418ddc8 *man/md_document.Rd
+eac777d20d18d53be3fd7f55b8a4fe6a *man/metadata.Rd
+8fcb6f55c2db21f56544d93699d1864f *man/navbar_html.Rd
+da4fb04e3fab6792d75d61cac912f554 *man/odt_document.Rd
+393b9521c8e94aeea0be4457b270955d *man/output_format.Rd
+449f032b7d84ce9f1d656c54ab905715 *man/paged_table.Rd
+0c8dd277376e084361f8f4a143df4a4b *man/pandoc_args.Rd
+9620370f3de2daf43a58e603f4a23161 *man/pandoc_available.Rd
+e79ceebbb47b82714c786769e435bc1b *man/pandoc_convert.Rd
+8c6805dd89a702faec5ebafd7036ed07 *man/pandoc_options.Rd
+869a69f084f66ecf943314223bc34c85 *man/pandoc_path_arg.Rd
+500ff729dfc1a8a56c71bc24aaffc15c *man/pandoc_self_contained_html.Rd
+57ee1daa56578712c08f9a3f93e4cbe2 *man/pandoc_template.Rd
+16e90335618b336a9929d40129313406 *man/parse_html_notebook.Rd
+36988e39be681a19bd10dd406e136b33 *man/pdf_document.Rd
+bbbb744c55f827076ff41421c9850e07 *man/relative_to.Rd
+117bc603d7c137fae632b136ea6de1da *man/render.Rd
+2534cac1818788d4ea6f1a45ae3490ba *man/render_delayed.Rd
+cc92cd00c57416f3a0feb1e20417bf9e *man/render_site.Rd
+30c72f81ac19f52b941219f822b836d5 *man/render_supporting_files.Rd
+78ed2b7e10186d4ce4a99f15e0c48dd3 *man/resolve_output_format.Rd
+cab04fac3bddc2e83411c534afd41bc5 *man/rmarkdown-package.Rd
+8d90a8662aa3d36ae1130fbb59ab39ce *man/rmarkdown_format.Rd
+45185ad8f2c7016229a6e803b8de920c *man/rmd_metadata.Rd
+fba1b4f58b8603b240db20e85ac0f6e2 *man/rtf_document.Rd
+c58ae26568d6a4abf436ff32700bfa74 *man/run.Rd
+179c6a1f4566e41ad7ccad5ce4a6476f *man/shiny_prerendered_chunk.Rd
+00e61c2a62b85b88f7479c9527c57789 *man/shiny_prerendered_clean.Rd
+2dac5f650594061713426725b170bc06 *man/shiny_prerendered_server_start_code.Rd
+ce31ac61959d9bd74ba97c575a366820 *man/slidy_presentation.Rd
+f742ea57b4638ddf266cd416c18b4728 *man/tufte_handout.Rd
+0fb7e287e75636a048c276404e9b9a51 *man/word_document.Rd
+b3eb4ecc1e3103d0fde863d5eb01317c *man/yaml_front_matter.Rd
+2ee06c5129b130d30688f73fa3b3e374 *tests/shiny/01-basic-input.Rmd
+6c394907bda511bc555e597dc47c5050 *tests/shiny/02-data-table.Rmd
+3c43430b42aacc3689ad04759b85d4c6 *tests/shiny/03-rm-all.Rmd
+119b221d76ca2c70b28ec3a737b921e5 *tests/shiny/04-prerendered-envir.Rmd
+b559a09451c2562bbbd05dcb1d362a90 *tests/testthat.R
+d41d8cd98f00b204e9800998ecf8427e *tests/testthat/resources/csvs/csv1.csv
+d41d8cd98f00b204e9800998ecf8427e *tests/testthat/resources/csvs/csv2.csv
+d41d8cd98f00b204e9800998ecf8427e *tests/testthat/resources/csvs/other/csv3.csv
+10bb9de5c10dfe0c23efd110d31b5b82 *tests/testthat/resources/directory-refs.Rmd
+2228e977ebea8966e27929f43e39cb67 *tests/testthat/resources/empty.Rmd
+d41d8cd98f00b204e9800998ecf8427e *tests/testthat/resources/empty.bib
+0660b7d791fcb4291857f0574e5213fc *tests/testthat/resources/empty.csl
+2228e977ebea8966e27929f43e39cb67 *tests/testthat/resources/empty.css
+2228e977ebea8966e27929f43e39cb67 *tests/testthat/resources/empty.csv
+2228e977ebea8966e27929f43e39cb67 *tests/testthat/resources/empty.html
+97ed0706d71eddcbe107009c9302f681 *tests/testthat/resources/empty.jpg
+2228e977ebea8966e27929f43e39cb67 *tests/testthat/resources/empty.js
+69181455a02be6cd6edf1cb5d062ffbf *tests/testthat/resources/empty.md
+8085f4d710e4a9470ea1568afafba970 *tests/testthat/resources/empty.png
+2228e977ebea8966e27929f43e39cb67 *tests/testthat/resources/empty.tsv
+d41d8cd98f00b204e9800998ecf8427e *tests/testthat/resources/empty/empty.csv
+70d0428a1f288dde410949b449d67b87 *tests/testthat/resources/file-exists.Rmd
+68db2a0ceb8e68f1a83fd986121d6646 *tests/testthat/resources/has-css.Rmd
+5f7eb90250a9e872a9c17e4fb049965e *tests/testthat/resources/has-image.css
+eeebefd540f6908764218e707b405148 *tests/testthat/resources/html.html
+3cd237287cc9b3b052f614185c4c9bcb *tests/testthat/resources/markdown.md
+2228e977ebea8966e27929f43e39cb67 *tests/testthat/resources/nonempty/empty.csv
+97ed0706d71eddcbe107009c9302f681 *tests/testthat/resources/nonempty/empty.jpg
+b7fea7373bbe3b4b98b203208ce98b5a *tests/testthat/resources/pdf.Rmd
+36335dc220e62bb97acb05a2a8b2aa6b *tests/testthat/resources/period.Rmd
+7b1f2f7012f94f95670dcac02726d50b *tests/testthat/resources/quotes.Rmd
+57d045b785e2c8b11bb244e98192ac35 *tests/testthat/resources/r-notebook.Rmd
+230f107a26e47490b08ebf45e92e4300 *tests/testthat/resources/readcsv-source.R
+1a4ee022d8b36b18ff3ed59b84fc9dc2 *tests/testthat/resources/readcsv.R
+9aa836a9e0536cef5c8564bf83b68745 *tests/testthat/resources/readcsv.Rmd
+ddc188df0d91e31b9ca91bc92c44c466 *tests/testthat/resources/resource-files.Rmd
+30b0e3c3a780111e45fa71621109ccb5 *tests/testthat/resources/rmarkdown.Rmd
+80080ac7708c5074147cd309c005e658 *tests/testthat/resources/tinyplot.png
+3b04dfb74569b5893ab73d177de0069c *tests/testthat/site/PageA.Rmd
+3ac8b8d94bf06b514d3da5b5b00a854e *tests/testthat/site/PageB.rmd
+8a6685a265db07a57c17f2414b9720b9 *tests/testthat/site/PageC.md
+5d6832df4342228a6396253347214809 *tests/testthat/site/_site.yml
+d41d8cd98f00b204e9800998ecf8427e *tests/testthat/site/docs.txt
+d90f204c681256d32ded63fa8b644c32 *tests/testthat/site/index.Rmd
+d41d8cd98f00b204e9800998ecf8427e *tests/testthat/site/script.R
+6db10067423ea38c68a223b3e6035d8f *tests/testthat/site/styles.css
+87585c157c3fab934b82ba8cc248529d *tests/testthat/test-dependencies.R
+b73444ef64369c63b55c022a12a1d0cc *tests/testthat/test-encode-decode.R
+d609e701345cdd06387afd2211ba52d2 *tests/testthat/test-formats.R
+03db4f37921d3682b6022d45263fa12f *tests/testthat/test-formats.Rmd
+b199086df1faa0bcd5f5aaf897feff11 *tests/testthat/test-htmlparse.R
+18d9dbce8b47e6801f4c648ab5d2a7f8 *tests/testthat/test-ioslides.R
+c1edd15f04871be4d3ab7b0b2d37804c *tests/testthat/test-notebook.R
+a0dc1f95d64af3aefe4ec8ebe96d2964 *tests/testthat/test-params.R
+617369b97758948d49ef72669735a59f *tests/testthat/test-resources.R
+36a2d23f04c4c87c1d99580906c8edf9 *tests/testthat/test-site.R
diff --git a/NAMESPACE b/NAMESPACE
new file mode 100644
index 0000000..a45f886
--- /dev/null
+++ b/NAMESPACE
@@ -0,0 +1,90 @@
+# Generated by roxygen2: do not edit by hand
+
+S3method(knit_print,grouped_df)
+S3method(knit_print,rowwise_df)
+S3method(knit_print,tbl_sql)
+S3method(prepare_evaluate_output,default)
+S3method(prepare_evaluate_output,htmlwidget)
+S3method(prepare_evaluate_output,knit_asis)
+S3method(prepare_evaluate_output,list)
+export(all_output_formats)
+export(beamer_presentation)
+export(clean_site)
+export(default_output_format)
+export(draft)
+export(find_external_resources)
+export(from_rmarkdown)
+export(github_document)
+export(html_dependency_bootstrap)
+export(html_dependency_font_awesome)
+export(html_dependency_highlightjs)
+export(html_dependency_ionicons)
+export(html_dependency_jquery)
+export(html_dependency_jqueryui)
+export(html_dependency_pagedtable)
+export(html_dependency_tocify)
+export(html_document)
+export(html_document_base)
+export(html_fragment)
+export(html_notebook)
+export(html_notebook_metadata)
+export(html_notebook_output_code)
+export(html_notebook_output_html)
+export(html_notebook_output_img)
+export(html_notebook_output_png)
+export(html_vignette)
+export(includes)
+export(includes_to_pandoc_args)
+export(ioslides_presentation)
+export(knit_params_ask)
+export(knitr_options)
+export(knitr_options_html)
+export(knitr_options_pdf)
+export(latex_dependency)
+export(latex_document)
+export(latex_fragment)
+export(md_document)
+export(metadata)
+export(navbar_html)
+export(navbar_links_html)
+export(odt_document)
+export(output_format)
+export(paged_table)
+export(pandoc_available)
+export(pandoc_convert)
+export(pandoc_highlight_args)
+export(pandoc_include_args)
+export(pandoc_latex_engine_args)
+export(pandoc_options)
+export(pandoc_path_arg)
+export(pandoc_self_contained_html)
+export(pandoc_template)
+export(pandoc_toc_args)
+export(pandoc_variable_arg)
+export(pandoc_version)
+export(parse_html_notebook)
+export(pdf_document)
+export(relative_to)
+export(render)
+export(render_delayed)
+export(render_site)
+export(render_supporting_files)
+export(resolve_output_format)
+export(rmarkdown_format)
+export(rtf_document)
+export(run)
+export(shiny_prerendered_chunk)
+export(shiny_prerendered_clean)
+export(shiny_prerendered_server_start_code)
+export(site_generator)
+export(slidy_presentation)
+export(tufte_handout)
+export(word_document)
+export(yaml_front_matter)
+import(htmltools)
+import(methods)
+import(rprojroot)
+import(stats)
+importFrom(evaluate,evaluate)
+importFrom(knitr,knit_print)
+importFrom(utils,packageVersion)
diff --git a/R/base64.R b/R/base64.R
new file mode 100644
index 0000000..31f6b03
--- /dev/null
+++ b/R/base64.R
@@ -0,0 +1,49 @@
+base64_encode_file <- function(in_file, encoder) {
+
+  file_size <- file.info(in_file)$size
+
+  if (file_size <= 0) {
+    warning(in_file, 'is empty!')
+    return(in_file)
+  }
+  paste0('data:', mime::guess_type(in_file), ';base64,',
+         encoder(readBin(in_file, 'raw', n = file_size)))
+}
+
+# processes an HTML resource, given a regular expression that locates
+# instances of that resource
+process_html_res <- function(html, reg, processor) {
+  html <- paste(html, collapse = "\n")
+  process_img_src <- function(img_src) {
+    src <- sub(reg, '\\1', img_src)
+    processor(img_src, src)
+  }
+  html <- stringr::str_replace_all(html, reg, process_img_src)
+  strsplit(html, "\n", fixed = TRUE)[[1]]
+}
+
+process_images <- function(html, processor) {
+  process_html_res(
+    html,
+    "<\\s*[Ii][Mm][Gg]\\s+[Ss][Rr][Cc]\\s*=\\s*[\"']([^\"']+)[\"']",
+    processor)
+}
+
+base64_encode_images <- function(html, encoder) {
+  base64_encode_img <- function(img_src, src) {
+    in_file <- utils::URLdecode(src)
+    if (length(in_file) && file.exists(in_file)) {
+      img_src <- sub(src, base64_encode_file(in_file, encoder), img_src,
+                     fixed = TRUE)
+    }
+    img_src
+  }
+  html <- process_images(html, base64_encode_img)
+  process_html_res(html, "<[^>]*style=\"[^\"]*url\\(([^\\)]+)\\)", base64_encode_img)
+}
+
+base64_image_encode <- function(data) {
+  base64_encode_images(data, base64enc::base64encode)
+}
+
+
diff --git a/R/beamer_presentation.R b/R/beamer_presentation.R
new file mode 100644
index 0000000..f0d5ce1
--- /dev/null
+++ b/R/beamer_presentation.R
@@ -0,0 +1,258 @@
+#' Convert to a Beamer presentation
+#'
+#' Format for converting from R Markdown to a Beamer presentation.
+#'
+#' @inheritParams output_format
+#' @inheritParams pdf_document
+#' @inheritParams html_document
+#'
+#' @param toc \code{TRUE} to include a table of contents in the output (only
+#'   level 1 headers will be included in the table of contents).
+#' @param slide_level The heading level which defines individual slides. By
+#'   default this is the highest header level in the hierarchy that is followed
+#'   immediately by content, and not another header, somewhere in the document.
+#'   This default can be overridden by specifying an explicit
+#'   \code{slide_level}.
+#' @param incremental \code{TRUE} to render slide bullets incrementally. Note
+#'   that if you want to reverse the default incremental behavior for an
+#'   individual bullet you can precede it with \code{>}. For example:
+#'   \emph{\code{> - Bullet Text}}
+#' @param theme Beamer theme (e.g. "AnnArbor").
+#' @param colortheme Beamer color theme (e.g. "dolphin").
+#' @param fonttheme Beamer font theme (e.g. "structurebold").
+#' @param self_contained Whether to generate a full LaTeX document (\code{TRUE})
+#'   or just the body of a LaTeX document (\code{FALSE}). Note the LaTeX
+#'   document is an intermediate file unless \code{keep_tex = TRUE}.
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' See the
+#' \href{http://rmarkdown.rstudio.com/beamer_presentation_format.html}{online
+#' documentation} for additional details on using the \code{beamer_presentation}
+#' format.
+#'
+#' Creating Beamer output from R Markdown requires that LaTeX be installed.
+#'
+#' R Markdown documents can have optional metadata that is used to generate a
+#' document header that includes the title, author, and date. For more details
+#' see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+#'
+#' R Markdown documents also support citations. You can find more information on
+#' the markdown syntax for citations in the
+#' \href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+#' and Citations} article in the online documentation.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' # simple invocation
+#' render("pres.Rmd", beamer_presentation())
+#'
+#' # specify an option for incremental rendering
+#' render("pres.Rmd", beamer_presentation(incremental = TRUE))
+#' }
+#'
+#' @export
+beamer_presentation <- function(toc = FALSE,
+                                slide_level = NULL,
+                                incremental = FALSE,
+                                fig_width = 10,
+                                fig_height = 7,
+                                fig_crop = TRUE,
+                                fig_caption = TRUE,
+                                dev = 'pdf',
+                                df_print = "default",
+                                theme = "default",
+                                colortheme = "default",
+                                fonttheme = "default",
+                                highlight = "default",
+                                template = "default",
+                                keep_tex = FALSE,
+                                latex_engine = "pdflatex",
+                                citation_package = c("none", "natbib", "biblatex"),
+                                self_contained = TRUE,
+                                includes = NULL,
+                                md_extensions = NULL,
+                                pandoc_args = NULL) {
+
+  # base pandoc options for all beamer output
+  args <- c()
+
+  # template path and assets
+  if (!is.null(template)) {
+    if (identical(template, "default")) template <- patch_beamer_template()
+    if (!is.null(template))
+      args <- c(args, "--template", pandoc_path_arg(template))
+  }
+
+  # table of contents
+  if (toc)
+    args <- c(args, "--table-of-contents")
+
+  # slide level
+  if (!is.null(slide_level))
+    args <- c(args, "--slide-level", as.character(slide_level))
+
+  # incremental
+  if (incremental)
+    args <- c(args, "--incremental")
+
+  # themes
+  if (!identical(theme, "default"))
+    args <- c(args, pandoc_variable_arg("theme", theme))
+  if (!identical(colortheme, "default"))
+    args <- c(args, pandoc_variable_arg("colortheme", colortheme))
+  if (!identical(fonttheme, "default"))
+    args <- c(args, pandoc_variable_arg("fonttheme", fonttheme))
+
+  # highlighting
+  if (!is.null(highlight))
+    highlight <- match.arg(highlight, highlighters())
+  args <- c(args, pandoc_highlight_args(highlight))
+
+  # latex engine
+  latex_engine = match.arg(latex_engine, c("pdflatex", "lualatex", "xelatex"))
+  args <- c(args, pandoc_latex_engine_args(latex_engine))
+
+  # citation package
+  citation_package <- match.arg(citation_package)
+  if (citation_package != "none") args <- c(args, paste0("--", citation_package))
+
+  # generate a self-contained LaTeX document (including preamble)
+  if (self_contained) args <- c(args, "--self-contained")
+
+  # content includes
+  args <- c(args, includes_to_pandoc_args(includes))
+
+  # make sure the graphics package is always loaded
+  if (identical(template, "default")) args <- c(args, "--variable", "graphics=yes")
+
+  # custom args
+  args <- c(args, pandoc_args)
+
+  # initialize saved files dir
+  saved_files_dir <- NULL
+
+  pre_processor <- function(metadata, input_file, runtime, knit_meta,
+                                files_dir, output_dir) {
+    # save files dir (for generating intermediates)
+    saved_files_dir <<- files_dir
+
+    # no-op other than caching dir location
+    invisible(NULL)
+  }
+
+  # generate intermediates (required to make resources available for publish)
+  intermediates_generator <- function(original_input, encoding,
+                                      intermediates_dir) {
+    return(pdf_intermediates_generator(saved_files_dir, original_input,
+                                        encoding, intermediates_dir))
+  }
+
+  # return format
+  output_format(
+    knitr = knitr_options_pdf(fig_width, fig_height, fig_crop, dev),
+    pandoc = pandoc_options(to = "beamer",
+                            from = from_rmarkdown(fig_caption, md_extensions),
+                            args = args,
+                            latex_engine = latex_engine,
+                            keep_tex = keep_tex),
+    pre_processor = pre_processor,
+    intermediates_generator = intermediates_generator,
+    clean_supporting = !keep_tex,
+    df_print = df_print
+  )
+}
+
+
+patch_beamer_template_pagenumber <- function(template) {
+
+  patch <- paste(
+    "% Comment these out if you don't want a slide with just the",
+    "% part/section/subsection/subsubsection title:", "\\AtBeginPart{",
+    "  \\let\\insertpartnumber\\relax", "  \\let\\partname\\relax",
+    "  \\frame{\\partpage}", "}", "\\AtBeginSection{",
+    "  \\let\\insertsectionnumber\\relax", "  \\let\\sectionname\\relax",
+    "  \\frame{\\sectionpage}", "}", "\\AtBeginSubsection{",
+    "  \\let\\insertsubsectionnumber\\relax", "  \\let\\subsectionname\\relax",
+    "  \\frame{\\subsectionpage}", "}",
+    sep = "\n"
+  )
+
+  pasted <- paste(template, collapse = "\n")
+  patched <- sub(patch, "", pasted, fixed = TRUE)
+  strsplit(patched, "\n", fixed = TRUE)[[1]]
+}
+
+patch_beamer_template_paragraph_spacing <- function(template) {
+
+  patch <- c(
+    "\\setlength{\\parindent}{0pt}",
+    "\\setlength{\\parskip}{6pt plus 2pt minus 1pt}"
+  )
+
+  lines <- unlist(lapply(patch, function(line) {
+    index <- grep(line, template, fixed = TRUE)
+    if (length(index) == 1) index else -1
+  }))
+
+  # bail if we already have these lines in the document
+  if (all(lines >= 0) && lines[[1]] == lines[[2]] - 1)
+    return(template)
+
+  # find patch location -- we insert before this line
+  targetLine <- "\\setlength{\\emergencystretch}{3em}  % prevent overfull lines"
+  targetIdx <- grep(targetLine, template, fixed = TRUE)
+  if (!length(targetIdx))
+    return(template)
+
+  # insert patch
+  c(
+    utils::head(template, n = targetIdx - 1),
+    patch,
+    utils::tail(template, n = -(targetIdx - 1))
+  )
+}
+
+patch_beamer_template <- function() {
+  pandoc_available(error = TRUE)
+
+  # invoke pandoc to read default template
+  command <- paste(quoted(pandoc()), "-D beamer")
+  template <- with_pandoc_safe_environment({
+    tryCatch(
+      system(command, intern = TRUE),
+      error = function(e) NULL
+    )
+  })
+
+  # make failure to read template non-fatal
+  if (is.null(template))
+    return(NULL)
+
+  # trim whitespace
+  template <- gsub("^\\s+|\\s+$", "", template, perl = TRUE)
+
+  # apply patches (store original version of template so we can
+  # compare after applying patches)
+  original <- template
+  version <- pandoc_version()
+
+  if (version < "1.15.2")
+    template <- patch_beamer_template_pagenumber(template)
+
+  if (version > "1.15.2" && version < "1.17.3")
+    template <- patch_beamer_template_paragraph_spacing(template)
+
+  # if the template hasn't changed, return NULL (we don't need
+  # to apply a custom template)
+  if (identical(template, original))
+    return(NULL)
+
+  # write and return path to template
+  as_tmpfile(enc2utf8(template))
+}
diff --git a/R/draft.R b/R/draft.R
new file mode 100644
index 0000000..ff14c2f
--- /dev/null
+++ b/R/draft.R
@@ -0,0 +1,159 @@
+
+#' Create a new document based on a template
+#'
+#' Create (and optionally edit) a draft of an R Markdown document based on a
+#' template.
+#'
+#' @param file File name for the draft
+#' @param template Template to use as the basis for the draft. This is either
+#'   the full path to a template directory or the name of a template directory
+#'   within the \code{rmarkdown/templates} directory of a package.
+#' @param package (Optional) Name of package where the template is located.
+#' @param create_dir \code{TRUE} to create a new directory for the document
+#'   (the "default" setting leaves this behavior up to the creator of the
+#'   template).
+#' @param edit \code{TRUE} to edit the template immediately
+#'
+#' @return The file name of the new document (invisibly)
+#'
+#' @details The \code{draft} function creates new R Markdown documents based on
+#'   templates that are either located on the filesystem or within an R package.
+#'   The template and it's supporting files will be copied to the location
+#'   specified by \code{file}.
+#'
+#' @note An R Markdown template consists of a directory that contains a
+#'   description of the template, a skeleton Rmd file used as the basis for new
+#'   documents, and optionally additional supporting files that are provided
+#'   along with the skeleton (e.g. a logo graphic).
+#'
+#'   If the template directory is contained within a package then it should be
+#'   located at \code{inst/rmarkdown/templates}. For example, a package named
+#'   \pkg{pubtools} that wanted to provide a template named
+#'   \code{quarterly_report} would need to provide the following files within
+#'   the \code{pubtools/inst/rmarkdown/templates} directory:
+#'
+#'   \code{quarterly_report/template.yaml} \cr
+#'   \code{quarterly_report/skeleton/skeleton.Rmd} \cr
+#'
+#'   The \code{template.yaml} file should include a \code{name} field. If you
+#'   want to ensure that a new directory is always created for a given template,
+#'   then you can add the \code{create_dir} field to the \code{template.yaml}
+#'   file. For example:
+#'
+#'   \code{create_dir: true} \cr
+#'
+#'   The \code{skeleton/skeleton.Rmd} file should include the initial contents
+#'   you want for files created from this template. Additional files can be
+#'   added to the \code{skeleton} directory, for example:
+#'
+#'   \code{skeleton/logo.png} \cr
+#'
+#'   These files will automatically be copied to the directory containing the
+#'   new R Markdown draft.
+#'
+#'
+#' @examples
+#' \dontrun{
+#'
+#' rmarkdown::draft("Q4Report.Rmd",
+#'                  template="/opt/rmd/templates/quarterly_report")
+#'
+#' rmarkdown::draft("Q4Report.Rmd",
+#'                  template="quarterly_report", package="pubtools")
+#' }
+#' @export
+draft <- function(file,
+                  template,
+                  package = NULL,
+                  create_dir = "default",
+                  edit = TRUE) {
+
+  # resolve package file
+  if (!is.null(package)) {
+    template_path = system.file("rmarkdown", "templates", template,
+                                package = package)
+    if (!nzchar(template_path)) {
+      stop("The template '", template, "' was not found in the ",
+           package, " package")
+    }
+  } else {
+    template_path <- template
+  }
+
+  # read the template.yaml and confirm it has the right fields
+  template_yaml <- file.path(template_path, "template.yaml")
+  if (!file.exists(template_yaml)) {
+    stop("No template.yaml file found for template '", template, "'")
+  }
+  template_meta <- yaml_load_file_utf8(template_yaml)
+  if (is.null(template_meta$name) || is.null(template_meta$description)) {
+    stop("template.yaml must contain name and description fields")
+  }
+
+  # see if this template is asking to create a new directory
+  if (identical(create_dir, "default"))
+    create_dir <- isTRUE(template_meta$create_dir)
+
+  # create a new directory if requested
+  if (create_dir) {
+
+    # remove .Rmd extension if necessary
+    file <- tools::file_path_sans_ext(file)
+
+    # create dir (new dir only)
+    if (dir_exists(file))
+      stop("The directory '", file, "' already exists.")
+    dir.create(file)
+
+    # reconstitute the file path
+    file <- file.path(file, basename(file))
+  }
+
+  # Ensure we have an Rmd extension
+  if (!identical(tolower(tools::file_ext(file)), "rmd"))
+    file <- paste(file, ".Rmd", sep = "")
+
+  # Ensure the file doesn't already exist
+  if (file.exists(file))
+    stop("The file '", file, "' already exists.")
+
+  # copy all of the files in the skeleton directory
+  skeleton_files <- list.files(file.path(template_path, "skeleton"),
+                               full.names = TRUE)
+  to <- dirname(file)
+  for (f in skeleton_files) {
+    if (file.exists(file.path(to, basename(f))))
+      stop("The file '", basename(f), "' already exists")
+    file.copy(from = f, to = to, overwrite = FALSE, recursive = TRUE)
+  }
+
+  # rename the core template file
+  file.rename(file.path(dirname(file), "skeleton.Rmd"), file)
+
+  # invoke the editor if requested
+  if (edit)
+    utils::file.edit(normalizePath(file))
+
+  # return the name of the file created
+  invisible(file)
+}
+
+# List the template directories that are available for consumption.
+list_template_dirs <- function() {
+
+  # check each installed package for templates
+  packages <- row.names(utils::installed.packages())
+  for (pkg in packages) {
+
+    # check to see if the package includes a template folder
+    template_folder <- system.file("rmarkdown", "templates", package = pkg)
+    if (dir_exists(template_folder)) {
+
+      # it does; list each template directory within the template folder
+      template_dirs <- list.dirs(path = template_folder, recursive = FALSE)
+      for (dir in template_dirs) {
+        cat(pkg, "|", dir, "\n", sep = "")
+      }
+    }
+  }
+}
diff --git a/R/github_document.R b/R/github_document.R
new file mode 100644
index 0000000..9792055
--- /dev/null
+++ b/R/github_document.R
@@ -0,0 +1,94 @@
+#' Convert to GitHub Flavored Markdown
+#'
+#' Format for converting from R Markdown to GitHub Flavored Markdown.
+#'
+#' @inheritParams output_format
+#' @inheritParams html_document
+#' @inheritParams md_document
+#'
+#' @param hard_line_breaks \code{TRUE} to genreate markdown that uses a simple
+#'   newline to represent a line break (as opposed to two-spaces and a newline).
+#'
+#' @param html_preview \code{TRUE} to also generate an HTML file for the purpose of
+#'   locally previewing what the document will look like on GitHub.
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @export
+github_document <- function(toc = FALSE,
+                            toc_depth = 3,
+                            fig_width = 7,
+                            fig_height = 5,
+                            dev = 'png',
+                            df_print = "default",
+                            includes = NULL,
+                            md_extensions = NULL,
+                            hard_line_breaks = TRUE,
+                            pandoc_args = NULL,
+                            html_preview = TRUE) {
+
+  # add special markdown rendering template to ensure we include the title fields
+  pandoc_args <- c(
+    pandoc_args, "--template", pandoc_path_arg(rmarkdown_system_file(
+      "rmarkdown/templates/github_document/resources/default.md"))
+  )
+
+  pandoc2 <- pandoc2.0()
+  # use md_document as base
+  variant <- if (pandoc2) "gfm" else "markdown_github"
+  if (!hard_line_breaks) variant <- paste0(variant, "-hard_line_breaks")
+
+  # turn off ASCII identifiers
+  variant <- paste0(variant, "-ascii_identifiers")
+
+  format <- md_document(
+    variant = variant, toc = toc, toc_depth = toc_depth,
+    fig_width = fig_width, fig_height = fig_height, dev = dev,
+    df_print = df_print, includes = includes, md_extensions = md_extensions,
+    pandoc_args = pandoc_args
+  )
+
+  # remove 'ascii_identifiers' if necessary -- required to ensure that
+  # TOC links are correctly generated on GitHub
+  format$pandoc$from <- gsub("+ascii_identifiers", "", format$pandoc$from, fixed = TRUE)
+
+  # add a post processor for generating a preview if requested
+  if (html_preview) {
+    format$post_processor <- function(metadata, input_file, output_file, clean, verbose) {
+
+      css <- pandoc_path_arg(rmarkdown_system_file(
+        "rmarkdown/templates/github_document/resources/github.css"))
+      # provide a preview that looks like github
+      args <- c(
+        "--standalone", "--self-contained", "--highlight-style", "pygments",
+        "--template", pandoc_path_arg(rmarkdown_system_file(
+          "rmarkdown/templates/github_document/resources/preview.html")),
+        "--variable", paste0("github-markdown-css:", css),
+        "--email-obfuscation", "none", # no email obfuscation
+        if (pandoc2) c("--metadata", "pagetitle=PREVIEW")  # HTML5 requirement
+      )
+
+      # run pandoc
+      preview_file <- file_with_ext(output_file, "html")
+      pandoc_convert(
+        input = output_file, to = "html", from = variant, output = preview_file,
+        options = args, verbose = verbose
+      )
+
+      # move the preview to the preview_dir if specified
+      preview_dir <- Sys.getenv("RMARKDOWN_PREVIEW_DIR", unset = NA)
+      if (!is.na(preview_dir)) {
+        relocated_preview_file <- tempfile("preview-", preview_dir, ".html")
+        file.copy(preview_file, relocated_preview_file)
+        file.remove(preview_file)
+        preview_file <- relocated_preview_file
+      }
+
+      if (verbose) message("\nPreview created: ", preview_file)
+
+      output_file
+    }
+  }
+
+  format  # return format
+}
diff --git a/R/html_dependencies.R b/R/html_dependencies.R
new file mode 100644
index 0000000..0b81b96
--- /dev/null
+++ b/R/html_dependencies.R
@@ -0,0 +1,296 @@
+#' @import htmltools
+NULL
+
+#' Provide common HTML dependencies for R Markdown formats
+#'
+#' These functions provide common HTML dependencies (e.g. jquery, bootstrap)
+#' for re-use by other R Markdown formats.
+#'
+#' @inheritParams html_document
+#' @name html-dependencies
+NULL
+
+# create an html dependency for our embedded jquery
+#' @rdname html-dependencies
+#' @export
+html_dependency_jquery <- function()  {
+  htmlDependency(name = "jquery",
+                 version = "1.11.3",
+                 src = rmarkdown_system_file("rmd/h/jquery-1.11.3"),
+                 script = "jquery.min.js")
+}
+
+# create an html dependency for our embedded bootstrap
+#' @rdname html-dependencies
+#' @export
+html_dependency_bootstrap <- function(theme) {
+  if (identical(theme, "default")) theme <- "bootstrap"
+  htmlDependency(name = "bootstrap",
+                 version = "3.3.5",
+                 rmarkdown_system_file("rmd/h/bootstrap-3.3.5"),
+                 meta = list(viewport = "width=device-width, initial-scale=1"),
+                 script = c(
+                   "js/bootstrap.min.js",
+                   # These shims are necessary for IE 8 compatibility
+                   "shim/html5shiv.min.js",
+                   "shim/respond.min.js"
+                 ),
+                 stylesheet = paste0("css/", theme, ".min.css"))
+}
+
+# create an html_dependency for our embedded jqueryui
+#' @rdname html-dependencies
+#' @export
+html_dependency_jqueryui <- function() {
+  htmlDependency(name = 'jqueryui',
+                 version = '1.11.4',
+                 src = rmarkdown_system_file("rmd/h/jqueryui-1.11.4"),
+                 script = 'jquery-ui.min.js'
+  )
+}
+
+# create an html_dependency for tocify
+#' @rdname html-dependencies
+#' @export
+html_dependency_tocify <- function() {
+  htmlDependency(name = "tocify",
+                 version = "1.9.1",
+                 src = rmarkdown_system_file("rmd/h/tocify-1.9.1"),
+                 script = "jquery.tocify.js",
+                 stylesheet = "jquery.tocify.css")
+}
+
+html_dependency_navigation <- function(code_menu, source_embed) {
+
+  # dynamically build script list
+  script <- c("tabsets.js")
+  if (code_menu)
+    script <- c(script, "codefolding.js")
+  if (source_embed)
+    script <- c(script, "sourceembed.js")
+
+  htmlDependency(name = "navigation",
+                 version = "1.1",
+                 src = rmarkdown_system_file("rmd/h/navigation-1.1"),
+                 script = script)
+}
+
+
+# create an html_dependency for font awesome
+#' @rdname html-dependencies
+#' @export
+html_dependency_font_awesome <- function() {
+  htmlDependency(
+    "font-awesome",
+    "4.5.0",
+    src = rmarkdown_system_file("rmd/h/font-awesome-4.5.0"),
+    stylesheet = "css/font-awesome.min.css"
+  )
+}
+
+# create an html_dependency for ionicons
+#' @rdname html-dependencies
+#' @export
+html_dependency_ionicons <- function() {
+  htmlDependency(
+    "ionicons",
+    "2.0.1",
+    src = rmarkdown_system_file("rmd/h/ionicons-2.0.1"),
+    stylesheet = "css/ionicons.min.css"
+  )
+}
+
+# analyze navbar html source for icon dependencies
+navbar_icon_dependencies <- function(navbar) {
+
+  # read the navbar source
+  source <- readLines(navbar)
+
+  # find icon references
+  res <- regexec('<(span|i) +class *= *("|\') *(fa fa|ion ion)-', source)
+  matches <- regmatches(source, res)
+  libs <- c()
+  for (match in matches) {
+    if (length(match) > 0)
+      libs <- c(libs, match[[4]])
+  }
+  libs <- unique(libs)
+
+  # return their dependencies
+  html_dependencies_fonts("fa fa" %in% libs, "ion ion" %in% libs)
+}
+
+
+# utilty function to return a list of font dependencies based
+# whether we are including font_awesome and/or iconicons
+html_dependencies_fonts <- function(font_awesome, ionicons) {
+  deps <- list()
+  if (font_awesome)
+    deps <- append(deps, list(html_dependency_font_awesome()))
+  if (ionicons)
+    deps <- append(deps, list(html_dependency_ionicons()))
+  deps
+}
+
+
+# flattens an arbitrarily nested list and returns all of the dependency
+# objects it contains
+flatten_dependencies <- function(knit_meta, test) {
+
+  all_dependencies <- list()
+
+  # knit_meta is a list of 'meta' attributes returned from custom knit_print
+  # functions. since the 'meta' attribute could either be an html dependency or
+  # a list of dependencies we recurse on lists that aren't named
+  for (dep in knit_meta) {
+    if (is.null(names(dep)) && is.list(dep)) {
+      inner_dependencies <- flatten_dependencies(dep, test)
+      all_dependencies <- append(all_dependencies, inner_dependencies)
+    } else if (test(dep)) {
+      all_dependencies[[length(all_dependencies) + 1]] <- dep
+    }
+  }
+
+  all_dependencies
+}
+
+flatten_html_dependencies <- function(knit_meta) {
+  flatten_dependencies(knit_meta, is_html_dependency)
+}
+
+# consolidate dependencies (use latest versions and remove duplicates). this
+# routine is the default implementation for version dependency resolution;
+# formats may specify their own.
+html_dependency_resolver <- function(all_dependencies) {
+
+  dependencies <- htmltools::resolveDependencies(all_dependencies)
+
+  # validate each surviving dependency
+  lapply(dependencies, validate_html_dependency)
+
+  # return the consolidated dependencies
+  dependencies
+}
+
+html_reference_path <- function(path, lib_dir, output_dir) {
+  # write the full OS-specific path if no library
+  if (is.null(lib_dir))
+    pandoc_path_arg(path)
+  else
+    relative_to(output_dir, path)
+}
+
+# return the html dependencies as an HTML string suitable for inclusion
+# in the head of a document
+html_dependencies_as_string <- function(dependencies, lib_dir, output_dir) {
+
+  if (!is.null(lib_dir)) {
+    dependencies <- lapply(dependencies, copyDependencyToDir, lib_dir)
+    dependencies <- lapply(dependencies, makeDependencyRelative, output_dir)
+  }
+  return(renderDependencies(dependencies, "file", encodeFunc = identity,
+    hrefFilter = function(path) {
+      html_reference_path(path, lib_dir, output_dir)
+    })
+  )
+}
+
+# check class of passed list for 'html_dependency'
+is_html_dependency <- function(list) {
+  inherits(list, "html_dependency")
+}
+
+# validate that the passed list is a correctly formed html_dependency
+validate_html_dependency <- function(list) {
+
+  # ensure it's the right class
+  if (!is_html_dependency(list))
+    stop("passed object is not of class html_dependency", call. = FALSE)
+
+  # validate required fields
+  if (is.null(list$name))
+    stop("name for html_dependency not provided", call. = FALSE)
+  if (is.null(list$version))
+    stop("version for html_dependency not provided", call. = FALSE)
+  if (is.null(list$src$file))
+    stop("path for html_dependency not provided", call. = FALSE)
+  file <- list$src$file
+  if (!is.null(list$package))
+    file <- system.file(file, package = list$package)
+  if (!file.exists(file))
+    stop("path for html_dependency not found: ", file, call. = FALSE)
+
+  list
+}
+
+# check if the passed knit_meta has any (e.g. html/latex) dependencies
+has_dependencies <- function(knit_meta, class) {
+
+  if (inherits(knit_meta, class))
+    return(TRUE)
+
+  if (is.list(knit_meta)) {
+    for (dep in knit_meta) {
+      if (is.null(names(dep))) {
+        if (has_dependencies(dep, class))
+          return(TRUE)
+      } else {
+        if (inherits(dep, class))
+          return(TRUE)
+      }
+    }
+  }
+  FALSE
+}
+
+has_html_dependencies <- function(knit_meta) {
+  has_dependencies(knit_meta, "html_dependency")
+}
+
+# create an html_dependency for pagedtable
+#' @rdname html-dependencies
+#' @export
+html_dependency_pagedtable <- function() {
+  htmlDependency(
+    "pagedtable",
+    version = "1.1",
+    src = rmarkdown_system_file("rmd/h/pagedtable-1.1"),
+    script = "js/pagedtable.js",
+    stylesheet = "css/pagedtable.css"
+  )
+}
+
+
+
+#' @param highlight Highligher to use
+#' @rdname html-dependencies
+#' @export
+html_dependency_highlightjs <- function(highlight) {
+  htmlDependency(
+    "highlightjs",
+    version = "9.12.0",
+    src = rmarkdown_system_file("rmd/h/highlightjs"),
+    script = "highlight.js",
+    stylesheet = paste0(highlight, ".css")
+  )
+}
+
+# create an html_dependency for rsiframe
+html_dependency_rsiframe <- function() {
+
+  # add session port to meta if we have it (note that RStudio will
+  # only provide this in desktop mode)
+  meta <- NULL
+  session_port <- Sys.getenv("RSTUDIO_SESSION_PORT")
+  if (nzchar(session_port))
+    meta <- list(rstudio_origin = paste0("127.0.0.1:", session_port))
+
+  htmlDependency(
+    "rstudio-iframe",
+    version = "1.1",
+    src = rmarkdown_system_file("rmd/h/rsiframe-1.1"),
+    script = "rsiframe.js",
+    meta = meta
+  )
+}
+
diff --git a/R/html_document.R b/R/html_document.R
new file mode 100644
index 0000000..300b10d
--- /dev/null
+++ b/R/html_document.R
@@ -0,0 +1,645 @@
+#'Convert to an HTML document
+#'
+#'Format for converting from R Markdown to an HTML document.
+#'
+#' @inheritParams output_format
+#'
+#'@param toc \code{TRUE} to include a table of contents in the output
+#'@param toc_depth Depth of headers to include in table of contents
+#'@param toc_float \code{TRUE} to float the table of contents to the left of the
+#'  main document content. Rather than \code{TRUE} you may also pass a list of
+#'  options that control the behavior of the floating table of contents. See the
+#'  \emph{Floating Table of Contents} section below for details.
+#'@param number_sections \code{TRUE} to number section headings
+#'@param fig_width Default width (in inches) for figures
+#'@param fig_height Default width (in inches) for figures
+#'@param fig_retina Scaling to perform for retina displays (defaults to 2, which
+#'  currently works for all widely used retina displays). Set to \code{NULL} to
+#'  prevent retina scaling. Note that this will always be \code{NULL} when
+#'  \code{keep_md} is specified (this is because \code{fig_retina} relies on
+#'  outputting HTML directly into the markdown document).
+#'@param fig_caption \code{TRUE} to render figures with captions
+#'@param dev Graphics device to use for figure output (defaults to png)
+#'@param code_folding Enable document readers to toggle the display of R code
+#'  chunks. Specify \code{"none"} to display all code chunks (assuming
+#'  they were knit with \code{echo = TRUE}). Specify \code{"hide"} to hide all R
+#'  code chunks by default (users can show hidden code chunks either
+#'  individually or document-wide). Specify \code{"show"} to show all R code
+#'  chunks by default.
+#'@param code_download Embed the Rmd source code within the document and provide
+#'  a link that can be used by readers to download the code.
+#'@param smart Produce typographically correct output, converting straight
+#'  quotes to curly quotes, --- to em-dashes, -- to en-dashes, and ... to
+#'  ellipses.
+#'@param self_contained Produce a standalone HTML file with no external
+#'  dependencies, using data: URIs to incorporate the contents of linked
+#'  scripts, stylesheets, images, and videos. Note that even for self contained
+#'  documents MathJax is still loaded externally (this is necessary because of
+#'  it's size).
+#'@param theme Visual theme ("default", "cerulean", "journal", "flatly",
+#'  "readable", "spacelab", "united", "cosmo", "lumen", "paper", "sandstone",
+#'  "simplex", or "yeti"). Pass \code{NULL} for no theme (in this case you can
+#'  use the \code{css} parameter to add your own styles).
+#'@param highlight Syntax highlighting style. Supported styles include
+#'  "default", "tango", "pygments", "kate", "monochrome", "espresso", "zenburn",
+#'  "haddock", and "textmate". Pass \code{NULL} to prevent syntax highlighting.
+#'@param mathjax Include mathjax. The "default" option uses an https URL from a
+#'  MathJax CDN. The "local" option uses a local version of MathJax (which is
+#'  copied into the output directory). You can pass an alternate URL or pass
+#'  \code{NULL} to exclude MathJax entirely.
+#'@param section_divs Wrap sections in <div> tags (or <section> tags in HTML5),
+#'  and attach identifiers to the enclosing <div> (or <section>) rather than the
+#'  header itself.
+#'@param template Pandoc template to use for rendering. Pass "default" to use
+#'  the rmarkdown package default template; pass \code{NULL} to use pandoc's
+#'  built-in template; pass a path to use a custom template that you've created.
+#'  Note that if you don't use the "default" template then some features of
+#'  \code{html_document} won't be available (see the Templates section below for
+#'  more details).
+#'@param css One or more css files to include
+#'@param includes Named list of additional content to include within the
+#'  document (typically created using the \code{\link{includes}} function).
+#'@param keep_md Keep the markdown file generated by knitting.
+#'@param lib_dir Directory to copy dependent HTML libraries (e.g. jquery,
+#'  bootstrap, etc.) into. By default this will be the name of the document with
+#'  \code{_files} appended to it.
+#'@param md_extensions Markdown extensions to be added or removed from the
+#'  default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+#'  additional details.
+#'@param pandoc_args Additional command line options to pass to pandoc
+#'@param extra_dependencies,... Additional function arguments to pass to the
+#'  base R Markdown HTML output formatter \code{\link{html_document_base}}
+#'
+#'@return R Markdown output format to pass to \code{\link{render}}
+#'
+#'@details
+#'
+#'See the \href{http://rmarkdown.rstudio.com/html_document_format.html}{online
+#'documentation} for additional details on using the \code{html_document}
+#'format.
+#'
+#'R Markdown documents can have optional metadata that is used to generate a
+#'document header that includes the title, author, and date. For more details
+#'see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+#'
+#'R Markdown documents also support citations. You can find more information on
+#'the markdown syntax for citations in the
+#'\href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+#'and Citations} article in the online documentation.
+#'
+#'
+#'@section Navigation Bars:
+#'
+#'  If you have a set of html documents which you'd like to provide a common
+#'  global navigation bar for, you can include a "_navbar.yml" or "_navbar.html"
+#'  file within the same directory as your html document and it will automatically
+#'  be included at the top of the document.
+#'
+#'  The "_navbar.yml" file includes \code{title}, \code{type}, \code{left}, and
+#'  \code{right} fields (to define menu items for the left and right of the navbar
+#'  resspectively). Menu items include \code{title} and \code{href} fields. For example:
+#'
+#'  \preformatted{ title: "My Website"
+#'  type: default
+#'  left:
+#'    - text: "Home"
+#'      href: index.html
+#'    - text: "Other"
+#'      href: other.html
+#'  right:
+#'    - text: GitHub
+#'      href: https://github.com}
+#'  The \code{type} field is optional and can take the value "default" or "inverse" (which
+#'  provides a different color scheme for the navigation bar).
+#'
+#'  Alternatively, you can include a "_navbar.html" file which is a full HTML definition
+#'  of a bootstrap navigation bar. For a simple example of including a navigation bar see
+#'  \href{https://github.com/rstudio/rmarkdown-website/blob/master/_navbar.html}{https://github.com/rstudio/rmarkdown-website/blob/master/_navbar.html}.
+#'   For additional documentation on creating Bootstrap navigation bars see
+#'  \href{http://getbootstrap.com/components/#navbar}{http://getbootstrap.com/components/#navbar}.
+#'
+#'
+#'@section Floating Table of Contents:
+#'
+#'  You may specify a list of options for the \code{toc_float} parameter which
+#'  control the behavior of the floating table of contents. Options include:
+#'
+#'  \itemize{ \item{\code{collapsed} (defaults to \code{TRUE}) controls whether
+#'  the table of contents appears with only the top-level (H2) headers. When
+#'  collapsed the table of contents is automatically expanded inline when
+#'  necessary.} \item{\code{smooth_scroll} (defaults to \code{TRUE}) controls
+#'  whether page scrolls are animated when table of contents items are navigated
+#'  to via mouse clicks.} \item{\code{print} (defaults to \code{TRUE}) controls
+#'  whether the table of contents appears when user prints out the HTML page.}}
+#'
+#'@section Tabbed Sections:
+#'
+#'  You can organize content using tabs by applying the \code{.tabset} class
+#'  attribute to headers within a document. This will cause all sub-headers of
+#'  the header with the \code{.tabset} attribute to appear within tabs rather
+#'  than as standalone sections. For example:
+#'
+#'  \preformatted{ ## Quarterly Results {.tabset}
+#'
+#'  ### By Product
+#'
+#'  ### By Region }
+#'
+#'  You can also specify two additional attributes to control the appearance and
+#'  behavior of the tabs. The \code{.tabset-fade} attributes causes the tabs to
+#'  fade in and out when switching. The \code{.tabset-pills} attribute causes
+#'  the visual appearance of the tabs to be "pill" rather than traditional tabs.
+#'  For example:
+#'
+#'  \preformatted{ ## Quarterly Results {.tabset .tabset-fade .tabset-pills} }
+#'
+#'@section Templates:
+#'
+#'  You can provide a custom HTML template to be used for rendering. The syntax
+#'  for templates is described in the
+#'  \href{http://pandoc.org/README.html}{pandoc documentation}. You can also use
+#'  the basic pandoc template by passing \code{template = NULL}.
+#'
+#'  Note however that if you choose not to use the "default" HTML template then
+#'  several aspects of HTML document rendering will behave differently:
+#'
+#'  \itemize{ \item{The \code{theme} parameter does not work (you can still
+#'  provide styles using the \code{css} parameter). } \item{For the
+#'  \code{highlight} parameter, the default highlighting style will resolve to
+#'  "pygments" and the "textmate" highlighting style is not available }
+#'  \item{The \code{toc_float} parameter will not work. } \item{The
+#'  \code{code_folding} parameter will not work. } \item{Tabbed sections (as
+#'  described above) will not work.} \item{Navigation bars (as described above)
+#'  will not work. }\item{MathJax will not work if \code{self_contained} is
+#'  \code{TRUE} (these two options can't be used together in normal pandoc
+#'  templates). } }
+#'
+#'  Due to the above restrictions, you might consider using the \code{includes}
+#'  parameter as an alternative to providing a fully custom template.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' render("input.Rmd", html_document())
+#'
+#' render("input.Rmd", html_document(toc = TRUE))
+#' }
+#'
+#'@export
+html_document <- function(toc = FALSE,
+                          toc_depth = 3,
+                          toc_float = FALSE,
+                          number_sections = FALSE,
+                          section_divs = TRUE,
+                          fig_width = 7,
+                          fig_height = 5,
+                          fig_retina = 2,
+                          fig_caption = TRUE,
+                          dev = 'png',
+                          df_print = "default",
+                          code_folding = c("none", "show", "hide"),
+                          code_download = FALSE,
+                          smart = TRUE,
+                          self_contained = TRUE,
+                          theme = "default",
+                          highlight = "default",
+                          mathjax = "default",
+                          template = "default",
+                          extra_dependencies = NULL,
+                          css = NULL,
+                          includes = NULL,
+                          keep_md = FALSE,
+                          lib_dir = NULL,
+                          md_extensions = NULL,
+                          pandoc_args = NULL,
+                          ...) {
+
+  # build pandoc args
+  args <- c("--standalone")
+
+  # use section divs
+  if (section_divs)
+    args <- c(args, "--section-divs")
+
+  # table of contents
+  args <- c(args, pandoc_toc_args(toc, toc_depth))
+
+  md_extensions <- smart_extension(smart, md_extensions)
+
+  # toc_float
+  if (toc && !identical(toc_float, FALSE)) {
+
+    # must have a theme
+    if (is.null(theme))
+      stop("You must use a theme when specifying the 'toc_float' option")
+
+    # resolve options
+    toc_float_options <- list(collapsed = TRUE,
+                              smooth_scroll = TRUE,
+                              print = TRUE)
+    if (is.list(toc_float)) {
+      toc_float_options <- merge_lists(toc_float_options, toc_float)
+      toc_float <- TRUE
+    } else if (!isTRUE(toc_float)) {
+      stop("toc_float must be a logical or a list with options")
+    }
+
+    # dependencies
+    extra_dependencies <- append(extra_dependencies,
+                                 list(html_dependency_jquery(),
+                                      html_dependency_jqueryui(),
+                                      html_dependency_tocify()))
+
+    # flag for template
+    args <- c(args, pandoc_variable_arg("toc_float", "1"))
+
+    # selectors
+    selectors <- paste0("h", seq(1, toc_depth), collapse = ",")
+    args <- c(args, pandoc_variable_arg("toc_selectors", selectors))
+
+    # options
+    if (toc_float_options$collapsed)
+      args <- c(args, pandoc_variable_arg("toc_collapsed", "1"))
+    if (toc_float_options$smooth_scroll)
+      args <- c(args, pandoc_variable_arg("toc_smooth_scroll", "1"))
+    if (toc_float_options$print)
+      args <- c(args, pandoc_variable_arg("toc_print", "1"))
+  }
+
+  # template path and assets
+  if (identical(template, "default"))
+    args <- c(args, "--template",
+              pandoc_path_arg(rmarkdown_system_file("rmd/h/default.html")))
+  else if (!is.null(template))
+    args <- c(args, "--template", pandoc_path_arg(template))
+
+  # validate code_folding
+  code_folding <- match.arg(code_folding)
+
+  # navigation dependencies
+  if (!is.null(theme)) {
+    code_menu <- !identical(code_folding, "none") || code_download
+    source_embed <- code_download
+    extra_dependencies <- append(extra_dependencies,
+      list(
+        html_dependency_jquery(),
+        html_dependency_navigation(code_menu = code_menu,
+                                   source_embed = source_embed)
+      )
+    )
+  }
+
+  # highlight
+  args <- c(args, pandoc_html_highlight_args(template, highlight))
+
+  # add highlight.js html_dependency if required
+  if (identical(template, "default") && is_highlightjs(highlight)) {
+    extra_dependencies <- append(extra_dependencies, list(html_dependency_highlightjs(highlight)))
+  }
+
+  # numbered sections
+  if (number_sections)
+    args <- c(args, "--number-sections")
+
+  # additional css
+  for (css_file in css)
+    args <- c(args, "--css", pandoc_path_arg(css_file))
+
+  # manage list of exit_actions (backing out changes to knitr options)
+  exit_actions <- list()
+  on_exit <- function() {
+    for (action in exit_actions)
+      try(action())
+  }
+
+  # capture the source code if requested
+  source_code <- NULL
+  source_file <- NULL
+  pre_knit <- function(input, ...) {
+    if (code_download) {
+      source_file <<- basename(input)
+      source_code <<- paste0(
+        '<div id="rmd-source-code">',
+        base64enc::base64encode(input),
+        '</div>')
+    }
+  }
+
+  # pagedtable
+  if (identical(df_print, "paged")) {
+    extra_dependencies <- append(extra_dependencies,
+                                 list(html_dependency_pagedtable()))
+  }
+
+  # pre-processor for arguments that may depend on the name of the
+  # the input file AND which need to inject html dependencies
+  # (otherwise we could just call the pre_processor)
+  post_knit <- function(metadata, input_file, runtime, encoding, ...) {
+
+    # extra args
+    args <- c()
+
+    # navbar (requires theme)
+    if (!is.null(theme)) {
+
+      # add navbar to includes if necessary
+      navbar <- file.path(normalize_path(dirname(input_file)), "_navbar.html")
+
+      # if there is no _navbar.html look for a _navbar.yml
+      if (!file.exists(navbar)) {
+        navbar_yaml <- file.path(dirname(navbar), "_navbar.yml")
+        if (file.exists(navbar_yaml))
+          navbar <- navbar_html_from_yaml(navbar_yaml)
+        # if there is no _navbar.yml then look in site config (if we have it)
+        config <- site_config(input_file, encoding)
+        if (!is.null(config) && !is.null(config$navbar))
+          navbar <- navbar_html(config$navbar)
+      }
+
+      if (file.exists(navbar)) {
+
+        # include the navbar html
+        includes <- list(before_body = navbar)
+        args <- c(args, includes_to_pandoc_args(includes,
+                                  filter = if (is_shiny_classic(runtime))
+                                    function(x) normalize_path(x, mustWork = FALSE)
+                                  else
+                                    identity))
+
+        # flag indicating we need extra navbar css and js
+        args <- c(args, pandoc_variable_arg("navbar", "1"))
+        # variables controlling padding from navbar
+        args <- c(args, pandoc_body_padding_variable_args(theme))
+
+        # navbar icon dependencies
+        iconDeps <- navbar_icon_dependencies(navbar)
+        if (length(iconDeps) > 0)
+          knitr::knit_meta_add(list(iconDeps))
+      }
+    }
+
+    args
+  }
+
+  # pre-processor for arguments that may depend on the name of the
+  # the input file (e.g. ones that need to copy supporting files)
+  pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir,
+                            output_dir) {
+
+    # use files_dir as lib_dir if not explicitly specified
+    if (is.null(lib_dir))
+      lib_dir <- files_dir
+
+    # extra args
+    args <- c()
+
+    # track whether we have a code menu
+    code_menu <- FALSE
+
+    # code_folding
+    if (code_folding %in% c("show", "hide")) {
+      # must have a theme
+      if (is.null(theme))
+        stop("You must use a theme when specifying the 'code_folding' option")
+      args <- c(args, pandoc_variable_arg("code_folding", code_folding))
+      code_menu <- TRUE
+    }
+
+    # source_embed
+    if (code_download) {
+      if (is.null(theme))
+        stop("You must use a theme when specifying the 'code_download' option")
+      args <- c(args, pandoc_variable_arg("source_embed", source_file))
+      sourceCodeFile <- tempfile(fileext = ".html")
+      writeLines(source_code, sourceCodeFile)
+      args <- c(args, pandoc_include_args(after_body = sourceCodeFile))
+      code_menu <- TRUE
+    }
+
+    # code menu
+    if (code_menu)
+      args <- c(args, pandoc_variable_arg("code_menu", "1"))
+
+    # content includes (we do this here so that user include-in-header content
+    # goes after dependency generated content). make the paths absolute if
+    # making a Shiny document so we can resolve them even if rendering
+    # elsewhere.
+    args <- c(args, includes_to_pandoc_args(includes,
+                      filter = if (is_shiny_classic(runtime))
+                        function(x) normalize_path(x, mustWork = FALSE)
+                      else
+                        identity))
+
+    # return additional args
+    args
+  }
+
+  # return format
+  output_format(
+    knitr = knitr_options_html(fig_width, fig_height, fig_retina, keep_md, dev),
+    pandoc = pandoc_options(to = "html",
+                            from = from_rmarkdown(fig_caption, md_extensions),
+                            args = args),
+    keep_md = keep_md,
+    clean_supporting = self_contained,
+    df_print = df_print,
+    pre_knit = pre_knit,
+    post_knit = post_knit,
+    pre_processor = pre_processor,
+    on_exit = on_exit,
+    base_format = html_document_base(smart = smart, theme = theme,
+                                     self_contained = self_contained,
+                                     lib_dir = lib_dir, mathjax = mathjax,
+                                     template = template,
+                                     pandoc_args = pandoc_args,
+                                     extra_dependencies = extra_dependencies,
+                                     ...)
+  )
+}
+
+
+#' Knitr options for an HTML output format
+#'
+#' Define knitr options for an R Markdown output format that creates
+#' HTML output.
+#'
+#' @inheritParams html_document
+#'
+#' @return An list that can be passed as the \code{knitr} argument of the
+#'   \code{\link{output_format}} function.
+#'
+#' @seealso \link{knitr_options}, \link{output_format}
+#'
+#' @export
+knitr_options_html <- function(fig_width, fig_height, fig_retina, keep_md, dev = 'png') {
+
+  opts_chunk <- list(dev = dev,
+                     dpi = 96,
+                     fig.width = fig_width,
+                     fig.height = fig_height,
+                     fig.retina = fig_retina)
+
+  if (keep_md)
+    opts_chunk$fig.retina <- NULL
+
+  knitr_options(opts_chunk = opts_chunk)
+}
+
+themes <- function() {
+  c("default",
+    "cerulean",
+    "journal",
+    "flatly",
+    "readable",
+    "spacelab",
+    "united",
+    "cosmo",
+    "lumen",
+    "paper",
+    "sandstone",
+    "simplex",
+    "yeti")
+}
+
+html_highlighters <- function() {
+  c(highlighters(), "textmate")
+}
+
+default_mathjax <- function() {
+  paste0("https://mathjax.rstudio.com/latest/", mathjax_config())
+}
+
+mathjax_config <- function() {
+  "MathJax.js?config=TeX-AMS-MML_HTMLorMML"
+}
+
+# variable which controls body offset (depends on height of navbar in theme)
+pandoc_body_padding_variable_args <- function(theme) {
+
+  # height of navbar in bootstrap 3.3.5
+  navbarHeights <- c("default" = 51,
+                     "cerulean" = 51,
+                     "journal" = 61 ,
+                     "flatly" = 60,
+                     "readable" = 66,
+                     "spacelab" = 52,
+                     "united" = 51,
+                     "cosmo" = 51,
+                     "lumen" = 54,
+                     "paper" = 64,
+                     "sandstone" = 61,
+                     "simplex" = 41,
+                     "yeti" = 45)
+
+  # body padding is navbar height
+  bodyPadding <- navbarHeights[[theme]]
+
+  # header padding is bodyPadding + 5
+  headerPadding <- bodyPadding + 5
+
+  # return variables
+  c(pandoc_variable_arg("body_padding", bodyPadding),
+    pandoc_variable_arg("header_padding", headerPadding))
+}
+
+navbar_html_from_yaml <- function(navbar_yaml) {
+
+  # parse the yaml
+  navbar <- yaml_load_file_utf8(navbar_yaml)
+
+  # generate the html
+  navbar_html(navbar)
+}
+
+
+#' Create a navbar HTML file from a navbar definition
+#'
+#' @param navbar Navbar definition
+#' @param links List of navbar links
+#' @return Path to temporary file with navbar definition
+#'
+#' @keywords internal
+#' @export
+navbar_html <- function(navbar) {
+
+  # title and type
+  if (is.null(navbar$title))
+    navbar$title <- ""
+  if (is.null(navbar$type))
+    navbar$type <- "default"
+
+  # menu entries
+  left <- navbar_links_html(navbar$left)
+  right <- navbar_links_html(navbar$right)
+
+  # build the navigation bar and return it as a temp file
+  template_file <- rmarkdown_system_file("rmd/h/_navbar.html")
+  template <- paste(readLines(template_file), collapse = "\n")
+  navbar_html <- sprintf(template,
+                         navbar$type,
+                         navbar$title,
+                         left,
+                         right)
+  as_tmpfile(navbar_html)
+}
+
+
+#' @keywords internal
+#' @name navbar_html
+#' @export
+navbar_links_html <- function(links) {
+  as.character(navbar_links_tags(links))
+}
+
+navbar_links_tags <- function(links) {
+  if (!is.null(links)) {
+    tags <- lapply(links, function(x) {
+
+      # sub-menu
+      if (!is.null(x$menu)) {
+        submenuLinks <- navbar_links_tags(x$menu)
+        tags$li(class = "dropdown",
+          tags$a(href = "#", class = "dropdown-toggle", `data-toggle` = "dropdown",
+                 role = "button", `aria-expanded` = "false",
+                   navbar_link_text(x, " ", tags$span(class = "caret"))),
+          tags$ul(class = "dropdown-menu", role = "menu", submenuLinks)
+        )
+
+      # divider
+      } else if (!is.null(x$text) && grepl("^\\s*-{3,}\\s*$", x$text)) {
+        tags$li(class = "divider")
+
+      # header
+      } else if (!is.null(x$text) && is.null(x$href)) {
+        tags$li(class = "dropdown-header", x$text)
+
+      # standard menu item
+      } else {
+        textTags <- navbar_link_text(x)
+        tags$li(tags$a(href = x$href, textTags))
+      }
+    })
+    tagList(tags)
+  } else {
+    tagList()
+  }
+}
+
+navbar_link_text <- function(x, ...) {
+  if (!is.null(x$icon)) {
+    # find the iconset
+    split <- strsplit(x$icon, "-")
+    if (length(split[[1]]) > 1)
+      iconset <- split[[1]][[1]]
+    else
+      iconset <- ""
+    tagList(tags$span(class = paste(iconset, x$icon)), " ", x$text, ...)
+  }
+  else
+    tagList(x$text, ...)
+}
+
+
+
diff --git a/R/html_document_base.R b/R/html_document_base.R
new file mode 100644
index 0000000..2bccd18
--- /dev/null
+++ b/R/html_document_base.R
@@ -0,0 +1,195 @@
+#' Base output format for HTML-based output formats
+#'
+#' Creates an HTML base output format suitable for passing as the
+#' \code{base_format} argument of the \code{\link{output_format}} function.
+#'
+#' @inheritParams html_document
+#'
+#' @param dependency_resolver A dependency resolver
+#' @param copy_resources Copy resources
+#' @param extra_dependencies Extra dependencies
+#' @param bootstrap_compatible Bootstrap compatible
+#' @param ... Ignored
+#'
+#' @return HTML base output format.
+#'
+#' @export
+html_document_base <- function(smart = TRUE,
+                               theme = NULL,
+                               self_contained = TRUE,
+                               lib_dir = NULL,
+                               mathjax = "default",
+                               pandoc_args = NULL,
+                               template = "default",
+                               dependency_resolver = NULL,
+                               copy_resources = FALSE,
+                               extra_dependencies = NULL,
+                               bootstrap_compatible = FALSE,
+                               ...) {
+
+  # default for dependency_resovler
+  if (is.null(dependency_resolver))
+    dependency_resolver <- html_dependency_resolver
+
+  args <- c()
+
+  # smart quotes, etc.
+  if (smart && !pandoc2.0())
+    args <- c(args, "--smart")
+
+  # no email obfuscation
+  args <- c(args, "--email-obfuscation", "none")
+
+  # self contained document
+  if (self_contained) {
+    if (copy_resources)
+      stop("Local resource copying is incompatible with self-contained documents.")
+    validate_self_contained(mathjax)
+    args <- c(args, "--self-contained")
+  }
+
+  # custom args
+  args <- c(args, pandoc_args)
+
+  preserved_chunks <- character()
+
+  output_dir <- ""
+
+  # dummy pre_knit and post_knit functions so that merging of outputs works
+  pre_knit <- function(input, ...) {}
+  post_knit <- function(metadata, input_file, runtime, ...) {}
+
+  # pre_processor
+  pre_processor <- function(metadata, input_file, runtime, knit_meta,
+                            files_dir, output_dir) {
+
+    args <- c()
+
+    # use files_dir as lib_dir if not explicitly specified
+    if (is.null(lib_dir))
+      lib_dir <<- files_dir
+
+    # copy supplied output_dir (for use in post-processor)
+    output_dir <<- output_dir
+
+    # handle theme
+    if (!is.null(theme)) {
+      theme <- match.arg(theme, themes())
+      if (identical(theme, "default"))
+        theme <- "bootstrap"
+      args <- c(args, "--variable", paste0("theme:", theme))
+    }
+
+    # resolve and inject extras, including dependencies specified by the format
+    # and dependencies specified by the user (via extra_dependencies)
+    format_deps <- list()
+    if (!is.null(theme)) {
+      format_deps <- append(format_deps, list(html_dependency_jquery(),
+                                              html_dependency_bootstrap(theme)))
+    }
+    else if (isTRUE(bootstrap_compatible) && is_shiny(runtime)) {
+      # If we can add bootstrap for Shiny, do it
+      format_deps <- append(format_deps,
+                            list(html_dependency_bootstrap("bootstrap")))
+    }
+    format_deps <- append(format_deps, extra_dependencies)
+
+    extras <- html_extras_for_document(knit_meta, runtime, dependency_resolver,
+                                       format_deps)
+    args <- c(args, pandoc_html_extras_args(extras, self_contained, lib_dir,
+                                            output_dir))
+
+    # mathjax
+    args <- c(args, pandoc_mathjax_args(mathjax,
+                                        template,
+                                        self_contained,
+                                        lib_dir,
+                                        output_dir))
+
+    preserved_chunks <<- extract_preserve_chunks(input_file)
+
+    args
+  }
+
+  intermediates_generator <- function(original_input, encoding,
+                                      intermediates_dir) {
+    # copy intermediates; skip web resources if not self contained (pandoc can
+    # create references to web resources without the file present)
+    return(copy_render_intermediates(original_input, encoding,
+                                     intermediates_dir, !self_contained))
+  }
+
+  post_processor <- function(metadata, input_file, output_file, clean, verbose) {
+    # if there are no preserved chunks to restore and no resource to copy then no
+    # post-processing is necessary
+    if (length(preserved_chunks) == 0 && !isTRUE(copy_resources) && self_contained)
+      return(output_file)
+
+    # read the output file
+    output_str <- readLines(output_file, warn = FALSE, encoding = "UTF-8")
+
+    # if we preserved chunks, restore them
+    if (length(preserved_chunks) > 0) {
+      # Pandoc adds an empty <p></p> around the IDs of preserved chunks, and we
+      # need to remove these empty tags, otherwise we may have invalid HTML like
+      # <p><div>...</div></p>. For the reason of the second gsub(), see
+      # https://github.com/rstudio/rmarkdown/issues/133.
+      for (i in names(preserved_chunks)) {
+        output_str <- gsub(paste0("<p>", i, "</p>"), i, output_str,
+                           fixed = TRUE, useBytes = TRUE)
+        output_str <- gsub(paste0(' id="section-', i, '" '), ' ', output_str,
+                           fixed = TRUE, useBytes = TRUE)
+      }
+      output_str <- restorePreserveChunks(output_str, preserved_chunks)
+    }
+
+    if (copy_resources) {
+      # The copy_resources flag copies all the resources referenced in the
+      # document to its supporting files directory, and rewrites the document to
+      # use the copies from that directory.
+      output_str <- copy_html_resources(paste(output_str, collapse = "\n"),
+                                              lib_dir, output_dir)
+    } else if (!self_contained) {
+      # if we're not self-contained, find absolute references to the output
+      # directory and replace them with relative ones
+      image_relative <- function(img_src, src) {
+        in_file <- utils::URLdecode(src)
+        # do not process paths that are already relative
+        if (grepl('^[.][.]', in_file)) return(img_src)
+        if (length(in_file) && file.exists(in_file)) {
+          img_src <- sub(
+            src, utils::URLencode(normalized_relative_to(output_dir, in_file)),
+            img_src, fixed = TRUE)
+        }
+        img_src
+      }
+      output_str <- process_images(output_str, image_relative)
+    }
+
+    writeLines(output_str, output_file, useBytes = TRUE)
+    output_file
+  }
+
+  output_format(
+    knitr = NULL,
+    pandoc = pandoc_options(to = "html", from = NULL, args = args),
+    keep_md = FALSE,
+    clean_supporting = FALSE,
+    pre_knit = pre_knit,
+    post_knit = post_knit,
+    pre_processor = pre_processor,
+    intermediates_generator = intermediates_generator,
+    post_processor = post_processor
+  )
+}
+
+extract_preserve_chunks <- function(input_file, extract = extractPreserveChunks) {
+  # The input file is converted to UTF-8 from its native encoding prior
+  # to calling the preprocessor (see ::render)
+  input_str <- readLines(input_file, warn = FALSE, encoding = "UTF-8")
+  preserve <- extract(input_str)
+  if (!identical(preserve$value, input_str))
+    writeLines(enc2utf8(preserve$value), input_file, useBytes = TRUE)
+  preserve$chunks
+}
+
diff --git a/R/html_extras.R b/R/html_extras.R
new file mode 100644
index 0000000..02fdd43
--- /dev/null
+++ b/R/html_extras.R
@@ -0,0 +1,43 @@
+
+# resolve the html extras for a document (dependencies and arbitrary html to
+# inject into the document)
+html_extras_for_document <- function(knit_meta, runtime, dependency_resolver,
+                                     format_deps = NULL) {
+
+  extras <- list()
+
+  # merge the dependencies discovered with the dependencies of this format and
+  # dependencies discovered in knit_meta
+  all_dependencies <- if (is.null(format_deps)) list() else format_deps
+  all_dependencies <- append(all_dependencies, flatten_html_dependencies(knit_meta))
+  extras$dependencies <- dependency_resolver(all_dependencies)
+
+  # return extras
+  extras
+}
+
+# convert html extras to the pandoc args required to include them
+pandoc_html_extras_args <- function(extras, self_contained, lib_dir,
+                                    output_dir) {
+
+  args <- c()
+
+  # dependencies
+  dependencies <- extras$dependencies
+  if (length(dependencies) > 0) {
+    if (self_contained)
+      file <- as_tmpfile(html_dependencies_as_string(dependencies, NULL, NULL))
+    else
+      file <- as_tmpfile(html_dependencies_as_string(dependencies, lib_dir,
+                                                     output_dir))
+    args <- c(args, pandoc_include_args(in_header = file))
+  }
+
+  # extras
+  args <- c(args, pandoc_include_args(
+                    in_header = as_tmpfile(extras$in_header),
+                    before_body = as_tmpfile(extras$before_body),
+                    after_body = as_tmpfile(extras$after_body)))
+
+  args
+}
diff --git a/R/html_fragment.R b/R/html_fragment.R
new file mode 100644
index 0000000..0d73640
--- /dev/null
+++ b/R/html_fragment.R
@@ -0,0 +1,49 @@
+#' Convert to an HTML fragment.
+#'
+#' An html fragment is suitable for inclusion into an external html page. See
+#' \code{\link{html_document}} for full details - this is a minor variation that
+#' assumes you will include the output into an existing document (e.g. a blog
+#' post).
+#'
+#' @param mathjax \code{TRUE} to convert $ and $$ math blocks into MathJax
+#'   compatible output. Note that you'll still need to ensure that the page
+#'   where the fragment is included loads the required MathJax scripts.
+#'
+#' @details
+#'
+#' See the \href{http://rmarkdown.rstudio.com/html_document_format.html}{online
+#' documentation} for additional details on using the \code{html_fragment}
+#' format.
+#'
+#' @inheritParams html_document
+#' @param ... Additional arguments passed to \code{\link{html_document}}
+#' @return R Markdown output format to pass to \code{\link{render}}
+#' @export
+html_fragment <- function(number_sections = FALSE,
+                          section_divs = TRUE,
+                          fig_width = 7,
+                          fig_height = 5,
+                          fig_retina = 2,
+                          fig_caption = TRUE,
+                          dev = 'png',
+                          df_print = "default",
+                          smart = TRUE,
+                          mathjax = TRUE,
+                          includes = NULL,
+                          keep_md = FALSE,
+                          md_extensions = NULL,
+                          pandoc_args = NULL,
+                          ...) {
+
+  if (mathjax)
+    pandoc_args <- c(pandoc_args, "--mathjax")
+
+  html_document(
+    number_sections = number_sections, fig_width = fig_width,
+    fig_height = fig_height, fig_retina = fig_retina, fig_caption = fig_caption,
+    dev = dev, df_print = df_print, smart = smart, keep_md = keep_md,
+    md_extensions = md_extensions, pandoc_args = pandoc_args, includes = includes,
+    mathjax = NULL, section_divs = section_divs, highlight = NULL, theme = NULL, ...,
+    template = rmarkdown_system_file("rmd/fragment/default.html")
+  )
+}
diff --git a/R/html_notebook.R b/R/html_notebook.R
new file mode 100644
index 0000000..687a6a1
--- /dev/null
+++ b/R/html_notebook.R
@@ -0,0 +1,463 @@
+#' Convert to an HTML notebook
+#'
+#' Format for converting from R Markdown to an HTML notebook.
+#'
+#' @inheritParams html_document
+#' @param output_source Define an output source for \R chunks (ie,
+#'   outputs to use instead of those produced by evaluating the
+#'   underlying \R code). See \code{\link{html_notebook_output}} for
+#'   more details.
+#' @param self_contained Produce a standalone HTML file with no external
+#'   dependencies. Defaults to \code{TRUE}. In notebooks, setting this to
+#'   \code{FALSE} is not recommended, since the setting does not apply to
+#'   embedded notebook output such as plots and HTML widgets.
+#'
+#' @details For more details on the HTML file format produced by
+#'  \code{html_notebook}, see \href{http://rmarkdown.rstudio.com/r_notebook_format.html}{http://rmarkdown.rstudio.com/r_notebook_format.html}.
+#'
+#' @importFrom evaluate evaluate
+#' @export
+html_notebook <- function(toc = FALSE,
+                          toc_depth = 3,
+                          toc_float = FALSE,
+                          number_sections = FALSE,
+                          fig_width = 7,
+                          fig_height = 5,
+                          fig_retina = 2,
+                          fig_caption = TRUE,
+                          code_folding = "show",
+                          smart = TRUE,
+                          theme = "default",
+                          highlight = "textmate",
+                          mathjax = "default",
+                          extra_dependencies = NULL,
+                          css = NULL,
+                          includes = NULL,
+                          md_extensions = NULL,
+                          pandoc_args = NULL,
+                          output_source = NULL,
+                          self_contained = TRUE,
+                          ...)
+{
+  # some global state that is captured in pre_knit
+  exit_actions <- list()
+  on_exit <- function() {
+    for (action in exit_actions)
+      try(action())
+  }
+
+  paged_table_html_asis = function(x) {
+    knitr::asis_output(
+      paged_table_html(x)
+    )
+  }
+
+  # define pre_knit hook
+  pre_knit <- function(input, ...) {
+
+    if (is.function(output_source)) {
+
+      # pull out 'output_source'
+      validate_output_source(output_source)
+
+      # force knitr labeling (required for uniqueness of labels + cache coherence)
+      knitr.duplicate.label <- getOption("knitr.duplicate.label")
+      if (identical(knitr.duplicate.label, "allow")) {
+        warning("unsetting 'knitr.duplicate.label' for duration of render")
+        options(knitr.duplicate.label = "deny")
+        exit_actions <<- c(exit_actions, function() {
+          options(knitr.duplicate.label = knitr.duplicate.label)
+        })
+      }
+
+      # force default unnamed chunk labeling scheme (for cache coherence)
+      unnamed.chunk.label <- knitr::opts_knit$get("unnamed.chunk.label")
+      if (!identical(unnamed.chunk.label, "unnamed-chunk")) {
+        warning("reverting 'unnamed.chunk.label' to 'unnamed-chunk' for duration of render")
+        knitr::opts_knit$set(unnamed.chunk.label = "unnamed-chunk")
+        exit_actions <<- c(exit_actions, function() {
+          knitr::opts_knit$set(unnamed.chunk.label = unnamed.chunk.label)
+        })
+      }
+
+      # if our output_source comes with a pre_knit hook, evaluate that
+      output_source_pre_knit <- attr(output_source, "pre_knit", exact = TRUE)
+      if (is.function(output_source_pre_knit))
+        try(output_source_pre_knit())
+
+      # track knit context
+      chunk_options <- list()
+
+      # use an 'include' hook to track chunk options (any
+      # 'opts_hooks' hook will do; we just want this to be called
+      # on entry to any chunk)
+      include_hook <- knitr::opts_hooks$get("include")
+      exit_actions <<- c(exit_actions, function() {
+        knitr::opts_hooks$set(
+          include = if (is.null(include_hook)) {
+            function(options) options
+          } else {
+            include_hook
+          }
+        )
+      })
+
+      knitr::opts_hooks$set(include = function(options) {
+
+        # save context
+        chunk_options <<- options
+
+        # force R engine (so that everything goes through evaluate
+        # hook and hence 'output_source')
+        options$engine <- "R"
+        options$engine.opts <- NULL
+
+        # disable caching
+        options$cache <- FALSE
+
+        # call original hook
+        if (is.function(include_hook))
+          include_hook(options)
+        else
+          options
+      })
+
+      # set up evaluate hook (override any pre-existing evaluate hook)
+      evaluate_hook <- knitr::knit_hooks$get("evaluate")
+      exit_actions <<- c(exit_actions, function() {
+        knitr::knit_hooks$set(evaluate = evaluate_hook)
+      })
+
+      knitr::knit_hooks$set(evaluate = function(code, ...) {
+        chunk_options <- merge_render_context(chunk_options)
+        context <- list2env(chunk_options)
+        output <- output_source(code, context, ...)
+        as_evaluate_output(output, context, ...)
+      })
+    }
+
+    # set large max.print for knitr sql engine (since we will give
+    # it a scrolling treatment)
+    knit_sql_max_print <- knitr::opts_knit$get('sql.max.print');
+    if (is.null(knit_sql_max_print)) {
+      knitr::opts_knit$set(sql.max.print = 1000)
+      exit_actions <<- c(exit_actions, function() {
+        knitr::opts_knit$set(sql.max.print = knit_sql_max_print)
+      })
+    }
+
+    # set sql.print to use paged tables
+    knit_sql_print <- knitr::opts_knit$get('sql.print');
+    if (is.null(knit_sql_print)) {
+      knitr::opts_knit$set(sql.print = paged_table_html)
+      exit_actions <<- c(exit_actions, function() {
+        knitr::opts_knit$set(sql.print = knit_sql_print)
+      })
+    }
+  }
+
+  # pre-processor adds kable-scroll argument to give scrolling treatment for
+  # data frames (which are printed via kable by default)
+  pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir,
+                            output_dir) {
+    args <- c()
+    args <- c(args, pandoc_variable_arg("kable-scroll", "1"))
+    args
+  }
+
+  # post-processor to rename output file if necessary
+  post_processor <- function(metadata, input_file, output_file, clean, verbose) {
+
+    # rename to .nb.html if necessary
+    nb_output_file <- output_file
+    if (!ends_with_bytes(output_file, ".nb.html")) {
+      nb_output_file <- gsub("\\.html$", ".nb.html", output_file)
+      file.rename(output_file, nb_output_file)
+    }
+
+    nb_output_file
+  }
+
+  # these arguments to html_document are fixed so we need to
+  # flag them as invalid for users
+  fixed_args <- c("keep_md", "template", "lib_dir", "dev")
+  forwarded_args <- names(list(...))
+  for (arg in forwarded_args) {
+    if (arg %in% fixed_args)
+      stop("The ", arg, " option is not valid for the html_notebook format.")
+  }
+
+  # add dependencies
+  extra_dependencies <- append(extra_dependencies,
+                               list(html_dependency_pagedtable()))
+
+  # generate actual format
+  base_format <- html_document(toc = toc,
+                               toc_depth = toc_depth,
+                               toc_float = toc_float,
+                               number_sections = number_sections,
+                               fig_width = fig_width,
+                               fig_height = fig_height,
+                               fig_retina = fig_retina,
+                               fig_caption = fig_caption,
+                               code_folding = code_folding,
+                               smart = smart,
+                               theme = theme,
+                               highlight = highlight,
+                               mathjax = mathjax,
+                               extra_dependencies = extra_dependencies,
+                               css = css,
+                               includes = includes,
+                               md_extensions = md_extensions,
+                               pandoc_args = pandoc_args,
+                               self_contained = self_contained,
+                               # options forced for notebooks
+                               dev = "png",
+                               code_download = TRUE,
+                               keep_md = FALSE,
+                               template = "default",
+                               lib_dir = NULL,
+                               ...)
+
+  rmarkdown::output_format(
+    knitr = html_notebook_knitr_options(),
+    pandoc = NULL,
+    df_print = paged_table_html_asis,
+    pre_knit = pre_knit,
+    pre_processor = pre_processor,
+    post_processor = post_processor,
+    base_format =  base_format,
+    on_exit = on_exit
+  )
+}
+
+#' Parse an HTML Notebook
+#'
+#' Parse an HTML notebook, retrieving annotation information
+#' related to generated outputs in the document, as well as the
+#' original R Markdown source document.
+#'
+#' @param path The path to an R Notebook file (with extension \code{.nb.html}).
+#' @param encoding The document's encoding (assumend \code{"UTF-8"} by default).
+#'
+#' @details For more details on the HTML file format produced by
+#'  \code{html_notebook}, see \href{http://rmarkdown.rstudio.com/r_notebook_format.html}{http://rmarkdown.rstudio.com/r_notebook_format.html}.
+#'
+#' @export
+parse_html_notebook <- function(path, encoding = "UTF-8") {
+
+  contents <- read_lines_utf8(path, encoding = encoding)
+
+  re_comment  <- "^\\s*<!--\\s*rnb-([^-]+)-(begin|end)\\s*([^\\s-]+)?\\s*-->\\s*$"
+  re_document <- "^<div id=\"rmd-source-code\">([^<]+)<\\/div>$"
+
+  rmd_contents <- NULL
+  builder <- list_builder()
+
+  for (row in seq_along(contents)) {
+    line <- contents[[row]]
+
+    # extract document contents
+    matches <- gregexpr(re_document, line, perl = TRUE)[[1]]
+    if (!identical(c(matches), -1L)) {
+      start <- c(attr(matches, "capture.start"))
+      end   <- start + c(attr(matches, "capture.length")) - 1
+      decoded <- rawToChar(base64enc::base64decode(substring(line, start, end)))
+      rmd_contents <- strsplit(decoded, "\\r?\\n", perl = TRUE)[[1]]
+      next
+    }
+
+    # extract information from comment
+    matches <- gregexpr(re_comment, line, perl = TRUE)[[1]]
+    if (identical(c(matches), -1L))
+      next
+
+    starts <- c(attr(matches, "capture.start"))
+    ends   <- starts + c(attr(matches, "capture.length")) - 1
+    strings <- substring(line, starts, ends)
+
+    n <- length(strings)
+    if (n < 2)
+      stop("invalid rnb comment")
+
+    # decode comment information and update stack
+    data <- list(row = row,
+                 label = strings[[1]],
+                 state = strings[[2]])
+
+    # add metadata if available
+    if (n >= 3 && nzchar(strings[[3]]))
+      data[["meta"]] <- base64_decode_object(strings[[3]])
+    else
+      data["meta"] <- list(NULL)
+
+    # append
+    builder$append(data)
+  }
+
+  annotations <- builder$data()
+
+  # extract header content
+  head_start <- grep("^\\s*<head>\\s*$",  contents, perl = TRUE)[[1]]
+  head_end   <- grep("^\\s*</head>\\s*$", contents, perl = TRUE)[[1]]
+
+  list(source = contents,
+       rmd = rmd_contents,
+       header = contents[head_start:head_end],
+       annotations = annotations)
+}
+
+html_notebook_annotated_output <- function(output, label, meta = NULL) {
+  before <- if (is.null(meta)) {
+    sprintf("\n<!-- rnb-%s-begin -->\n", label)
+  } else {
+    meta <- base64_encode_object(meta)
+    sprintf("\n<!-- rnb-%s-begin %s -->\n", label, meta)
+  }
+  after  <- sprintf("\n<!-- rnb-%s-end -->\n", label)
+  pasted <- paste(before, output, after, sep = "\n")
+  knitr::asis_output(pasted)
+}
+
+html_notebook_annotated_knitr_hook <- function(label, hook, meta = NULL) {
+  force(list(label, hook, meta))
+  function(x, ...) {
+
+    # call regular hooks and annotate output
+    output <- hook(x, ...)
+
+    # generate output
+    meta <- if (is.function(meta)) meta(x, output, ...)
+    html_notebook_annotated_output(output, label, meta)
+  }
+}
+
+html_notebook_knitr_options <- function() {
+
+  # save original hooks (restore after we've stored requisite
+  # hooks in our output format)
+  saved_hooks <- get_knitr_hook_list()
+  on.exit(set_knitr_hook_list(saved_hooks), add = TRUE)
+
+  # use 'render_markdown()' to get default hooks
+  knitr::render_markdown()
+
+  # store original hooks and annotate in format
+  orig_knit_hooks <- knitr::knit_hooks$get()
+
+  # generic hooks for knitr output
+  hook_names <- c("source", "chunk", "plot", "text", "output",
+                 "warning", "error", "message", "error")
+
+  meta_hooks <- list(
+    source  = html_notebook_text_hook,
+    output  = html_notebook_text_hook,
+    warning = html_notebook_text_hook,
+    message = html_notebook_text_hook,
+    error   = html_notebook_text_hook
+  )
+
+  knit_hooks <- lapply(hook_names, function(hook_name) {
+    html_notebook_annotated_knitr_hook(hook_name,
+                                       orig_knit_hooks[[hook_name]],
+                                       meta_hooks[[hook_name]])
+  })
+  names(knit_hooks) <- hook_names
+
+  # use a custom 'chunk' hook that ensures that html comments
+  # do not get indented
+  chunk_hook <- knitr::knit_hooks$get("chunk")
+  knit_hooks$chunk <- function(x, options) {
+
+    # update chunk line
+    context <- render_context()
+    context$chunk.index <- context$chunk.index + 1
+
+    # call original hook
+    output <- chunk_hook(x, options)
+
+    # clean up indentation for html
+    if (!is.null(options$indent)) {
+      output <- gsub("\n\\s*<!-- rnb-", "\n<!-- rnb-", output, perl = TRUE)
+    }
+
+    # write annotated output
+    html_notebook_annotated_output(output, "chunk")
+  }
+
+  opts_chunk <- list(render = html_notebook_render_hook,
+                     comment = NA)
+
+  # return as knitr options
+  rmarkdown::knitr_options(knit_hooks = knit_hooks,
+                           opts_chunk = opts_chunk)
+}
+
+html_notebook_text_hook <- function(input, output, ...) {
+  list(data = input)
+}
+
+html_notebook_render_hook <- function(x, ...) {
+  output <- knitr::knit_print(x, ...)
+  if (inherits(x, "htmlwidget"))
+    return(notebook_render_html_widget(output))
+  output
+}
+
+prepare_evaluate_output <- function(output, ...) {
+  UseMethod("prepare_evaluate_output")
+}
+
+#' @export
+prepare_evaluate_output.htmlwidget <- function(output, ...) {
+  widget <- knitr::knit_print(output)
+  meta <- attr(widget, "knit_meta")
+  asis <- knitr::asis_output(c(widget))
+  annotated <- html_notebook_annotated_output(asis, "htmlwidget", meta)
+  attr(annotated, "knit_meta") <- meta
+  annotated
+}
+
+#' @export
+prepare_evaluate_output.knit_asis <- function(output, ...) {
+  output
+}
+
+#' @export
+prepare_evaluate_output.list <- function(output, ...) {
+  lapply(output, prepare_evaluate_output)
+}
+
+#' @export
+prepare_evaluate_output.default <- function(output, ...) {
+  output
+}
+
+as_evaluate_output <- function(output, context, ...) {
+  prepared <- prepare_evaluate_output(output)
+  if (!is.list(prepared))
+    prepared <- list(prepared)
+  prepared
+}
+
+validate_output_source <- function(output_source) {
+
+  # error message to report
+  required_signature <- "function(code, context, ...) {}"
+  prefix <- "'output_source' should be a function with signature"
+  error_msg <- sprintf("%s '%s'", prefix, required_signature)
+
+  # ensure function
+  if (!is.function(output_source))
+    stop(error_msg, call. = FALSE)
+
+  # check formals
+  fmls <- names(formals(output_source))
+  if (length(fmls) < 3)
+    stop(error_msg, call. = FALSE)
+
+  if (!("..." %in% fmls))
+    stop(error_msg, call. = FALSE)
+
+  TRUE
+}
diff --git a/R/html_notebook_output.R b/R/html_notebook_output.R
new file mode 100644
index 0000000..33b7563
--- /dev/null
+++ b/R/html_notebook_output.R
@@ -0,0 +1,95 @@
+#' Generate R Notebook Output
+#'
+#' Utilities for generating output for the \code{html_notebook} format,
+#' through the \code{output_source} function attached to a
+#' \code{\link{output_format}}.
+#'
+#' @param path  A path to a file. For functions accepting both \code{path}
+#'   and \code{bytes}, if \code{bytes} is \code{NULL}, the bytewise contents
+#'   will be obtained by reading the file.
+#' @param bytes The bytewise representation of content.
+#' @param html Arbitrary HTML content to insert.
+#' @param attributes A named \R list of HTML attributes. These will be
+#'   escaped and inserted into the generated HTML as appropriate.
+#' @param code Source code.
+#' @param meta An \R list of arbitrary meta-data. The data will
+#'   be converted to JSON, base64-encoded, and injected into the header comment.
+#' @param format The image format; one of \code{"png"} or \code{"jpeg"}.
+#'
+#' @details For more details on the HTML file format produced by
+#'  \code{html_notebook}, see \href{http://rmarkdown.rstudio.com/r_notebook_format.html}{http://rmarkdown.rstudio.com/r_notebook_format.html}.
+#'
+#' @name html_notebook_output
+NULL
+
+#' Generate R Notebook Metadata
+#'
+#' A structured helper for the construction of metadata used by the
+#' R Notebook output functions. See \code{\link{html_notebook_output}} for
+#' more details.
+#'
+#' @param iframe Boolean; should output be shown in an \code{<iframe>}?
+#' @export
+html_notebook_metadata <- function(iframe = TRUE) {
+  list(iframe = iframe)
+}
+
+html_notebook_render_base64_data <- function(path = NULL,
+                                             bytes = NULL,
+                                             attributes = NULL,
+                                             format)
+{
+  # read (if necessary) and encode data
+  if (is.null(bytes))
+    bytes <- read_file(path, binary = TRUE)
+  encoded <- base64enc::base64encode(bytes)
+
+  # generate html attributes
+  sprintf(format, to_html_attributes(attributes), encoded)
+}
+
+#' @name html_notebook_output
+#' @export
+html_notebook_output_html <- function(html,
+                                      meta = NULL)
+{
+  html_notebook_annotated_output(paste(html, collapse = "\n"), "html", meta)
+}
+
+#' @name html_notebook_output
+#' @export
+html_notebook_output_img <- function(path = NULL,
+                                     bytes = NULL,
+                                     attributes = NULL,
+                                     meta = NULL,
+                                     format = c("png", "jpeg"))
+{
+  template <- paste0('<img%s src="data:image/', match.arg(format),
+                     ';base64,%s" />')
+  html <- html_notebook_render_base64_data(path, bytes, attributes, template)
+  html_notebook_annotated_output(html, "plot", meta)
+}
+
+#' @name html_notebook_output
+#' @export
+html_notebook_output_png <- html_notebook_output_img
+
+#' @name html_notebook_output
+#' @export
+html_notebook_output_code <- function(code,
+                                      attributes = list(class = "r"),
+                                      meta = NULL)
+{
+  # generate code
+  code <- sprintf(
+    "```%s\n%s\n```",
+    attributes$class,
+    paste(code, collapse = "\n")
+  )
+
+  # update metadata
+  meta$data <- code
+
+  # render
+  html_notebook_annotated_output(code, "source", meta)
+}
diff --git a/R/html_paged.R b/R/html_paged.R
new file mode 100644
index 0000000..34640ab
--- /dev/null
+++ b/R/html_paged.R
@@ -0,0 +1,226 @@
+# paged_table_type_sum and paged_table_obj_sum should be replaced
+# by tibble::type_sum once tibble supports R 3.0.0.
+paged_table_type_sum <- function(x) {
+  type_sum <- function(x)
+  {
+    format_sum <- switch(
+      class(x)[[1]], ordered = "ord", factor = "fctr", POSIXt = "dttm",
+      difftime = "time", Date = "date", data.frame = class(x)[[1]],
+      tbl_df = "tibble", NULL
+    )
+    if (!is.null(format_sum)) {
+      format_sum
+    } else if (!is.object(x)) {
+      switch(typeof(x),
+             logical = "lgl",
+             integer = "int",
+             double = "dbl",
+             character = "chr",
+             complex = "cplx",
+             closure = "fun",
+             environment = "env",
+             typeof(x)
+      )
+    } else if (!isS4(x)) {
+      paste0("S3: ", class(x)[[1]])
+    } else {
+      paste0("S4: ", methods::is(x)[[1]])
+    }
+  }
+
+  type_sum(x)
+}
+
+paged_table_obj_sum <- function(x) {
+  "%||%" <- function(x, y) {
+    if (is.null(x)) y else x
+  }
+
+  big_mark <- function(x, ...) {
+    mark <- if (identical(getOption("OutDec"), ",")) "." else ","
+    formatC(x, big.mark = mark, ...)
+  }
+
+  dim_desc <- function(x) {
+    dim <- dim(x) %||% length(x)
+    format_dim <- vapply(dim, big_mark, character(1))
+    format_dim[is.na(dim)] <- "??"
+    paste0(format_dim, collapse = " \u00d7 ")
+  }
+
+  is_atomic <- function(x) {
+    is.atomic(x) && !is.null(x)
+  }
+
+  is_vector <- function(x) {
+    is_atomic(x) || is.list(x)
+  }
+
+  paged_table_is_vector_s3 <- function(x) {
+    switch(class(x)[[1]],
+      ordered = TRUE,
+      factor = TRUE,
+      Date = TRUE,
+      POSIXct = TRUE,
+      difftime = TRUE,
+      data.frame = TRUE,
+      !is.object(x) && is_vector(x))
+  }
+
+  size_sum <- function(x) {
+    if (!paged_table_is_vector_s3(x)) return("")
+
+    paste0(" [", dim_desc(x), "]" )
+  }
+
+  obj_sum.default <- function(x) {
+    paste0(paged_table_type_sum(x), size_sum(x))
+  }
+
+  switch(class(x)[[1]],
+         POSIXlt = rep("POSIXlt", length(x)),
+         list = vapply(x, obj_sum.default, character(1L)),
+         paste0(paged_table_type_sum(x), size_sum(x))
+  )
+}
+
+paged_table_option <- function(option, default = NULL) {
+  if (is.null(knitr::opts_current$get(option)))
+    getOption(option, default)
+  else
+    knitr::opts_current$get(option)
+}
+
+#' @import methods
+paged_table_html <- function(x) {
+  addRowNames = paged_table_option("rownames.print")
+  addRowNames <- if (is.null(addRowNames)) (.row_names_info(x, type = 1) > 0) else addRowNames
+
+  maxPrint <- paged_table_option("max.print", 1000)
+
+  if ("tbl_sql" %in% class(x)) {
+    maxPrint <- paged_table_option("sql.max.print", 1000)
+  }
+
+  # hard stop at 10K items to print to prevent pandoc from failing
+  maxPrint <- if (maxPrint > 10000) 10000 else maxPrint
+
+  data <- as.data.frame(utils::head(x, maxPrint))
+
+  data <- if (is.null(data)) as.data.frame(list()) else data
+
+  columnNames <- names(data)
+  columnSequence <- seq_len(ncol(data))
+
+  columns <- lapply(
+    columnSequence,
+    function(columnIdx) {
+      column <- data[[columnIdx]]
+      baseType <- class(column)[[1]]
+      tibbleType <- paged_table_type_sum(column)
+
+      list(
+        label = if (!is.null(columnNames)) columnNames[[columnIdx]] else "",
+        name = columnIdx,
+        type = tibbleType,
+        align = if (baseType == "character" || baseType == "factor") "left" else "right"
+      )
+    }
+  )
+
+  names(data) <- as.character(columnSequence)
+
+  if (addRowNames) {
+    columns <- c(
+      list(
+        list(
+          label = "",
+          name = "_rn_",
+          type = "",
+          align = "left"
+        )
+      ),
+      columns
+    )
+
+    data$`_rn_` <- rownames(data)
+  }
+
+  columns <- unname(columns)
+
+  is_list <- vapply(data, is.list, logical(1))
+  data[is_list] <- lapply(data[is_list], function(x) {
+    summary <- paged_table_obj_sum(x)
+    paste0("<", summary, ">")
+  })
+
+  data <- as.data.frame(
+    lapply(
+      data,
+      function(y) {
+        # escape NAs from character columns
+        if (typeof(y) == "character") {
+          y[y == "NA"] <- "__NA__"
+        }
+
+        y <- encodeString(format(y, digits = getOption("digits")))
+
+        # trim spaces
+        gsub("^\\s+|\\s+$", "", y)
+      }
+    ),
+    stringsAsFactors = FALSE,
+    optional = TRUE)
+
+  rowCount <- paged_table_option("rows.print", 10)
+
+  pagedTableOptions <- list(
+    columns = list(
+      min = paged_table_option("cols.min.print"),
+      max = paged_table_option("cols.print", 10)
+    ),
+    rows = list(
+      min = rowCount,
+      max = rowCount
+    ),
+    pages = paged_table_option("pages.print")
+  )
+
+  pagedData <- list(
+    columns = columns,
+    data = if (length(data) == 0) list() else data,
+    options = pagedTableOptions
+  )
+
+  paste(
+    "<div data-pagedtable=\"false\">",
+    "  <script data-pagedtable-source type=\"application/json\">",
+    jsonlite::toJSON(pagedData),
+    "  </script>",
+    "</div>",
+    sep = "\n"
+  )
+}
+
+#' Create a table in HTML with support for paging rows and columns
+#'
+#' @param x a data frame to be rendered as a paged table.
+#'
+#' @export
+paged_table <- function(x) {
+  if (!is.data.frame(x)) {
+    stop("Only data frames can be used to create a paged_table.")
+  }
+
+  class(x) <- c("paged_df", "data.frame")
+  x
+}
+
+print.paged_df <- function(x) {
+  knitr::asis_output(
+    paged_table_html(x),
+    meta = list(
+      dependencies = html_dependency_pagedtable()
+    )
+  )
+}
diff --git a/R/html_parser.R b/R/html_parser.R
new file mode 100644
index 0000000..62f0a93
--- /dev/null
+++ b/R/html_parser.R
@@ -0,0 +1,88 @@
+# This function invokes a callback for each resource attribute discovered
+# in its first argument. The parameters to the callback are:
+#
+# 1) The tag discovered (e.g. "img")
+# 2) The resource attribute (e.g. "src")
+# 3) The attribute's value (e.g. "thumbnail.png")
+# 4) The position of the attribute value in the original string (in bytes)
+#
+call_resource_attrs <- function(html, callback = NULL)  {
+
+  # for performance reasons, we do all regexp matching on literal bytes, and
+  # reapply encoding after extracting matches
+  html_encoding <- Encoding(html)
+  Encoding(html) <- "bytes"
+
+  # use the fastest defaults we can here--PCRE, bytes (RE and input both UTF-8)
+  # as the HTML can be quite large
+  tags <- gregexpr(
+    "<\\s*(img|link|object|script|audio|video|embed|iframe)\\s+([^>]+)>", html,
+    perl = TRUE, useBytes = TRUE, ignore.case = TRUE)[[1]]
+
+  for (pos in seq_along(tags)) {
+    # extract the HTML tag in question
+    tagstart <- attr(tags, "capture.start", exact = TRUE)[pos,1]
+    tag <- substr(html, tagstart,  tagstart +
+                    attr(tags, "capture.length", exact = TRUE)[pos,1] - 1)
+    Encoding(tag) <- html_encoding
+    tag <- tolower(tag)
+
+    # determine the attribute to look for based on the tag name
+    tagattr <- switch(tag,
+                      img    = "src",
+                      link   = "href",
+                      object = "data",
+                      script = "src",
+                      audio  = "src",
+                      video  = "src",
+                      embed  = "src",
+                      iframe = "src")
+
+    # extract the tags
+    attrstart <- attr(tags, "capture.start", exact = TRUE)[pos,2]
+    attrs <- substr(html, attrstart, attrstart +
+                    attr(tags, "capture.length", exact = TRUE)[pos,2] - 1)
+
+    # see if one of the attributes if the one we're looking for
+    attrmatch <- regexpr(paste0("\\s*", tagattr,
+                                "\\s*=\\s*('[^']+'|\"[^\"]+\")"),
+                         attrs, ignore.case = TRUE, perl = TRUE,
+                         useBytes = TRUE)
+    if (attrmatch >= 0) {
+      matchstart <- attrstart +
+        attr(attrmatch, "capture.start", exact = TRUE) - 1
+      matchlength <- attr(attrmatch, "capture.length", exact = TRUE)
+
+      # before we attempt to extract the entire attribute value, check to see
+      # if it's a large data blob; if it is, skip it. note that substr() is
+      # very expensive on long strings so this is cheaper than just doing a
+      # prefix check immediately.
+      if (matchlength > 256) {
+        if (substr(html, matchstart + 1, matchstart + 5) == "data:") {
+          next
+        }
+      }
+
+      # extract the matching bytes, re-apply encoding, and invoke the callback
+      resource <- substr(html, matchstart + 1, matchstart + matchlength - 2)
+      Encoding(resource) <- html_encoding
+      callback(tag, tagattr, resource, matchstart + 1)
+    }
+  }
+}
+
+# as call_resource_attrs, but for CSS
+call_css_resource_attrs <- function(css, callback = NULL)  {
+  css_encoding <- Encoding(css)
+  Encoding(css) <- "bytes"
+
+  urls <- gregexpr("url\\s*\\(\\s*['\"]?([^'\")]+)['\"]?\\s*\\)", css,
+                   perl = TRUE, useBytes = TRUE, ignore.case = TRUE)[[1]]
+  for (pos in seq_along(urls)) {
+    urlstart <- attr(urls, "capture.start", exact = TRUE)[pos,1]
+    url <- substr(css, urlstart,  urlstart +
+                    attr(urls, "capture.length", exact = TRUE)[pos,1] - 1)
+    Encoding(url) <- css_encoding
+    callback("css", "url", url, urlstart)
+  }
+}
diff --git a/R/html_resource_copy.R b/R/html_resource_copy.R
new file mode 100644
index 0000000..4c3e0e5
--- /dev/null
+++ b/R/html_resource_copy.R
@@ -0,0 +1,120 @@
+# Given an HTML string, a library directory, and an output directory, copies the
+# HTML's dependencies as appropriate and rewrites the HTML to refer to those
+# files. If CSS files are among the dependencies, performs the same operation
+# on each after copying.
+copy_html_resources <- function(html_str, lib_dir, output_dir) {
+  resource_locator <- function(input_str, resource_copier) {
+    call_resource_attrs(input_str, function(node, att, src, idx) {
+      # copy the resource if needed
+      res_src <- resource_copier(node, att, src, idx)
+      if (is.null(res_src) || nchar(res_src) < 1)
+        return(NULL)
+
+      # if the resource is a CSS file, perform a similar rewriting of its
+      # content in the library directory
+      res_path <- file.path(output_dir, res_src)
+      if (identical(tolower(tools::file_ext(res_path)), "css") &&
+          file.exists(res_path)) {
+        css_content <- paste(readLines(res_path), collapse = "\n")
+        css_content <- copy_resources(css_content, lib_dir, lib_dir,
+                                      call_css_resource_attrs)
+        writeLines(css_content, res_path)
+      }
+    })
+  }
+  copy_resources(html_str, lib_dir, output_dir, resource_locator)
+}
+
+copy_resources <- function(input_str, lib_dir, output_dir, resource_locator) {
+  # ensure the lib directory exists
+  dir.create(lib_dir, recursive = TRUE, showWarnings = FALSE)
+  relative_lib <- normalized_relative_to(output_dir, lib_dir)
+
+  res_replacements <- c()
+
+  resource_copier <- function(node, att, src, idx) {
+    in_file <- utils::URLdecode(src)
+
+    # only process the file if (a) it isn't already in the library, and (b)
+    # it exists on the local file system (this also excludes external
+    # resources such as "http://foo/bar.png")
+    if (length(in_file) &&
+        substr(src, 1, nchar(lib_dir) + 1) != file.path(relative_lib, "") &&
+        file.exists(in_file)) {
+
+      # check to see if it's already in the library (by absolute path)
+      res_src <- normalized_relative_to(lib_dir, in_file)
+      if (same_path(res_src, in_file, mustWork = FALSE)) {
+        # not inside the library, copy it there
+        target_dir <- if (dirname(in_file) == ".")
+          lib_dir
+        else
+          file.path(lib_dir, dirname(in_file))
+        dir.create(target_dir, recursive = TRUE, showWarnings = FALSE)
+        target_res_file <- file.path(target_dir, basename(in_file))
+
+        # copy the file to the library
+        if (!file.exists(target_res_file)) {
+          file.copy(in_file, target_res_file)
+        }
+
+        if (identical(lib_dir, output_dir))
+          res_src <- in_file
+        else
+          res_src <- file.path(relative_lib, src)
+      } else {
+        # inside the library, fix up the URL
+        res_src <- file.path(relative_lib, res_src)
+      }
+
+      # replace the reference in the document and adjust the offset
+      if (!identical(src, res_src)) {
+        res_replacements <<- c(res_replacements, list(list(
+          pos = idx,
+          len = nchar(src),
+          text = res_src)))
+      }
+
+      res_src
+    }
+  }
+
+  # parse the HTML and copy the resources found
+  resource_locator(input_str, resource_copier)
+
+  # rewrite the HTML to refer to the copied resources
+  if (length(res_replacements) > 0) {
+    ch_pos <- 1
+    output_str <- ""
+
+    # we do all replacements in bytes for performance reasons--mark the
+    # output with byte encoding temporarily
+    prev_encoding <- Encoding(input_str)
+    Encoding(input_str) <- "bytes"
+    Encoding(output_str) <- "bytes"
+
+    for (res_rep in seq_along(res_replacements)) {
+      rep <- res_replacements[[res_rep]]
+
+      # the text from the last replacement to the current one
+      before <- substr(input_str, ch_pos, rep$pos - 1)
+      ch_pos <- rep$pos + rep$len
+
+      # the text from the current replacement to the end of the output,
+      # if applicable
+      after <- if (res_rep == length(res_replacements))
+        substring(input_str, ch_pos)
+      else
+        ""
+
+      # compose the next segment of the output from the text between
+      # replacements and the current replacement text
+      output_str <- paste(output_str, before, rep$text, after,
+                          sep = "")
+    }
+    input_str <- output_str
+    Encoding(input_str) <- prev_encoding
+  }
+
+  input_str
+}
diff --git a/R/html_resources.R b/R/html_resources.R
new file mode 100644
index 0000000..ef3ca53
--- /dev/null
+++ b/R/html_resources.R
@@ -0,0 +1,477 @@
+#' Find External Resource References
+#'
+#' Given an R Markdown document or HTML file, attempt to determine the set of
+#' additional files needed in order to render and display the document.
+#'
+#' @param input_file path to the R Markdown document or HTML file to process
+#' @param encoding the encoding of the document
+#'
+#' @details This routine applies heuristics in order to scan a document for
+#'   possible resource references.
+#'
+#'   In R Markdown documents, it looks for references to files implicitly
+#'   referenced in Markdown (e.g. \code{![alt](img.png)}), in the document's
+#'   YAML header, in raw HTML chunks, and as quoted strings in R code chunks
+#'   (e.g. \code{read.csv("data.csv")}).
+#'
+#'   Resources specified explicitly in the YAML header for R Markdown documents
+#'   are also returned. To specify resources in YAML, use the
+#'   \code{resource_files} key:
+#'
+#'   \preformatted{---
+#'title: My Document
+#'author: My Name
+#'resource_files:
+#'  - data/mydata.csv
+#'  - images/figure.png
+#'---}
+#'
+#'   Each item in the \code{resource_files} list can refer to:
+#'   \enumerate{
+#'   \item A single file, such as \code{images/figure.png}, or
+#'   \item A directory, such as \code{resources/data}, in which case all of the
+#'     directory's content will be recursively included, or
+#'   \item A wildcard pattern, such as \code{data/*.csv}, in which case all of
+#'     the files matching the pattern will be included. No recursion is done in
+#'     this case.
+#'   }
+#'
+#'   In HTML files (and raw HTML chunks in R Markdown documents), this routine
+#'   searches for resources specified in common tag attributes, such as
+#'   \code{<img src="...">}, \code{<link href="...">}, etc.
+#'
+#'   In all cases, only resources that exist on disk and are contained in the
+#'   document's directory (or a child thereof) are returned.
+#'
+#' @return A data frame with the following columns:
+#'   \describe{
+#'    \item{path}{The relative path from the document to the resource}
+#'    \item{explicit}{Whether the resource was specified explicitly
+#'      (\code{TRUE}) or discovered implicitly (\code{FALSE})}
+#'    \item{web}{Whether the resource is needed to display a Web page rendered
+#'      from the document}
+#'   }
+#'
+#' @export
+find_external_resources <- function(input_file,
+                                    encoding = getOption("encoding")) {
+  # ensure we're working with valid input
+  ext <- tolower(tools::file_ext(input_file))
+  if (!(ext %in% c("md", "rmd", "html", "htm", "r", "css"))) {
+    stop("Resource discovery is only supported for R Markdown files or HTML ",
+         "files.")
+  }
+  if (!file.exists(input_file)) {
+    stop("The input file file '", input_file, "' does not exist.")
+  }
+
+  # set up the frame we'll use to report results
+  discovered_resources <- data.frame(
+    path = character(0),
+    explicit = logical(0),
+    web = logical(0))
+  input_dir <- dirname(normalize_path(input_file))
+
+  # discover a single resource--tests a string to see if it corresponds to a
+  # resource on disk; if so, adds it to the list of known resources and returns
+  # TRUE
+  discover_single_resource <- function(path, explicit, web) {
+    if (is.character(path) &&
+        length(path) == 1 &&
+        path != "." && path != ".." &&
+        file.exists(file.path(input_dir, path))) {
+      ext <- tolower(tools::file_ext(file.path(input_dir, path)))
+      if (identical(ext, "r")) {
+        # if this is a .R script, look for resources it contains, too
+        discover_r_resources(file.path(input_dir, path),
+                             discover_single_resource)
+      } else if (identical(ext, "css")) {
+        # if it's a CSS file, look for files it references (e.g. fonts/images)
+        discover_css_resources(file.path(input_dir, path),
+                               discover_single_resource)
+      }
+      # if this is an implicitly discovered resource, it needs to refer to
+      # a file rather than a directory
+      if (!explicit && dir_exists(file.path(input_dir, path))) {
+        return(FALSE)
+      }
+      # this looks valid; remember it
+      discovered_resources <<- rbind(discovered_resources, data.frame(
+        path = path,
+        explicit = explicit,
+        web = web,
+        stringsAsFactors = FALSE))
+      TRUE
+    } else {
+      FALSE
+    }
+  }
+
+  # run the main resource discovery appropriate to the file type
+  if (ext %in% c("md", "rmd")) {
+    # discover R Markdown doc resources--scans the document itself as described
+    # in comments above, renders as Markdown, and invokes HTML discovery
+    # on the result
+    discover_rmd_resources(input_file, encoding, discover_single_resource)
+  } else if (ext %in% c("htm", "html")) {
+    # discover HTML resources
+    discover_html_resources(input_file, encoding, discover_single_resource)
+
+    # if the HTML file represents a rendered R Markdown document, it may have a
+    # sidecar _files folder; include that if it's present
+    sidecar_files_dir <- knitr_files_dir(input_file)
+    files_dir_info <- file.info(sidecar_files_dir)
+    if (isTRUE(files_dir_info$isdir)) {
+      # we probably auto-discovered some resources from _files--exclude those
+      # since they'll be covered by the directory
+      files_dir_prefix <- file.path(basename(sidecar_files_dir), "")
+      files_dir_matches <- substr(discovered_resources$path, 1,
+                                  nchar(files_dir_prefix)) == files_dir_prefix
+      discovered_resources <- discovered_resources[!files_dir_matches, ,
+                                                   drop = FALSE]
+
+      # add the directory itself
+      discovered_resources <- rbind(discovered_resources, data.frame(
+        path = files_dir_prefix,
+        explicit = FALSE,
+        web = TRUE,
+        stringsAsFactors = FALSE))
+    }
+  } else if (ext == "r") {
+    discover_r_resources(input_file, discover_single_resource)
+  } else if (ext == "css") {
+    discover_css_resources(input_file, discover_single_resource)
+  }
+
+  # clean row names (they're not meaningful)
+  rownames(discovered_resources) <- NULL
+
+  # convert paths from factors if necssary, and clean any redundant ./ leaders
+  discovered_resources$path <- as.character(discovered_resources$path)
+  has_prefix <- grepl("^\\./", discovered_resources$path)
+  discovered_resources$path[has_prefix] <- substring(
+    discovered_resources$path[has_prefix], 3)
+
+  discovered_resources
+}
+
+# discovers resources in a single HTML file with the given encoding
+discover_html_resources <- function(html_file, encoding,
+                                    discover_single_resource) {
+  # resource accumulator
+  discover_resource <- function(node, att, val, idx) {
+    res_file <- utils::URLdecode(val)
+    discover_single_resource(res_file, FALSE, TRUE)
+  }
+
+  # create a single string with all of the lines in the document
+  html_lines <- paste(
+      readLines(html_file, warn = FALSE, encoding = encoding), collapse = "\n")
+
+  # if the lines aren't encoded in UTF-8, re-encode them to UTF-8; this is
+  # necessary since we presume the encoding when parsing the HTML
+  if (encoding != "UTF-8") {
+    html_lines <- enc2utf8(html_lines)
+  }
+
+  # parse the HTML and invoke our resource discovery callbacks
+  call_resource_attrs(html_lines, discover_resource)
+}
+
+# discovers resources in a single R Markdown document
+discover_rmd_resources <- function(rmd_file, encoding,
+                                   discover_single_resource) {
+  # create a UTF-8 encoded Markdown file to serve as the resource discovery
+  # source
+  md_file <- tempfile(fileext = ".md")
+  input_dir <- dirname(normalize_path(rmd_file))
+  output_dir <- dirname(md_file)
+  rmd_content <- read_lines_utf8(rmd_file, encoding)
+  writeLines(rmd_content, md_file, useBytes = TRUE)
+
+  # create a vector of temporary files; anything in here will be cleaned up on
+  # exit
+  temp_files <- md_file
+  on.exit(unlink(temp_files, recursive = TRUE), add = TRUE)
+
+  # discovers render-time resources; if any are found, adds them to the list of
+  # discovered resources and copies them alongside the input document.
+  discover_render_resource <- function(output_render_file) {
+    if (discover_single_resource(output_render_file, FALSE, FALSE)) {
+      # mirror original directory structure so we don't need to mutate input
+      # prior to render
+      output_target_file <- file.path(output_dir, output_render_file)
+      if (!file.exists(dirname(output_target_file))) {
+        dir.create(dirname(output_target_file), showWarnings = FALSE,
+                   recursive = TRUE)
+      }
+
+      # copy the original resource to the temporary render folder
+      file.copy(file.path(input_dir, output_render_file),
+                output_target_file)
+
+      # clean up this file when we're done
+      temp_files <<- c(temp_files, output_target_file)
+    }
+  }
+
+  # parse the YAML front matter to discover resources named there
+  front_matter <- parse_yaml_front_matter(
+    readLines(md_file, warn = FALSE, encoding = "UTF-8"))
+
+  # Check for content referred to by output format calls to the includes
+  # function (for generating headers/footers/etc. at render time), and for
+  # references to files in pandoc arguments.
+  #
+  # These will be needed to produce even a vanilla Markdown variant of the input
+  # document, so copy them to the temporary folder in preparation for rendering
+  # (in addition to marking them as required resources).
+  output_formats <- front_matter[["output"]]
+  if (is.list(output_formats)) {
+    for (output_format in output_formats) {
+      if (is.list(output_format)) {
+        output_render_files <- c(output_format$includes,
+                                 output_format$pandoc_args,
+                                 output_format$logo)
+        for (output_render_file in output_render_files) {
+          discover_render_resource(output_render_file)
+        }
+      }
+    }
+  }
+
+  # check for explicitly named resources
+  if (!is.null(front_matter$resource_files)) {
+    lapply(front_matter$resource_files, function(res) {
+      explicit_res <- if (is.character(res)) {
+        list(path = res, explicit = TRUE, web = is_web_file(res))
+      } else if (is.list(res) && length(names(res)) > 0) {
+        # list--happens when web flag is specified explicitly in YAML.
+        list(path = names(res)[[1]],
+             explicit = TRUE,
+             web = if (is.null(res$web)) is_web_file(res) else res$web)
+      } else  {
+        # no idea what this is, skip it
+        NULL
+      }
+
+      # check the extracted filename to see if it exists
+      if (!is.null(explicit_res)) {
+        if (grepl("*", explicit_res$path, fixed = TRUE)) {
+          # if the resource file spec includes a wildcard, list the files
+          # that match the pattern
+          files <- list.files(
+            path = file.path(input_dir, dirname(explicit_res$path)),
+            pattern = utils::glob2rx(basename(explicit_res$path)),
+            recursive = FALSE,
+            include.dirs = FALSE)
+          lapply(files, function(f) {
+            discover_single_resource(file.path(dirname(explicit_res$path), f),
+                                     TRUE, web = is_web_file(f))
+           })
+        } else {
+          # no wildcard, see whether this resource refers to a directory or to
+          # an individual file
+          info <- file.info(file.path(input_dir, explicit_res$path))
+          if (is.na(info$isdir)) {
+            # implies that the file doesn't exist (should we warn here?)
+            NULL
+          } else if (isTRUE(info$isdir)) {
+            # if the resource file spec is a directory, include all the files in
+            # the directory, recursively
+            files <- list.files(
+              path = file.path(input_dir, explicit_res$path),
+              recursive = TRUE,
+              include.dirs = FALSE)
+            lapply(files, function(f) {
+              discover_single_resource(file.path(explicit_res$path, f), TRUE,
+                   web = is_web_file(f))
+            })
+          } else {
+            # isdir is false--this is an individual file; return it
+            discover_single_resource(explicit_res$path, explicit_res$explicit,
+                                     explicit_res$web)
+          }
+        }
+      } else {
+        discover_single_resource(explicit_res$path, explicit_res$explicit,
+                                 explicit_res$web)
+      }
+    })
+  }
+
+  # check for bibliography and csl files at the top level
+  for (bibfile in c("bibliography", "csl")) {
+    if (!is.null(front_matter[[bibfile]])) {
+      discover_render_resource(front_matter[[bibfile]])
+    }
+  }
+
+  # check for parameter values that look like files.
+  if (!is.null(front_matter$params)) {
+    # This is the raw parameter information and has not had any YAML tag
+    # processing performed. See `knitr:::resolve_params`.
+    lapply(front_matter$params, function(param) {
+      if (is.list(param)) {
+        if (identical(param$input, "file")) {
+          if (!is.null(param$value)) {
+            # We treat param filenames as non-web resources.
+            discover_single_resource(param$value, TRUE, FALSE)
+          }
+        }
+      }
+    })
+  }
+
+  # check for knitr child documents in R Markdown documents
+  if (tolower(tools::file_ext(rmd_file)) == "rmd") {
+    chunk_lines <- gregexpr(knitr::all_patterns$md$chunk.begin, rmd_content,
+                            perl = TRUE)
+    for (idx in seq_along(chunk_lines)) {
+      chunk_line <- chunk_lines[idx][[1]]
+      if (is.na(chunk_line) || chunk_line < 0)
+        next
+      chunk_start <- attr(chunk_line, "capture.start", exact = TRUE) + 1
+      chunk_text <- substr(rmd_content[idx], chunk_start,
+                           chunk_start + attr(chunk_line, "capture.length",
+                                              exact = TRUE) - 2)
+      for (child_expr in c("\\bchild\\s*=\\s*'([^']+)'",
+                           "\\bchild\\s*=\\s*\"([^\"]+)\"")) {
+        child_match <- gregexpr(child_expr, chunk_text, perl = TRUE)[[1]]
+        if (child_match > 0) {
+          child_start <- attr(child_match, "capture.start", exact = TRUE)
+          child_text <- substr(chunk_text, child_start,
+                               child_start + attr(child_match, "capture.length",
+                                                  exact = TRUE) - 1)
+          discover_render_resource(child_text)
+        }
+      }
+    }
+  }
+
+  # render "raw" markdown to HTML
+  html_file <- tempfile(fileext = ".html")
+  on.exit(unlink(html_file), add = TRUE)
+
+  # check to see what format this document is going to render as; if it's a
+  # format that produces HTML, let it render as-is, but if it isn't, render as
+  # html_document to pick up dependencies
+  output_format <- output_format_from_yaml_front_matter(rmd_content,
+                                                        encoding = encoding)
+  output_format_function <- eval(parse(text = output_format$name))
+  override_output_format <- if (output_format_function()$pandoc$to == "html")
+                              NULL
+                            else
+                              "html_document"
+
+  html_file <- render(input = md_file, output_file = html_file,
+                      output_format = override_output_format,
+                      output_options = list(self_contained = FALSE),
+                      quiet = TRUE,
+                      encoding = "UTF-8")
+
+  # clean up output file and its supporting files directory
+  temp_files <- c(temp_files, html_file, knitr_files_dir(md_file))
+
+  # run the HTML resource discovery mechanism on the rendered output
+  discover_html_resources(html_file, "UTF-8", discover_single_resource)
+
+  # if this is an R Markdown file, purl the file to extract just the R code
+  if (tolower(tools::file_ext(rmd_file)) == "rmd") {
+    r_file <- tempfile(fileext = ".R")
+    on.exit(unlink(r_file), add = TRUE)
+    knitr::purl(md_file, output = r_file, quiet = TRUE, documentation = 0,
+                encoding = "UTF-8")
+    temp_files <- c(temp_files, r_file)
+    discover_r_resources(r_file, discover_single_resource)
+  }
+}
+
+discover_r_resources <- function(r_file, discover_single_resource) {
+  # read the lines from the R file
+  r_lines <- readLines(r_file, warn = FALSE, encoding = "UTF-8")
+
+  # clean comments from the R code (simply; consider: # inside strings)
+  r_lines <- sub("#.*$", "", r_lines)
+
+  # find quoted strings in the code and attempt to ascertain whether they are
+  # files on disk
+  r_lines <- paste(r_lines, collapse = "\n")
+  quoted_strs <- Reduce(c, lapply(c("\"[^\"\n]*\"", "'[^'\n]*'"), function(pat) {
+    matches <- unlist(regmatches(r_lines, gregexpr(pat, r_lines)))
+    substr(matches, 2, nchar(matches) - 1)
+  }))
+
+  # consider any quoted string containing a valid relative path to a file that
+  # exists on disk to be a reference
+  for (quoted_str in quoted_strs) {
+    if (nchar(quoted_str) > 0)
+       discover_single_resource(quoted_str, FALSE, is_web_file(quoted_str))
+  }
+}
+
+# copies the external resources needed to render original_input into
+# intermediates_dir; with skip_web, skips web resources. returns a character
+# vector containing paths to all resources copied.
+copy_render_intermediates <- function(original_input, encoding,
+                                      intermediates_dir, skip_web) {
+  # start with an empty set of intermediates
+  intermediates <- c()
+
+  # extract all the resources used by the input file; note that this actually
+  # runs another (non-knitting) render, and that recursion is avoided because
+  # we explicitly render with self-contained = FALSE while discovering
+  # resources
+  resources <- find_external_resources(original_input, encoding)
+  dest_dir <- normalize_path(intermediates_dir)
+  source_dir <- dirname(normalize_path(original_input))
+
+  # process each returned reosurce
+  by(resources, seq_len(nrow(resources)), function(res) {
+    # skip web resources if requested
+    if (skip_web && res$web)
+      return()
+
+    # compute the new path to this file in the intermediates folder, and
+    # create the hosting folder if it doesn't exist
+    dest <- file.path(dest_dir, res$path)
+    if (!file.exists(dirname(dest)))
+      dir.create(dirname(dest), recursive = TRUE)
+
+    # copy and remember to clean up this file later
+    file.copy(file.path(source_dir, res$path), dest)
+    intermediates <<- c(intermediates, dest)
+  })
+
+  # return the list of files we generated
+  intermediates
+}
+
+discover_css_resources <- function(css_file, discover_single_resource) {
+  css_lines <- readLines(css_file, warn = FALSE, encoding = "UTF-8")
+
+  discover_resource <- function(node, att, val, idx) {
+    res_file <- utils::URLdecode(val)
+    discover_single_resource(res_file, FALSE, TRUE)
+  }
+
+  call_css_resource_attrs(paste(css_lines, collapse = "\n"),
+                                discover_resource)
+}
+
+# given a filename, return true if the file appears to be a web file
+is_web_file <- function(filename) {
+  tolower(tools::file_ext(filename)) %in% c(
+    "css",
+    "gif",
+    "htm",
+    "html",
+    "jpeg",
+    "jpg",
+    "js",
+    "mp3",
+    "mp4",
+    "png",
+    "wav")
+}
+
diff --git a/R/html_vignette.R b/R/html_vignette.R
new file mode 100644
index 0000000..802fbf1
--- /dev/null
+++ b/R/html_vignette.R
@@ -0,0 +1,71 @@
+#' Convert to an HTML vignette.
+#'
+#' A HTML vignette is a lightweight alternative to \code{\link{html_document}}
+#' suitable for inclusion in packages to be released to CRAN. It reduces the
+#' size of a basic vignette from 100k to around 10k.
+#'
+#' Compared to \code{html_document}, it:
+#'
+#' \itemize{
+#'   \item never uses retina figures
+#'   \item never uses a theme
+#'   \item has a smaller default figure size
+#'   \item uses a custom css stylesheet
+#'   \item uses a custom highlight scheme
+#'  }
+#'
+#' @details
+#'
+#' See the \href{http://rmarkdown.rstudio.com/package_vignette_format.html}{online
+#' documentation} for additional details on using the \code{html_vignette} format.
+#'
+#' @inheritParams html_document
+#' @param ... Additional arguments passed to \code{\link{html_document}}. Please
+#'   note that \code{theme}, \code{fig_retina} and \code{highlight} are hard
+#'   coded. Setting any of those will yield an error.
+#' @param readme Use this vignette as the package README.md file (i.e. render
+#'   it as README.md to the package root). Note that if there are image files
+#'   within your vignette you should be sure to add README_files to .Rbuildignore
+#' @return R Markdown output format to pass to \code{\link{render}}
+#' @export
+html_vignette <- function(fig_width = 3,
+                          fig_height = 3,
+                          dev = 'png',
+                          df_print = "default",
+                          css = NULL,
+                          keep_md = FALSE,
+                          readme = FALSE,
+                          ...) {
+
+  if (is.null(css)) {
+    css <- system.file("rmarkdown", "templates", "html_vignette" ,"resources",
+      "vignette.css", package = "rmarkdown")
+  }
+
+  pre_knit <- function(input, ...) {
+    if (readme) {
+      rmarkdown::render(input,
+                        output_format = "github_document",
+                        output_options = list(html_preview = FALSE),
+                        output_file = "README.md",
+                        output_dir = dirname(dirname(input)),
+                        quiet = TRUE)
+    }
+  }
+
+  output_format(
+    knitr = NULL,
+    pandoc = NULL,
+    df_print = df_print,
+    pre_knit = pre_knit,
+    keep_md = keep_md,
+    base_format = html_document(fig_width = fig_width,
+                                fig_height = fig_height,
+                                dev = dev,
+                                fig_retina = NULL,
+                                css = css,
+                                theme = NULL,
+                                highlight = "pygments",
+                                ...)
+  )
+}
diff --git a/R/includes.R b/R/includes.R
new file mode 100644
index 0000000..ae87b74
--- /dev/null
+++ b/R/includes.R
@@ -0,0 +1,61 @@
+#' Include content within output
+#'
+#' Specify additional content to be included within an output document.
+#'
+#' @param in_header One or more files with content to be included in the
+#'   header of the document.
+#' @param before_body One or more files with content to be included before
+#'   the document body.
+#' @param after_body One or more files with content to be included after the
+#'   document body.
+#' @param includes Includes to convert to pandoc ars
+#' @param filter Filter to pre-process includes with
+#'
+#' @return Includes list or pandoc args
+#'
+#' @details Non-absolute paths for resources referenced from the
+#'   \code{in_header}, \code{before_body}, and \code{after_body}
+#'   parameters are resolved relative to the directory of the input document.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' html_document(includes = includes(before_body = "header.htm"))
+#'
+#' pdf_document(includes = includes(after_body = "footer.tex"))
+#'
+#' }
+#' @name includes
+#' @export
+includes <- function(in_header = NULL,
+                     before_body = NULL,
+                     after_body = NULL) {
+  list(in_header = in_header,
+       before_body = before_body,
+       after_body = after_body)
+}
+
+
+#' @rdname includes
+#' @export
+includes_to_pandoc_args <- function(includes, filter = identity) {
+  if (!is.null(includes))
+    pandoc_include_args(in_header = filter(includes$in_header),
+                        before_body = filter(includes$before_body),
+                        after_body = filter(includes$after_body))
+  else
+    NULL
+}
+
+
+
+# simple wrapper over normalizePath that preserves NULLs and applies pandoc-
+# friendly defaults
+normalize_path <- function(path, winslash = "/", mustWork = NA) {
+  if (!is.null(path))
+    normalizePath(path, winslash = winslash, mustWork = mustWork)
+}
+
+
diff --git a/R/ioslides_presentation.R b/R/ioslides_presentation.R
new file mode 100644
index 0000000..a7a3cd1
--- /dev/null
+++ b/R/ioslides_presentation.R
@@ -0,0 +1,265 @@
+
+
+
+
+#' @export
+ioslides_presentation <- function(logo = NULL,
+                                  slide_level = 2,
+                                  incremental = FALSE,
+                                  fig_width = 7.5,
+                                  fig_height = 4.5,
+                                  fig_retina = 2,
+                                  fig_caption = TRUE,
+                                  dev = 'png',
+                                  df_print = "default",
+                                  smart = TRUE,
+                                  self_contained = TRUE,
+                                  widescreen = FALSE,
+                                  smaller = FALSE,
+                                  transition = "default",
+                                  mathjax = "default",
+                                  analytics = NULL,
+                                  template = NULL,
+                                  css = NULL,
+                                  includes = NULL,
+                                  keep_md = FALSE,
+                                  lib_dir = NULL,
+                                  md_extensions = NULL,
+                                  pandoc_args = NULL,
+                                  extra_dependencies = NULL,
+                                  ...) {
+
+  # base pandoc options for all output
+  args <- c()
+
+  # widescreen
+  if (widescreen)
+    args <- c(args, "--variable", "widescreen");
+
+  # pagedtables
+  if (identical(df_print, "paged")) {
+    extra_dependencies <- append(extra_dependencies,
+                                 list(html_dependency_pagedtable()))
+
+  }
+
+  # transition
+  if (is.numeric(transition))
+    transition <- as.character(transition)
+  else if (transition %in% c("default", "faster", "slower"))
+    transition <- switch(transition,
+                         "default" = "0.4",
+                         "faster" = "0.2",
+                         "slower" = "0.6")
+  else
+    stop('transition must be "default", "faster", "slower" or a ',
+         'numeric value (representing seconds)', call. = FALSE)
+  args <- c(args, pandoc_variable_arg("transition", transition))
+
+  # additional css
+  for (css_file in css)
+    args <- c(args, "--css", pandoc_path_arg(css_file))
+
+  # content includes
+  args <- c(args, includes_to_pandoc_args(includes))
+
+  # template path and assets
+  if (!is.null(template) && file.exists(template))
+    args <- c(args, "--template", template)
+  else
+    args <- c(args,
+              "--template",
+              pandoc_path_arg(rmarkdown_system_file("rmd/ioslides/default.html")))
+
+  # html dependency for ioslides
+  extra_dependencies <- append(extra_dependencies,
+                               list(html_dependency_ioslides()))
+
+  # analytics
+  if (!is.null(analytics))
+    args <- c(args, pandoc_variable_arg("analytics", analytics))
+
+  # pre-processor for arguments that may depend on the name of the
+  # the input file (e.g. ones that need to copy supporting files)
+  pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir,
+                            output_dir) {
+
+    # use files_dir as lib_dir if not explicitly specified
+    if (is.null(lib_dir))
+      lib_dir <- files_dir
+
+    # extra args
+    args <- c()
+
+    # create the files dir if it doesn't exist
+    if (!dir_exists(files_dir))
+      dir.create(files_dir)
+
+    # logo
+    if (!is.null(logo)) {
+      logo_path <- logo
+      if (!self_contained) {
+        # use same extension as specified logo (default is png if unspecified)
+        logo_ext <- tools::file_ext(logo)
+        if (nchar(logo_ext) < 1)
+          logo_ext <- "png"
+        logo_path <- file.path(files_dir, paste("logo", logo_ext, sep = "."))
+        file.copy(from = logo, to = logo_path)
+        logo_path <- normalized_relative_to(output_dir, logo_path)
+      } else {
+        logo_path <- pandoc_path_arg(logo_path)
+      }
+      args <- c(args, "--variable", paste("logo=", logo_path, sep = ""))
+    }
+
+    # return additional args
+    args
+  }
+
+  # post processor that renders our markdown using our custom lua
+  # renderer and then inserts it into the main file
+  post_processor <- function(metadata, input_file, output_file, clean, verbose) {
+
+    # setup args
+    args <- c()
+
+    # add any custom pandoc args
+    args <- c(args, pandoc_args)
+
+    # attempt to create the output writer alongside input file
+    lua_writer <- file.path(dirname(input_file), "ioslides_presentation.lua")
+    tryCatch({
+      suppressWarnings(writeLines("", lua_writer, useBytes = TRUE))
+    },
+    error = function(...) {
+      # The input directory may not be writable (on e.g. Shiny Server), so write
+      # to the output directory in this case. We don't always do this since
+      # supplying a fully qualified path to the writer can trigger a bug on some
+      # Linux configurations.
+      lua_writer <<- file.path(dirname(output_file),
+                               "ioslides_presentation.lua")
+    })
+    on.exit(unlink(lua_writer), add = TRUE)
+
+    # determine whether we need to run citeproc
+    input_lines <- readLines(input_file, warn = FALSE)
+    run_citeproc <- citeproc_required(metadata, input_lines)
+
+    # write settings to file
+    settings <- c()
+    add_setting <- function(name, value) {
+      settings <<- c(settings, paste("local", name, "=",
+                                    ifelse(value, "true", "false")))
+    }
+    add_setting("fig_caption", fig_caption)
+    add_setting("incremental", incremental)
+    add_setting("smaller", smaller)
+    add_setting("smart", smart)
+    add_setting("mathjax", !is.null(mathjax))
+
+    # Set level of slide header (used by ioslides_presentation.lua)
+    settings <- c(settings, sprintf("local slide_level = %s", slide_level))
+    writeLines(settings, lua_writer, useBytes = TRUE)
+
+    # For consistency add as pandoc argument
+    args <- c(args, "--slide-level", as.character(slide_level))
+
+    # append main body of script
+    file.append(lua_writer,
+                rmarkdown_system_file("rmd/ioslides/ioslides_presentation.lua"))
+
+    output_tmpfile <- tempfile("ioslides-output", fileext = ".html")
+    on.exit(unlink(output_tmpfile), add = TRUE)
+
+    # on Windows, cache the current codepage and set it to 65001 (UTF-8) for the
+    # duration of the Pandoc command. Without this, Pandoc fails when attempting
+    # to hand UTF-8 encoded non-ASCII characters over to the custom Lua writer.
+    # See https://github.com/rstudio/rmarkdown/issues/134
+    if (is_windows()) {
+      # 'chcp' returns e.g., "Active code page: 437"; strip characters and parse
+      # the number
+      codepage <- as.numeric(gsub("\\D", "", system2("chcp", stdout = TRUE)))
+
+      if (!is.na(codepage)) {
+        # if we got a valid codepage, restore it on exit
+        on.exit(system2("chcp", args = codepage, stdout = TRUE), add = TRUE)
+
+        # change to the UTF-8 codepage
+        system2("chcp", args = 65001, stdout = TRUE)
+      }
+    }
+
+    pandoc_convert(input = input_file,
+                   to = relative_to(dirname(input_file), lua_writer),
+                   from = from_rmarkdown(fig_caption),
+                   output = output_tmpfile,
+                   options = args,
+                   citeproc = run_citeproc,
+                   verbose = verbose)
+
+    # read the slides
+    slides_lines <- readLines(output_tmpfile, warn = FALSE, encoding = "UTF-8")
+
+    # base64 encode if needed
+    if (self_contained) {
+      slides_lines <- base64_image_encode(slides_lines)
+    }
+
+    # read the output file
+    output_lines <- readLines(output_file, warn = FALSE, encoding = "UTF-8")
+
+    # substitute slides for the sentinel line
+    sentinel_line <- grep("^RENDERED_SLIDES$", output_lines)
+    if (length(sentinel_line) == 1) {
+      preface_lines <- c(output_lines[1:sentinel_line[1] - 1])
+      suffix_lines <- c(output_lines[-(1:sentinel_line[1])])
+      output_lines <- c(preface_lines, slides_lines, suffix_lines)
+      writeLines(output_lines, output_file, useBytes = TRUE)
+    } else {
+      stop("Slides placeholder not found in slides HTML", call. = FALSE)
+    }
+
+    output_file
+  }
+
+  # return format
+  output_format(
+    knitr = knitr_options_html(fig_width, fig_height, fig_retina, keep_md, dev),
+    pandoc = pandoc_options(to = "html",
+                            from = from_rmarkdown(fig_caption, md_extensions),
+                            args = args),
+    keep_md = keep_md,
+    clean_supporting = self_contained,
+    df_print = df_print,
+    pre_processor = pre_processor,
+    post_processor = post_processor,
+    base_format = html_document_base(smart = smart, lib_dir = lib_dir,
+                                     self_contained = self_contained,
+                                     mathjax = mathjax,
+                                     pandoc_args = pandoc_args,
+                                     extra_dependencies = extra_dependencies,
+                                     bootstrap_compatible = TRUE, ...))
+}
+
+
+html_dependency_ioslides <- function() {
+  htmlDependency(
+    name = "ioslides",
+    version = "13.5.1",
+    src = rmarkdown_system_file("rmd/ioslides/ioslides-13.5.1"),
+    script = c(
+      "js/modernizr.custom.45394.js",
+      "js/prettify/prettify.js",
+      "js/prettify/lang-r.js",
+      "js/prettify/lang-yaml.js",
+      "js/hammer.js",
+      "js/slide-controller.js",
+      "js/slide-deck.js"
+    ),
+    stylesheet = c(
+      "fonts/fonts.css",
+      "theme/css/default.css",
+      "theme/css/phone.css")
+    )
+}
+
diff --git a/R/knit_print.R b/R/knit_print.R
new file mode 100644
index 0000000..13af2d1
--- /dev/null
+++ b/R/knit_print.R
@@ -0,0 +1,42 @@
+knit_print.data.frame <- function(x, ...) {
+  context <- render_context()
+
+  # printing of certain expressions producing
+  # 'data.table' objects should be suppressed
+  printable <- TRUE
+  if ("data.table" %in% loadedNamespaces() &&
+      exists("shouldPrint", envir = asNamespace("data.table")))
+  {
+    shouldPrint <- get("shouldPrint", envir = asNamespace("data.table"))
+    printable <- tryCatch(
+      shouldPrint(x) || !inherits(x, "data.table"),
+      error = function(e) TRUE
+    )
+  }
+
+  if (!printable)
+    return(invisible(NULL))
+
+  if (!is.null(context$df_print)) {
+    if (identical(context$df_print, knitr::kable)) {
+      res = paste(c('<div class="kable-table">', '', knitr::kable(x), '', '</div>'),
+                  collapse = "\n")
+      knitr::asis_output(res)
+    } else {
+      context$df_print(x)
+    }
+  } else {
+    print(x, ...)
+  }
+}
+
+#' @export
+#' @importFrom knitr knit_print
+knit_print.tbl_sql <- knit_print.data.frame
+
+#' @export
+knit_print.grouped_df <- knit_print.data.frame
+
+#' @export
+knit_print.rowwise_df <- knit_print.data.frame
+
diff --git a/R/latex_dependencies.R b/R/latex_dependencies.R
new file mode 100644
index 0000000..7477cde
--- /dev/null
+++ b/R/latex_dependencies.R
@@ -0,0 +1,70 @@
+#' Define a LaTeX package dependency
+#' @param name The LaTeX package name
+#' @param options The LaTeX options for the package
+#' @export
+latex_dependency <- function(name, options = NULL) {
+  output <- list(name = name, options = options)
+  class(output) <- "latex_dependency"
+  validate_latex_dependency(output)
+}
+
+latex_dependencies <- function(x = list()) {
+  if (length(x) == 0) return()
+  if (is_latex_dependency(x)) return(list(x))
+  nms <- names(x)
+  if (is.list(x)) {
+    if (is.null(nms)) return(x)  # assume it is just a list of latex_dependency()
+    # turn the named list to a named character vector
+    x <- unlist(lapply(x, paste, collapse = ', '))
+  }
+  if (is.character(x)) {
+    if (is.null(nms)) {
+      lapply(x, latex_dependency)
+    } else {
+      mapply(latex_dependency, nms, x, SIMPLIFY = FALSE, USE.NAMES = FALSE)
+    }
+  }
+}
+
+# return the LaTeX dependencies as a string suitable for inclusion
+# in the head of a document
+latex_dependencies_as_string <- function(dependencies) {
+  lines <- sapply(dependencies, function(dep) {
+    opts <- paste(dep$options, collapse = ",")
+    if (opts != "") opts <- paste0("[", opts, "]")
+    # \\usepackage[opt1,opt2]{pkgname}
+    paste0("\\usepackage", opts, "{", dep$name, "}")
+  })
+  paste(unique(lines), collapse = "\n")
+}
+
+
+# flattens an arbitrarily nested list and returns all of the latex_dependency
+# objects it contains
+flatten_latex_dependencies <- function(knit_meta) {
+  flatten_dependencies(knit_meta, is_latex_dependency)
+}
+
+
+# check class of passed list for 'latex_dependency'
+is_latex_dependency <- function(list) {
+  inherits(list, "latex_dependency")
+}
+
+# validate that the passed list is a correctly formed latex_dependency
+validate_latex_dependency <- function(list) {
+
+  # ensure it's the right class
+  if (!is_latex_dependency(list))
+    stop("passed object is not of class latex_dependency", call. = FALSE)
+
+  # validate required fields
+  if (is.null(list$name))
+    stop("name (package name) for latex_dependency not provided", call. = FALSE)
+  list
+}
+
+# check if the passed knit_meta has any latex dependencies
+has_latex_dependencies <- function(knit_meta) {
+  has_dependencies(knit_meta, "latex_dependency")
+}
diff --git a/R/list_builder.R b/R/list_builder.R
new file mode 100644
index 0000000..cbafde6
--- /dev/null
+++ b/R/list_builder.R
@@ -0,0 +1,45 @@
+list_builder <- function() {
+  (function() {
+    capacity_ <- 1024
+    index_ <- 0
+    data_ <- vector("list", capacity_)
+
+    append <- function(data) {
+
+      # increment index and check capacity
+      index_ <<- index_ + 1
+      if (index_ > capacity_) {
+        capacity_ <<- capacity_ * 2
+        data_[capacity_] <<- list(NULL)
+      }
+
+      # append data
+      if (is.null(data))
+        data_[index_] <<- list(NULL)
+      else
+        data_[[index_]] <<- data
+    }
+
+    data <- function() {
+      data_[seq_len(index_)]
+    }
+
+    clear <- function() {
+      capacity_ <<- 1024
+      index_ <<- 0
+      data_ <<- vector("list", capacity_)
+    }
+
+    empty <- function() {
+      index_ == 0
+    }
+
+    list(
+      append = append,
+      clear = clear,
+      empty = empty,
+      data = data
+    )
+
+  })()
+}
diff --git a/R/md_document.R b/R/md_document.R
new file mode 100644
index 0000000..3d94411
--- /dev/null
+++ b/R/md_document.R
@@ -0,0 +1,103 @@
+#' Convert to a markdown document
+#'
+#' Format for converting from R Markdown to another variant of markdown (e.g.
+#' strict markdown or github flavored markdown)
+#'
+#' @inheritParams html_document
+#'
+#' @param variant Markdown variant to produce (defaults to "markdown_strict").
+#'   Other valid values are "markdown_github", "markdown_mmd",
+#'   markdown_phpextra", or even "markdown" (which produces pandoc markdown).
+#'   You can also compose custom markdown variants, see the
+#'   \href{http://pandoc.org/README.html}{pandoc online documentation}
+#'   for details.
+#'
+#' @param preserve_yaml Preserve YAML front matter in final document.
+#'
+#' @param fig_retina Scaling to perform for retina displays. Defaults to
+#'   \code{NULL} which performs no scaling. A setting of 2 will work for all
+#'   widely used retina displays, but will also result in the output of
+#'   \code{<img>} tags rather than markdown images due to the need to set the
+#'   width of the image explicitly.
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' See the \href{http://rmarkdown.rstudio.com/markdown_document_format.html}{online
+#' documentation} for additional details on using the \code{md_document} format.
+#'
+#' R Markdown documents can have optional metadata that is used to generate a
+#' document header that includes the title, author, and date. For more details
+#' see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+#'
+#' R Markdown documents also support citations. You can find more information on
+#' the markdown syntax for citations in the
+#' \href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+#' and Citations} article in the online documentation.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' render("input.Rmd", md_document())
+#'
+#' render("input.Rmd", md_document(variant = "markdown_github"))
+#' }
+#'
+#' @export
+md_document <- function(variant = "markdown_strict",
+                        preserve_yaml = FALSE,
+                        toc = FALSE,
+                        toc_depth = 3,
+                        fig_width = 7,
+                        fig_height = 5,
+                        fig_retina = NULL,
+                        dev = 'png',
+                        df_print = "default",
+                        includes = NULL,
+                        md_extensions = NULL,
+                        pandoc_args = NULL) {
+
+  # base pandoc options for all markdown output
+  args <- c(if (variant != "markdown" && !preserve_yaml) "--standalone")
+
+  # table of contents
+  args <- c(args, pandoc_toc_args(toc, toc_depth))
+
+  # content includes
+  args <- c(args, includes_to_pandoc_args(includes))
+
+  # pandoc args
+  args <- c(args, pandoc_args)
+
+  # add post_processor for yaml preservation
+  if (preserve_yaml) {
+    post_processor <- function(metadata, input_file, output_file, clean, verbose) {
+      input_lines <- readLines(input_file, warn = FALSE)
+      partitioned <- partition_yaml_front_matter(input_lines)
+      if (!is.null(partitioned$front_matter)) {
+        output_lines <- c(partitioned$front_matter,
+                          "",
+                          readLines(output_file, warn = FALSE))
+        writeLines(output_lines, output_file, useBytes = TRUE)
+      }
+      output_file
+    }
+  } else {
+    post_processor <- NULL
+  }
+
+  # return format
+  output_format(
+    knitr = knitr_options_html(fig_width, fig_height, fig_retina, FALSE, dev),
+    pandoc = pandoc_options(to = variant,
+                            from = from_rmarkdown(extensions = md_extensions),
+                            args = args,
+                            ext = '.md'),
+    clean_supporting = FALSE,
+    df_print = df_print,
+    post_processor = post_processor
+  )
+}
diff --git a/R/odt_document.R b/R/odt_document.R
new file mode 100644
index 0000000..317a0fe
--- /dev/null
+++ b/R/odt_document.R
@@ -0,0 +1,89 @@
+#' Convert to an OpenDocument Text (ODT) document
+#'
+#' Format for converting from R Markdown to an ODT document.
+#'
+#' @inheritParams pdf_document
+#' @inheritParams html_document
+#'
+#' @param reference_odt Use the specified file as a style reference in
+#'   producing an odt file. For best results, the reference odt should be a
+#'   modified version of an odt file produced using pandoc. Pass "default"
+#'   to use the rmarkdown default styles.
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' See the \href{http://rmarkdown.rstudio.com/odt_document_format.html}{online
+#' documentation} for additional details on using the \code{odt_document} format.
+#'
+#' R Markdown documents can have optional metadata that is used to generate a
+#' document header that includes the title, author, and date. For more details
+#' see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+#'
+#' R Markdown documents also support citations. You can find more information on
+#' the markdown syntax for citations in the
+#' \href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+#' and Citations} article in the online documentation.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' # simple invocation
+#' render("input.Rmd", odt_document())
+#'
+#' # specify an option for syntax highlighting
+#' render("input.Rmd", odt_document(highlight = "zenburn"))
+#' }
+#'
+#' @export
+odt_document <- function(fig_width = 5,
+                         fig_height = 4,
+                         fig_caption = TRUE,
+                         template = "default",
+                         reference_odt = "default",
+                         includes = NULL,
+                         keep_md = FALSE,
+                         md_extensions = NULL,
+                         pandoc_args = NULL) {
+
+  # knitr options and hooks
+  knitr <- knitr_options(
+    opts_chunk = list(dev = 'png',
+                      dpi = 96,
+                      fig.width = fig_width,
+                      fig.height = fig_height)
+  )
+
+  # base pandoc options for all odt output
+  args <- c()
+
+  # template
+  if (!is.null(template) && !identical(template, "default"))
+    args <- c(args, "--template", pandoc_path_arg(template))
+
+  # content includes
+  args <- c(args, includes_to_pandoc_args(includes))
+
+  # reference odt
+  if (!is.null(reference_odt) && !identical(reference_odt, "default")) {
+    args <- c(args, reference_doc_arg("odt"), pandoc_path_arg(reference_odt))
+  }
+
+  # pandoc args
+  args <- c(args, pandoc_args)
+
+  # return output format
+  output_format(
+    knitr = knitr,
+    pandoc = pandoc_options(to = "odt",
+                            from = from_rmarkdown(fig_caption, md_extensions),
+                            args = args),
+    keep_md = keep_md
+  )
+}
+
+
+
diff --git a/R/output_format.R b/R/output_format.R
new file mode 100644
index 0000000..5bedec2
--- /dev/null
+++ b/R/output_format.R
@@ -0,0 +1,765 @@
+#' Define an R Markdown output format
+#'
+#' Define an R Markdown output format based on a combination of knitr and pandoc
+#' options.
+#'
+#' @param knitr Knitr options for an output format (see
+#'   \code{\link{knitr_options}})
+#' @param pandoc Pandoc options for an output format (see
+#'   \code{\link{pandoc_options}})
+#' @param keep_md Keep the markdown file generated by knitting. Note that
+#'   if this is \code{TRUE} then \code{clean_supporting} will always be
+#'   \code{FALSE}.
+#' @param clean_supporting Cleanup any supporting files after conversion see
+#'   \code{\link{render_supporting_files}}
+#' @param df_print Method to be used for printing data frames. Valid values
+#'   include "default", "kable", "tibble", and "paged". The "default" method uses
+#'   \code{print.data.frame}. The "kable" method uses the
+#'   \code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+#'   the \pkg{tibble} package to print a summary of the data frame. The "paged"
+#'   method creates a paginated HTML table (note that this method is only valid
+#'   for formats that produce HTML). In addition
+#'   to the named methods you can also pass an arbitrary function to be used
+#'   for printing data frames. You can disable the df_print behavior entirely
+#'   by setting the option \code{rmarkdown.df_print} to \code{FALSE}.
+#' @param pre_knit An optional function that runs before kniting which
+#'   receives the \code{input} (input filename passed to \code{render}) and
+#'   \code{...} (for future expansion) arguments.
+#' @param post_knit An optional function that runs after kniting which
+#'   receives the \code{metadata}, \code{input_file}, \code{runtime}, and \code{...}
+#'   (for future expansion) arguments. This function can return additional
+#'   arguments to pass to pandoc and can call \code{knitr::knit_meta_add}
+#'   to add additional dependencies based on the contents of the input_file or on other
+#'   assets side by side with it that may be used to produce html with dependencies
+#'   during subsequent processing.
+#' @param pre_processor An optional pre-processor function that receives the
+#'   \code{metadata}, \code{input_file}, \code{runtime}, \code{knit_meta},
+#'   \code{files_dir}, and \code{output_dir} and can return additional arguments
+#'   to pass to pandoc.
+#' @param intermediates_generator An optional function that receives the
+#'   original \code{input_file}, its \code{encoding}, and the intermediates
+#'   directory (i.e. the \code{intermediates_dir} argument to
+#'   \code{\link{render}}). The function should generate and return the names of
+#'   any intermediate files required to render the \code{input_file}.
+#' @param post_processor An optional post-processor function that receives the
+#'   \code{metadata}, \code{input_file}, \code{output_file}, \code{clean},
+#'   and \code{verbose} parameters, and can return an alternative
+#'   \code{output_file}.
+#' @param on_exit A function to call when \code{rmarkdown::render()} finishes
+#'   execution (as registered with a \code{\link{on.exit}} handler).
+#' @param base_format An optional format to extend.
+#'
+#' @return An R Markdown output format definition that can be passed to
+#'   \code{\link{render}}.
+#'
+#' @seealso \link{render}, \link{knitr_options}, \link{pandoc_options}
+#'
+#' @examples
+#' \dontrun{
+#' output_format(knitr = knitr_options(opts_chunk = list(dev = 'png')),
+#'               pandoc = pandoc_options(to = "html"))
+#' }
+#'
+#' @export
+output_format <- function(knitr,
+                          pandoc,
+                          keep_md = FALSE,
+                          clean_supporting = TRUE,
+                          df_print = NULL,
+                          pre_knit = NULL,
+                          post_knit = NULL,
+                          pre_processor = NULL,
+                          intermediates_generator = NULL,
+                          post_processor = NULL,
+                          on_exit = NULL,
+                          base_format = NULL) {
+
+  format <- list(
+    knitr = knitr,
+    pandoc = pandoc,
+    keep_md = keep_md,
+    clean_supporting = clean_supporting && !keep_md,
+    df_print = df_print,
+    pre_knit = pre_knit,
+    post_knit = post_knit,
+    pre_processor = pre_processor,
+    intermediates_generator = intermediates_generator,
+    post_processor = post_processor,
+    on_exit = on_exit
+  )
+
+  class(format) <- "rmarkdown_output_format"
+
+  # if a base format was supplied, merge it with the format we just created
+  if (!is.null(base_format))
+    merge_output_formats(base_format, format)
+  else
+    format
+}
+
+# merges two scalar values; picks the overlay if non-NULL and then the base
+merge_scalar <- function(base, overlay) {
+  if (is.null(base) && is.null(overlay))
+    NULL
+  else if (is.null(overlay))
+    base
+  else
+    overlay
+}
+
+# merges two functions: if both are non-NULL, produces a new function that
+# invokes each and then uses the supplied operation to combine their outputs
+merge_function_outputs <- function(base, overlay, op) {
+  if (!is.null(base) && !is.null(overlay)) {
+    function(...) {
+      op(base(...), overlay(...))
+    }
+  } else {
+    merge_scalar(base, overlay)
+  }
+}
+
+# merges two post-processors; if both are non-NULL, produces a new function that
+# calls the overlay post-processor and then the base post-processor.
+merge_post_processors <- function(base, overlay) {
+  if (!is.null(base) && !is.null(overlay)) {
+    function(metadata, input_file, output_file, ...) {
+      output_file <- overlay(metadata, input_file, output_file, ...)
+      base(metadata, input_file, output_file, ...)
+    }
+  }
+  else {
+    merge_scalar(base, overlay)
+  }
+}
+
+# merges two output formats
+merge_output_formats <- function(base, overlay)  {
+  structure(list(
+    knitr = merge_lists(base$knitr, overlay$knitr),
+    pandoc = merge_pandoc_options(base$pandoc, overlay$pandoc),
+    keep_md =
+      merge_scalar(base$keep_md, overlay$keep_md),
+    clean_supporting =
+      merge_scalar(base$clean_supporting, overlay$clean_supporting),
+    df_print =
+      merge_scalar(base$df_print, overlay$df_print),
+    pre_knit =
+      merge_function_outputs(base$pre_knit, overlay$pre_knit, c),
+    post_knit =
+      merge_function_outputs(base$post_knit, overlay$post_knit, c),
+    pre_processor =
+      merge_function_outputs(base$pre_processor, overlay$pre_processor, c),
+    intermediates_generator =
+      merge_function_outputs(base$intermediates_generator,
+                             overlay$intermediates_generator, c),
+    post_processor =
+      merge_post_processors(base$post_processor, overlay$post_processor),
+    on_exit =
+      merge_on_exit(base$on_exit, overlay$on_exit)
+  ), class = "rmarkdown_output_format")
+}
+
+merge_on_exit <- function(base, overlay) {
+  function() {
+    if (is.function(base)) base()
+    if (is.function(overlay)) overlay()
+  }
+}
+
+merge_pandoc_options <- function(base, overlay) {
+  res <- merge_lists(base, overlay, recursive = FALSE)
+  res$args <- c(base$args, overlay$args)
+  res
+}
+
+#' Knitr options for an output format
+#'
+#' Define the knitr options for an R Markdown output format.
+#'
+#' @param opts_knit List of package level knitr options (see
+#'   \code{\link[knitr:opts_knit]{opts_knit}})
+#' @param opts_chunk List of chunk level knitr options (see
+#'   \code{\link[knitr:opts_chunk]{opts_chunk}})
+#' @param knit_hooks List of hooks for R code chunks, inline R code, and output
+#'   (see \code{\link[knitr:knit_hooks]{knit_hooks}})
+#' @param opts_hooks List of hooks for code chunk options
+#'   (see \code{\link[knitr:opts_hooks]{opts_hooks}})
+#' @param opts_template List of templates for chunk level knitr options (see
+#'   \code{\link[knitr:opts_template]{opts_template}})
+#'
+#' @return An list that can be passed as the \code{knitr} argument of the
+#'   \code{\link{output_format}} function.
+#'
+#' @seealso \link{output_format}
+#'
+#' @export
+knitr_options <- function(opts_knit = NULL,
+                          opts_chunk = NULL,
+                          knit_hooks = NULL,
+                          opts_hooks = NULL,
+                          opts_template = NULL) {
+  list(opts_knit = opts_knit,
+       opts_chunk = opts_chunk,
+       knit_hooks = knit_hooks,
+       opts_hooks = opts_hooks,
+       opts_template = opts_template)
+}
+
+#' Knitr options for a PDF output format
+#'
+#' Define knitr options for an R Markdown output format that creates PDF output.
+#'
+#' @inheritParams html_document
+#' @inheritParams pdf_document
+#'
+#' @return An list that can be passed as the \code{knitr} argument of the
+#'   \code{\link{output_format}} function.
+#'
+#' @seealso \link{knitr_options}, \link{output_format}
+#'
+#' @export
+knitr_options_pdf <- function(fig_width, fig_height, fig_crop, dev = 'pdf') {
+
+  # default options
+  opts_knit <- NULL
+  opts_chunk <- list(dev = dev,
+                     fig.width = fig_width,
+                     fig.height = fig_height)
+
+  # set the dingbats option for the pdf device if requried
+  if (dev == 'pdf')
+    opts_chunk$dev.args <- list(pdf = list(useDingbats = FALSE))
+
+  knit_hooks <- NULL
+
+  # apply cropping if requested and we have pdfcrop
+  crop <- fig_crop && !is_windows() && nzchar(find_program("pdfcrop"))
+  if (crop) {
+    knit_hooks = list(crop = knitr::hook_pdfcrop)
+    opts_chunk$crop = TRUE
+  }
+
+  # return options
+  knitr_options(opts_knit = opts_knit,
+                opts_chunk = opts_chunk,
+                knit_hooks = knit_hooks)
+}
+
+
+#' Pandoc options for an output format
+#'
+#' Define the pandoc options for an R Markdown output format.
+#'
+#' @param to Pandoc format to convert to
+#' @param from Pandoc format to convert from
+#' @param args Character vector of command line arguments to pass to pandoc
+#' @param keep_tex Keep the intermediate tex file used in the conversion to PDF
+#'   (applies only to 'latex' and 'beamer' target formats)
+#' @param latex_engine LaTeX engine to producing PDF output (applies only to
+#'   'latex' and 'beamer' target formats)
+#' @param ext File extension (e.g. ".tex") for output file (if \code{NULL}
+#'   chooses default based on \code{to}). This is typically used to force
+#'   the final output of a latex or beamer converstion to be \code{.tex}
+#'   rather than \code{.pdf}.
+#'
+#' @return An list that can be passed as the \code{pandoc} argument of the
+#'   \code{\link{output_format}} function.
+#'
+#' @details The \code{from} argument should be used very cautiously as it's
+#'   important for users to be able to rely on a stable definition of supported
+#'   markdown extensions.
+#'
+#' @seealso \link{output_format}, \link{rmarkdown_format}
+#'
+#' @export
+pandoc_options <- function(to,
+                           from = rmarkdown_format(),
+                           args = NULL,
+                           keep_tex = FALSE,
+                           latex_engine = c("pdflatex", "lualatex", "xelatex"),
+                           ext = NULL) {
+  list(to = to,
+       from = from,
+       args = args,
+       keep_tex = keep_tex,
+       latex_engine = match.arg(latex_engine),
+       ext = ext)
+}
+
+#' R Markdown input format definition
+#'
+#' Compose a pandoc markdown input definition for R Markdown that can be
+#' passed as the \code{from} argument of \link{pandoc_options}.
+#'
+#'
+#' @param implicit_figures Automatically make figures from images (defaults to \code{TRUE}).
+#' @param extensions Markdown extensions to be added or removed from the
+#' default definition of R Markdown.
+#'
+#' @return Pandoc markdown format specification
+#'
+#' @details
+#'
+#' By default R Markdown is defined as all pandoc markdown extensions with
+#' the following tweaks for backward compatibility with the markdown package
+#' (+ features are added, - features are removed):
+#'
+#' \tabular{l}{
+#' \code{+autolink_bare_uris} \cr
+#' \code{+ascii_identifier} \cr
+#' \code{+tex_math_single_backslash} \cr
+#' }
+#'
+#'
+#' For more on pandoc markdown see the \href{http://pandoc.org/README.html}{pandoc online documentation}.
+#'
+#' @examples
+#' \dontrun{
+#' rmarkdown_format("-implicit_figures")
+#' }
+#'
+#' @seealso \link{output_format}, \link{pandoc_options}
+#'
+#' @export
+rmarkdown_format <- function(extensions = NULL) {
+
+  format <- c("markdown")
+
+  # only add extensions if the user hasn't already specified
+  # a manual override for them
+  addExtension <- function(extension) {
+    if (length(grep(extension, extensions)) == 0)
+      format <<- c(format, paste0("+", extension))
+  }
+
+  addExtension("autolink_bare_uris")
+  addExtension("ascii_identifiers")
+  addExtension("tex_math_single_backslash")
+
+  format <- c(format, extensions, recursive = TRUE)
+
+  paste(format, collapse = "")
+}
+
+# Add the +smart extension for Pandoc >= 2.0
+smart_extension <- function(smart, extension) {
+  c(extension, if (smart && pandoc2.0()) "+smart")
+}
+
+#' Determine the default output format for an R Markdown document
+#'
+#' Read the YAML metadata (and any common _output.yml file) for the
+#' document and return the output format that will be generated by
+#' a call to \code{\link{render}}.
+#'
+#' @param input Input file (Rmd or plain markdown)
+#' @param encoding The encoding of the input file; see \code{\link{file}}
+#'
+#' @return A named list with a \code{name} value containing the format
+#'   name and an \code{options} value that is a list containing all the options
+#'   for the format and their values. An option's default value will be returned
+#'   if the option isn't set explicitly in the document.
+#'
+#' @details
+#'
+#' This function is useful for front-end tools that require additional
+#' knowledge of the output to be produced by \code{\link{render}} (e.g. to
+#' customize the preview experience).
+#'
+#' @export
+default_output_format <- function(input, encoding = getOption("encoding")) {
+
+  # execute within the input file's directory (this emulates the way
+  # yaml front matter discovery is done within render)
+  oldwd <- setwd(dirname(tools::file_path_as_absolute(input)))
+  on.exit(setwd(oldwd), add = TRUE)
+
+  # because we're now within the same directory as the input file,
+  # we just need its basename
+  input <- basename(input)
+
+  # parse the YAML and front matter and get the explicitly set options
+  input_lines <- read_lines_utf8(input, encoding)
+  format <- output_format_from_yaml_front_matter(input_lines, encoding = encoding)
+
+  # look up the formals of the output function to get the full option list and
+  # merge against the explicitly set list
+  format_function <- eval(parse(text = format$name))
+  format$options <- merge_lists(as.list(formals(format_function)),
+                                format$options,
+                                recursive = FALSE)
+  format
+}
+
+#' Resolve the output format for an R Markdown document
+#'
+#' Read the YAML metadata (and any common _output.yml file) for the
+#' document and return an output format object that can be
+#' passed to the \code{\link{render}} function.
+#'
+#' @param input Input file (Rmd or plain markdown)
+#' @param output_format Name of output format (or \code{NULL} to use
+#'   the default format for the input file).
+#' @param output_options List of output options that should override the
+#'   options specified in metadata.
+#' @param encoding The encoding of the input file; see \code{\link{file}}
+#'
+#' @return An R Markdown output format definition that can be passed to
+#'   \code{\link{render}}.
+#'
+#' @details
+#'
+#' This function is useful for front-end tools that need to modify
+#' the default behavior of an output format.
+#'
+#' @export
+resolve_output_format <- function(input,
+                                  output_format = NULL,
+                                  output_options = NULL,
+                                  encoding = getOption("encoding")) {
+
+  # read the input file
+  input_lines <- read_lines_utf8(input, encoding)
+
+  # validate that the output format is either NULL or a character vector
+  if (!is.null(output_format) && !is.character(output_format))
+    stop("output_format must be a character vector")
+
+  # resolve the output format by looking at the yaml
+  output_format <- output_format_from_yaml_front_matter(input_lines,
+                                                        output_options,
+                                                        output_format,
+                                                        encoding = encoding)
+
+  # return it
+  create_output_format(output_format$name, output_format$options)
+}
+
+
+#' Determine all output formats for an R Markdown document
+#'
+#' Read the YAML metadata (and any common _output.yml file) for the
+#' document and return the output formats that will be generated by
+#' a call to \code{\link{render}}.
+#'
+#' @param input Input file (Rmd or plain markdown)
+#' @param encoding The encoding of the input file; see \code{\link{file}}
+#'
+#' @return A character vector with the names of all output formats.
+#'
+#' @details
+#'
+#' This function is useful for front-end tools that require additional
+#' knowledge of the output to be produced by \code{\link{render}} (e.g. to
+#' customize the preview experience).
+#'
+#' @export
+all_output_formats <- function(input, encoding = getOption("encoding")) {
+  enumerate_output_formats(input = input,
+                           envir = parent.frame(),
+                           encoding = encoding)
+
+}
+
+
+# Synthesize the output format for a document from it's YAML. If we can't
+# find an output format then we just return html_document
+output_format_from_yaml_front_matter <- function(input_lines,
+                                                 output_options = NULL,
+                                                 output_format_name = NULL,
+                                                 encoding = getOption("encoding")) {
+
+  format_name <- output_format_name
+  # ensure input is the correct data type
+  if (!is_null_or_string(format_name)) {
+    stop("Unrecognized output format specified", call. = FALSE)
+  }
+
+  # parse the yaml
+  yaml_input <- parse_yaml_front_matter(input_lines)
+
+  # default to no options
+  format_options <- list()
+
+  # parse _site.yml output format if we have it
+  config <- site_config(".", encoding = encoding)
+  yaml_site <- config[["output"]]
+
+  # parse common _output.yml if we have it
+  yaml_common <- if (file.exists("_output.yml")) {
+    yaml_load_file_utf8("_output.yml")
+  } else if (file.exists("_output.yaml")) {
+    yaml_load_file_utf8("_output.yaml")
+  }
+
+  # merge _site.yml and _output.yml
+  yaml_common <- merge_output_options(yaml_site, yaml_common)
+
+  # parse output format from front-matter if we have it
+  if (length(yaml_common) || length(yaml_input[["output"]])) {
+
+    # alias the output format yaml
+    yaml_output <- yaml_input[["output"]]
+
+    # merge against common _output.yml
+    yaml_output <- merge_output_options(yaml_common, yaml_output)
+
+    # if a named format was provided then try to find it
+    if (!is.null(format_name)) {
+
+      # if this is a named element of the list then use that
+      if (format_name %in% names(yaml_output)) {
+
+        format_options <- yaml_output[[format_name]]
+
+      # otherwise this could be a heterogeneous list of characters and
+      # lists so scan for an embedded list
+      } else {
+        for (format in yaml_output) {
+          if (is.list(format) && !is.null(format[[format_name]]))
+            format_options <- format[[format_name]]
+        }
+      }
+
+      # if the options are just "default" then that's the same as empty list
+      if (identical(format_options, "default")) format_options <- list()
+
+    # no named format passed so take the first element
+    } else {
+      if (is.list(yaml_output[[1]])) {
+        # check for named list
+        if (nzchar(format_name <- names(yaml_output)[[1]])) {
+          format_options <- yaml_output[[1]]
+        # nested named list
+        } else {
+          format_name <- names(yaml_output[[1]])[[1]]
+          format_options <- yaml_output[[1]][[format_name]]
+        }
+      } else if (is.list(yaml_output) &&
+                   (is.null(yaml_output[[1]]) ||
+                      identical(yaml_output[[1]], "default"))) {
+        format_name <- names(yaml_output)[[1]]
+
+      } else {
+        format_name <- yaml_output[[1]]
+      }
+    }
+
+  # no output formats defined in the file, just take the passed format
+  # by name (or default to html_document if no named format was specified)
+  } else {
+    if (is.null(format_name)) format_name <- "html_document"
+  }
+
+  # merge any output_options passed in the call to render
+  if (!is.null(output_options)) {
+    format_options <- merge_output_options(format_options, output_options)
+  }
+
+  # return the format name and options
+  list(name = format_name, options = format_options)
+}
+
+create_output_format <- function(name, options) {
+
+  # validate the name
+  if (is.null(name))
+    stop("The output format name must not be NULL", call. = FALSE)
+  if (name == "revealjs_presentation")
+    stop("reveal.js presentations are now located in a separate package: ",
+         "https://github.com/jjallaire/revealjs")
+
+  # lookup the function
+  output_format_func <- eval(parse(text = name))
+  if (!is.function(output_format_func))
+    stop("YAML output format must evaluate to a function", call. = FALSE)
+
+  # call the function
+  output_format <- do.call(output_format_func, options)
+  if (!is_output_format(output_format))
+    stop("Format is not of class rmarkdown_output_format", call. = FALSE)
+
+  # return the format
+  output_format
+}
+
+is_output_format <- function(x) {
+  inherits(x, "rmarkdown_output_format")
+}
+
+enumerate_output_formats <- function(input, envir, encoding) {
+
+  # read the input
+  input_lines <- read_lines_utf8(input, encoding)
+
+  # if this is an R file then spin it
+  if (identical(tolower(tools::file_ext(input)), "r"))
+    input_lines <- knitr::spin(text = input_lines, knit = FALSE, envir = envir)
+
+  # parse _site.yml output format if we have it
+  config <- site_config(input, encoding = encoding)
+  if (!is.null(config) && !is.null(config[["output"]])) {
+    site_output_format_yaml <- config[["output"]]
+  } else {
+    site_output_format_yaml <- list()
+  }
+
+  # read the ymal front matter
+  yaml_front_matter <- parse_yaml_front_matter(input_lines)
+
+  # read any _output.yml
+  output_yml <- file.path(dirname(input), "_output.yml")
+  output_yaml <- file.path(dirname(input), "_output.yaml")
+  if (file.exists(output_yml))
+    common_output_format_yaml <- yaml_load_file_utf8(output_yml)
+  else if (file.exists(output_yaml))
+    common_output_format_yaml <- yaml_load_file_utf8(output_yaml)
+  else
+    common_output_format_yaml <- list()
+
+  # merge site and common
+  common_output_format_yaml <- merge_output_options(site_output_format_yaml,
+                                                    common_output_format_yaml)
+
+  # parse output formats from front-matter if we have it
+  if (length(common_output_format_yaml) > 0 ||
+      length(yaml_front_matter[["output"]]) > 0) {
+
+    # alias the output format yaml
+    output_format_yaml <- yaml_front_matter[["output"]]
+
+    # merge against common _output.yml
+    output_format_yaml <- merge_output_options(common_output_format_yaml,
+                                               output_format_yaml)
+  }
+  else {
+    output_format_yaml <- NULL
+  }
+
+  # return them by name
+  if (is.character(output_format_yaml)) {
+    output_format_yaml
+  } else if (is.list(output_format_yaml)) {
+    names(output_format_yaml)
+  } else {
+    NULL
+  }
+}
+
+#' Parse the YAML front matter from a file
+#'
+#' @inheritParams default_output_format
+#'
+#' @keywords internal
+#' @export
+yaml_front_matter <- function(input, encoding = getOption("encoding")) {
+
+   # read the input file
+  input_lines <- read_lines_utf8(input, encoding)
+
+  # parse the yaml front matter
+  parse_yaml_front_matter(input_lines)
+}
+
+parse_yaml_front_matter <- function(input_lines) {
+
+  partitions <- partition_yaml_front_matter(input_lines)
+  if (!is.null(partitions$front_matter)) {
+    front_matter <- partitions$front_matter
+    if (length(front_matter) > 2) {
+      front_matter <- front_matter[2:(length(front_matter) - 1)]
+      front_matter <- paste(front_matter, collapse = "\n")
+      validate_front_matter(front_matter)
+      parsed_yaml <- yaml_load_utf8(front_matter)
+      if (is.list(parsed_yaml))
+        parsed_yaml
+      else
+        list()
+    }
+    else
+      list()
+  }
+  else
+    list()
+}
+
+validate_front_matter <- function(front_matter) {
+  front_matter <- trim_trailing_ws(front_matter)
+  if (grepl(":$", front_matter))
+    stop("Invalid YAML front matter (ends with ':')", call. = FALSE)
+}
+
+
+
+partition_yaml_front_matter <- function(input_lines) {
+
+  validate_front_matter <- function(delimiters) {
+    if (length(delimiters) >= 2 &&
+        (delimiters[2] - delimiters[1] > 1) &&
+        grepl("^---\\s*$", input_lines[delimiters[1]])) {
+      # verify that it's truly front matter (not preceded by other content)
+      if (delimiters[1] == 1)
+        TRUE
+      else
+        is_blank(input_lines[1:delimiters[1] - 1])
+    } else {
+      FALSE
+    }
+  }
+
+  # is there yaml front matter?
+  delimiters <- grep("^(---|\\.\\.\\.)\\s*$", input_lines)
+  if (validate_front_matter(delimiters)) {
+
+    front_matter <- input_lines[(delimiters[1]):(delimiters[2])]
+
+    input_body <- c()
+
+    if (delimiters[1] > 1)
+      input_body <- c(input_body,
+                      input_lines[1:delimiters[1] - 1])
+
+    if (delimiters[2] < length(input_lines))
+      input_body <- c(input_body,
+                      input_lines[-(1:delimiters[2])])
+
+    list(front_matter = front_matter,
+         body = input_body)
+  }
+  else {
+    list(front_matter = NULL,
+         body = input_lines)
+  }
+}
+
+merge_output_options <- function(base_options, overlay_options) {
+
+  # if either one of these is a character vector then normalize to a named list
+  normalize_list <- function(target) {
+    if (is.null(target)) {
+      list()
+    } else if (is.character(target)) {
+      setNames(lapply(target, function(x) list()), target)
+    } else {
+      target[names(target) != "..."]  # remove symbols (...) from list
+    }
+  }
+
+  merge_lists(normalize_list(base_options), normalize_list(overlay_options))
+}
+
+is_pandoc_to_html <- function(options) {
+  identical(options$to, "html") || identical(options$to, "html5")
+}
+
+citeproc_required <- function(yaml_front_matter, input_lines = NULL) {
+  (
+    is.null(yaml_front_matter$citeproc) ||
+      yaml_front_matter$citeproc
+  ) && (
+    !is.null(yaml_front_matter$bibliography) ||
+      !is.null(yaml_front_matter$references) ||
+      length(grep("^references\\:\\s*$", input_lines)) > 0
+  )
+}
diff --git a/R/pandoc.R b/R/pandoc.R
new file mode 100644
index 0000000..a0193e1
--- /dev/null
+++ b/R/pandoc.R
@@ -0,0 +1,663 @@
+#' Convert a document with pandoc
+#'
+#' Convert documents to and from various formats using the pandoc utility.
+#'
+#' @param input Character vector containing paths to input files
+#'   (files must be UTF-8 encoded)
+#' @param to Format to convert to (if not specified, you must specify
+#'   \code{output})
+#' @param from Format to convert from (if not specified then the format is
+#'   determined based on the file extension of \code{input}).
+#' @param output Output file (if not specified then determined based on format
+#'   being converted to)
+#' @param citeproc \code{TRUE} to run the pandoc-citeproc filter (for processing
+#'   citations) as part of the conversion
+#' @param options Character vector of command line options to pass to pandoc.
+#' @param verbose \code{TRUE} to show the pandoc command line which was executed
+#' @param wd Working directory in which code will be executed. If not
+#'   supplied, defaults to the common base directory of \code{input}
+#'
+#' @details Supported input and output formats are described in the
+#'   \href{http://johnmacfarlane.net/pandoc/README.html}{pandoc user guide}.
+#'
+#'   The system path as well as the version of pandoc shipped with RStudio (if
+#'   running under RStudio) are scanned for pandoc and the highest version
+#'   available is used.
+#'
+#' @examples
+#' \dontrun{
+#' library(rmarkdown)
+#'
+#' # convert markdown to various formats
+#' pandoc_convert("input.md", to = "html")
+#' pandoc_convert("input.md", to = "pdf")
+#'
+#' # process citations
+#' pandoc_convert("input.md", to = "html", citeproc = TRUE)
+#'
+#' # add some pandoc options
+#' pandoc_convert("input.md", to="pdf", options = c("--listings"))
+#' }
+#'
+#' @export
+pandoc_convert <- function(input,
+                           to = NULL,
+                           from = NULL,
+                           output = NULL,
+                           citeproc = FALSE,
+                           options = NULL,
+                           verbose = FALSE,
+                           wd = NULL) {
+
+  # ensure we've scanned for pandoc
+  find_pandoc()
+
+  # execute in specified working directory
+  if (is.null(wd)) {
+    wd <- base_dir(input)
+  }
+  oldwd <- setwd(wd)
+  on.exit(setwd(oldwd), add = TRUE)
+
+
+  # input file and formats
+  args <- c(input)
+  if (!is.null(to))
+    args <- c(args, "--to", to)
+  if (!is.null(from))
+    args <- c(args, "--from", from)
+
+  #  output file
+  if (!is.null(output))
+    args <- c(args, "--output", output)
+
+  # set pandoc stack size
+  stack_size <- getOption("pandoc.stack.size", default = "512m")
+  args <- c(c("+RTS", paste0("-K", stack_size), "-RTS"), args)
+
+  # additional command line options
+  args <- c(args, options)
+
+  # citeproc filter if requested
+  if (citeproc) {
+    args <- c(args, "--filter", pandoc_citeproc())
+    # --natbib/--biblatex conflicts with '--filter pandoc-citeproc'
+    i <- stats::na.omit(match(c("--natbib", "--biblatex"), options))
+    if (length(i)) options <- options[-i]
+  }
+
+  # build the conversion command
+  command <- paste(quoted(pandoc()), paste(quoted(args), collapse = " "))
+
+  # show it in verbose mode
+  if (verbose)
+    cat(command, "\n")
+
+  # run the conversion
+  with_pandoc_safe_environment({
+    result <- system(command)
+  })
+  if (result != 0)
+    stop("pandoc document conversion failed with error ", result, call. = FALSE)
+
+  invisible(NULL)
+}
+
+#' Check pandoc availabilty and version
+#'
+#' Determine whether pandoc is currently available on the system (optionally
+#' checking for a specific version or greater). Determine the specific version
+#' of pandoc available.
+#'
+#' @param version Required version of pandoc
+#' @param error Whether to signal an error if pandoc with the required version
+#'   is not found
+#'
+#' @return \code{pandoc_available} returns a logical indicating whether the
+#'   required version of pandoc is available. \code{pandoc_version} returns a
+#'   \code{\link[base]{numeric_version}} with the version of pandoc found.
+#'
+#' @details
+#'
+#' The system environment variable \samp{PATH} as well as the version of pandoc
+#' shipped with RStudio (its location is set via the environment variable
+#' \samp{RSTUDIO_PANDOC} by RStudio products like the RStudio IDE, RStudio
+#' Server, Shiny Server, and RStudio Connect, etc) are scanned for pandoc and
+#' the highest version available is used. Please do not modify the environment
+#' varaible \samp{RSTUDIO_PANDOC} unless you know what it means.
+#'
+#' @examples
+#' \dontrun{
+#' library(rmarkdown)
+#'
+#' if (pandoc_available())
+#'   cat("pandoc", as.character(pandoc_version()), "is available!\n")
+#'
+#' if (pandoc_available("1.12.3"))
+#'   cat("requried version of pandoc is available!\n")
+#' }
+#' @export
+pandoc_available <- function(version = NULL, error = FALSE) {
+
+  # ensure we've scanned for pandoc
+  find_pandoc()
+
+  # check availability
+  found <- !is.null(.pandoc$dir) && (is.null(version) || .pandoc$version >= version)
+
+  msg <- c(
+    "pandoc", if (!is.null(version)) c("version", version, "or higher"),
+    "is required and was not found (see the help page ?rmarkdown::pandoc_available)."
+  )
+  if (error && !found) stop(paste(msg, collapse = " "), call. = FALSE)
+
+  found
+}
+
+
+#' @rdname pandoc_available
+#' @export
+pandoc_version <- function() {
+  find_pandoc()
+  .pandoc$version
+}
+
+#' Functions for generating pandoc command line arguments
+#'
+#' Functions that assist in creating various types of pandoc command line
+#' arguments (e.g. for templates, table of contents, highlighting, and content
+#' includes)
+#'
+#' @inheritParams includes
+#'
+#' @param name Name of template variable to set.
+#' @param value Value of template variable (defaults to \code{true} if missing).
+#' @param toc \code{TRUE} to include a table of contents in the output.
+#' @param toc_depth Depth of headers to include in table of contents.
+#' @param highlight The name of a pandoc syntax highlighting theme.
+#' @param latex_engine LaTeX engine for producing PDF output. Options are
+#'   "pdflatex", "lualatex", and "xelatex".
+#' @param default The highlighting theme to use if "default"
+#'   is specified.
+#'
+#' @return A character vector with pandoc command line arguments
+#'
+#' @details Non-absolute paths for resources referenced from the
+#'   \code{in_header}, \code{before_body}, and \code{after_body}
+#'   parameters are resolved relative to the directory of the input document.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' pandoc_include_args(before_body = "header.htm")
+#' pandoc_include_args(before_body = "header.tex")
+#'
+#' pancoc_highlight_args("kate")
+#'
+#' pandoc_latex_engine_args("pdflatex")
+#'
+#' pandoc_toc_args(toc = TRUE, toc_depth = 2)
+#'
+#' }
+#' @name pandoc_args
+NULL
+
+#' @rdname pandoc_args
+#' @export
+pandoc_variable_arg <- function(name, value) {
+  c("--variable", if (missing(value)) name else paste(name, "=", value, sep = ""))
+}
+
+
+#' @rdname pandoc_args
+#' @export
+pandoc_include_args <- function(in_header = NULL,
+                                before_body = NULL,
+                                after_body = NULL) {
+  args <- c()
+
+  for (file in in_header)
+    args <- c(args, "--include-in-header", pandoc_path_arg(file))
+
+  for (file in before_body)
+    args <- c(args, "--include-before-body", pandoc_path_arg(file))
+
+  for (file in after_body)
+    args <- c(args, "--include-after-body", pandoc_path_arg(file))
+
+  args
+}
+
+#' @rdname pandoc_args
+#' @export
+pandoc_highlight_args <- function(highlight, default = "tango") {
+
+  args <- c()
+
+  if (is.null(highlight))
+    args <- c(args, "--no-highlight")
+  else {
+    if (identical(highlight, "default"))
+      highlight <- default
+    args <- c(args, "--highlight-style", highlight)
+  }
+
+  args
+}
+
+#' @rdname pandoc_args
+#' @export
+pandoc_latex_engine_args <- function(latex_engine) {
+  c(if (pandoc2.0()) "--pdf-engine" else "--latex-engine",
+    find_latex_engine(latex_engine))
+}
+
+# For macOS, use a full path to the latex engine since the stripping
+# of the PATH environment variable by OSX 10.10 Yosemite prevents
+# pandoc from finding the engine in e.g. /usr/texbin
+find_latex_engine <- function(latex_engine) {
+  # do not need full path if latex_engine is available from PATH
+  if (!is_osx() || nzchar(Sys.which(latex_engine))) return(latex_engine)
+  # resolve path if it's not already an absolute path
+  if (!grepl("/", latex_engine) && nzchar(path <- find_program(latex_engine)))
+    latex_engine <- path
+  latex_engine
+}
+
+#' @rdname pandoc_args
+#' @export
+pandoc_toc_args <- function(toc, toc_depth = 3) {
+
+  args <- c()
+
+  if (toc) {
+    args <- c(args, "--table-of-contents")
+    args <- c(args, "--toc-depth", toc_depth)
+  }
+
+  args
+}
+
+
+#' Transform path for passing to pandoc
+#'
+#' Transform a path for passing to pandoc on the command line. Calls
+#' \code{\link[base:path.expand]{path.expand}} on all platforms. On Windows,
+#' transform it to a short path name if it contains spaces, and then convert
+#' forward slashes to back slashes (as required by pandoc for some path
+#' references)
+#'
+#' @param path Path to transform
+#' @param backslash Whether to replace forward slashes in \code{path} with
+#'   backslashes on Windows
+#'
+#' @return Transformed path that can be passed to pandoc on the command line
+#'
+#' @export
+pandoc_path_arg <- function(path, backslash = TRUE) {
+
+  path <- path.expand(path)
+
+  # remove redundant ./ prefix if present
+  path <- sub('^[.]/', '', path)
+
+  if (is_windows()) {
+    i <- grep(' ', path)
+    if (length(i))
+      path[i] <- utils::shortPathName(path[i])
+    if (backslash) path <- gsub('/', '\\\\', path)
+  }
+
+  path
+}
+
+
+#' Render a pandoc template.
+#'
+#' Use the pandoc templating engine to render a text file. Substitutions are
+#' done using the \code{metadata} list passed to the function.
+#'
+#' @param metadata A named list containing metadata to pass to template.
+#' @param template Path to a pandoc template.
+#' @param output Path to save output.
+#' @param verbose \code{TRUE} to show the pandoc command line which was
+#'   executed.
+#' @return (Invisibly) The path of the generated file.
+#'
+#' @export
+pandoc_template <- function(metadata, template, output, verbose = FALSE) {
+
+  tmp <- tempfile(fileext = ".md")
+  on.exit(unlink(tmp))
+
+  cat("---\n", file = tmp)
+  cat(yaml::as.yaml(metadata), file = tmp, append = TRUE)
+  cat("---\n", file = tmp, append = TRUE)
+  cat("\n", file = tmp, append = TRUE)
+
+  pandoc_convert(tmp, "markdown", output = output,
+                 options = paste0("--template=", template),
+                 verbose = verbose)
+
+  invisible(output)
+}
+
+#' Create a self-contained HTML document using pandoc.
+#'
+#' Create a self-contained HTML document by base64 encoding images,
+#' scripts, and stylesheets referended by the input document.
+#'
+#' @param input Input html file to create self-contained version of.
+#' @param output Path to save output.
+#'
+#' @return (Invisibly) The path of the generated file.
+#'
+#' @export
+pandoc_self_contained_html <- function(input, output) {
+
+  # make input file path absolute
+  input <- normalizePath(input)
+
+  # ensure output file exists and make it's path absolute
+  if (!file.exists(output))
+    file.create(output)
+  output <- normalizePath(output)
+
+  # create a simple body-only template
+  template <- tempfile(fileext = ".html")
+  on.exit(unlink(template), add = TRUE)
+  writeLines("$body$", template)
+
+  # convert from markdown to html to get base64 encoding
+  # (note there is no markdown in the source document but
+  # we still need to do this "conversion" to get the
+  # base64 encoding)
+
+  # determine from (there are bugs in pandoc < 1.17 that
+  # cause markdown_strict to hang on very large script
+  # elements)
+  from <- if (pandoc_available("1.17"))
+            "markdown_strict"
+          else
+            "markdown"
+
+  # do the conversion
+  pandoc_convert(
+    input = input,
+    from = from,
+    output = output,
+    options = c(
+      "--self-contained",
+      "--template", template
+    )
+  )
+
+  invisible(output)
+}
+
+
+
+validate_self_contained <- function(mathjax) {
+  if (identical(mathjax, "local"))
+    stop("Local MathJax isn't compatible with self_contained\n",
+         "(you should set self_contained to FALSE)", call. = FALSE)
+}
+
+pandoc_mathjax_args <- function(mathjax,
+                                template,
+                                self_contained,
+                                files_dir,
+                                output_dir) {
+  args <- c()
+
+  if (!is.null(mathjax)) {
+
+    if (identical(mathjax, "default")) {
+      if (identical(template, "default"))
+        mathjax <- default_mathjax()
+      else
+        mathjax <- NULL
+    }
+    else if (identical(mathjax, "local")) {
+      mathjax_path <- pandoc_mathjax_local_path()
+      mathjax_path <- render_supporting_files(mathjax_path,
+                                              files_dir,
+                                              "mathjax-local")
+      mathjax <- paste(normalized_relative_to(output_dir, mathjax_path), "/",
+                       mathjax_config(), sep = "")
+    }
+
+    if (identical(template, "default")) {
+      args <- c(args, "--mathjax")
+      args <- c(args, "--variable", paste0("mathjax-url:", mathjax))
+    } else if (!self_contained) {
+      args <- c(args, "--mathjax")
+      if (!is.null(mathjax))
+        args <- c(args, mathjax)
+    } else {
+      warning("MathJax doesn't work with self_contained when not ",
+              "using the rmarkdown \"default\" template.", call. = FALSE)
+    }
+
+  }
+
+  args
+}
+
+
+pandoc_mathjax_local_path <- function() {
+
+  local_path <- Sys.getenv("RMARKDOWN_MATHJAX_PATH", unset = NA)
+  if (is.na(local_path)) {
+    local_path <- unix_mathjax_path()
+    if (is.na(local_path)) {
+      stop("For mathjax = \"local\", please set the RMARKDOWN_MATHJAX_PATH ",
+           "environment variable to the location of MathJax. ",
+           "On Linux systems you can also install MathJax using your ",
+           "system package manager.")
+    } else {
+      local_path
+    }
+  } else {
+    local_path
+  }
+}
+
+
+unix_mathjax_path <- function() {
+  if (identical(.Platform$OS.type, "unix")) {
+    mathjax_path <- "/usr/share/javascript/mathjax"
+    if (file.exists(file.path(mathjax_path, "MathJax.js")))
+      mathjax_path
+    else
+      NA
+  } else {
+    NA
+  }
+}
+
+
+pandoc_html_highlight_args <- function(template, highlight) {
+
+  args <- c()
+
+  if (is.null(highlight)) {
+    args <- c(args, "--no-highlight")
+  }
+  else if (!identical(template, "default")) {
+    if (identical(highlight, "default"))
+      highlight <- "pygments"
+    args <- c(args, "--highlight-style", highlight)
+  }
+  else {
+    highlight <- match.arg(highlight, html_highlighters())
+    if (is_highlightjs(highlight)) {
+      args <- c(args, "--no-highlight")
+      args <- c(args, "--variable", "highlightjs=1")
+    }
+    else {
+      args <- c(args, "--highlight-style", highlight)
+    }
+  }
+
+  args
+}
+
+is_highlightjs <- function(highlight) {
+  !is.null(highlight) && (highlight %in% c("default", "textmate"))
+}
+
+# Scan for a copy of pandoc and set the internal cache if it's found.
+find_pandoc <- function() {
+
+  if (is.null(.pandoc$dir)) {
+
+    # define potential sources
+    sys_pandoc <- find_program("pandoc")
+    sources <- c(Sys.getenv("RSTUDIO_PANDOC"),
+                 ifelse(nzchar(sys_pandoc), dirname(sys_pandoc), ""))
+    if (!is_windows())
+      sources <- c(sources, path.expand("~/opt/pandoc"))
+
+    # determine the versions of the sources
+    versions <- lapply(sources, function(src) {
+      if (dir_exists(src))
+        get_pandoc_version(src)
+      else
+        numeric_version("0")
+    })
+
+    # find the maximum version
+    found_src <- NULL
+    found_ver <- numeric_version("0")
+    for (i in 1:length(sources)) {
+      ver <- versions[[i]]
+      if (ver > found_ver) {
+        found_ver <- ver
+        found_src <- sources[[i]]
+      }
+    }
+
+    # did we find a version?
+    if (!is.null(found_src)) {
+      .pandoc$dir <- found_src
+      .pandoc$version <- found_ver
+    }
+  }
+}
+
+# Get an S3 numeric_version for the pandoc utility at the specified path
+get_pandoc_version <- function(pandoc_dir) {
+  pandoc_path <- file.path(pandoc_dir, "pandoc")
+  if (is_windows()) pandoc_path <- paste0(pandoc_path, ".exe")
+  if (!utils::file_test("-x", pandoc_path)) return(numeric_version("0"))
+  with_pandoc_safe_environment({
+    version_info <- system(paste(shQuote(pandoc_path), "--version"),
+                           intern = TRUE)
+  })
+  version <- strsplit(version_info, "\n")[[1]][1]
+  version <- strsplit(version, " ")[[1]][2]
+  numeric_version(version)
+}
+
+# wrap a system call to pandoc so that LC_ALL is not set
+# see: https://github.com/rstudio/rmarkdown/issues/31
+# see: https://ghc.haskell.org/trac/ghc/ticket/7344
+with_pandoc_safe_environment <- function(code) {
+  lc_all <- Sys.getenv("LC_ALL", unset = NA)
+  if (!is.na(lc_all)) {
+    Sys.unsetenv("LC_ALL")
+    on.exit(Sys.setenv(LC_ALL = lc_all), add = TRUE)
+  }
+  lc_ctype <- Sys.getenv("LC_CTYPE", unset = NA)
+  if (!is.na(lc_ctype)) {
+    Sys.unsetenv("LC_CTYPE")
+    on.exit(Sys.setenv(LC_CTYPE = lc_ctype), add = TRUE)
+  }
+  if (Sys.info()['sysname'] == "Linux" &&
+        is.na(Sys.getenv("HOME", unset = NA))) {
+    stop("The 'HOME' environment variable must be set before running Pandoc.")
+  }
+  if (Sys.info()['sysname'] == "Linux" &&
+        is.na(Sys.getenv("LANG", unset = NA))) {
+    # fill in a the LANG environment variable if it doesn't exist
+    Sys.setenv(LANG = detect_generic_lang())
+    on.exit(Sys.unsetenv("LANG"), add = TRUE)
+  }
+  if (Sys.info()['sysname'] == "Linux" &&
+    identical(Sys.getenv("LANG"), "en_US")) {
+    Sys.setenv(LANG = "en_US.UTF-8")
+    on.exit(Sys.setenv(LANG = "en_US"), add = TRUE)
+  }
+  force(code)
+}
+
+# if there is no LANG environment variable set pandoc is going to hang so
+# we need to specify a "generic" lang setting. With glibc >= 2.13 you can
+# specify C.UTF-8 so we prefer that. If we can't find that then we fall back
+# to en_US.UTF-8.
+detect_generic_lang <- function() {
+
+  locale_util <- Sys.which("locale")
+
+  if (nzchar(locale_util)) {
+    locales <- system(paste(locale_util, "-a"), intern = TRUE)
+    locales <- suppressWarnings(
+        strsplit(locales, split = "\n", fixed = TRUE)
+    )
+    if ("C.UTF-8" %in% locales)
+      return("C.UTF-8")
+  }
+
+  # default to en_US.UTF-8
+  "en_US.UTF-8"
+}
+
+
+
+# get the path to the pandoc binary
+pandoc <- function() {
+  find_pandoc()
+  file.path(.pandoc$dir, "pandoc")
+}
+
+# get the path to the pandoc-citeproc binary
+pandoc_citeproc <- function() {
+  find_pandoc()
+  citeproc_path = file.path(.pandoc$dir, "pandoc-citeproc")
+  if (file.exists(citeproc_path))
+    citeproc_path
+  else
+    "pandoc-citeproc"
+}
+
+# quote args if they need it
+quoted <- function(args) {
+  # some characters are legal in filenames but without quoting are likely to be
+  # interpreted by the shell (e.g. redirection, wildcard expansion, etc.) --
+  # wrap arguments containing these characters in quotes.
+  shell_chars <- grepl(.shell_chars_regex, args)
+  args[shell_chars] <- shQuote(args[shell_chars])
+  args
+}
+
+find_pandoc_theme_variable <- function(args) {
+  range <- length(args) - 1
+  for (i in 1:range) {
+    if (args[[i]] == "--variable" && grepl("^theme:", args[[i + 1]])) {
+      return(substring(args[[i + 1]], nchar("theme:") + 1))
+    }
+  }
+  # none found, return NULL
+  NULL
+}
+
+
+# Environment used to cache the current pandoc directory and version
+.pandoc <- new.env()
+.pandoc$dir <- NULL
+.pandoc$version <- NULL
+
+pandoc2.0 <- function() pandoc_available("2.0")
diff --git a/R/params.R b/R/params.R
new file mode 100644
index 0000000..a9e9d89
--- /dev/null
+++ b/R/params.R
@@ -0,0 +1,476 @@
+
+knit_params_get <- function(input_lines, params) {
+
+  # read the default parameters and extract them into a named list
+  knit_params <- knitr::knit_params(input_lines)
+  if (packageVersion('yaml') < '2.1.14') knit_params <- mark_utf8(knit_params)
+  default_params <- list()
+  for (param in knit_params) {
+    default_params[param$name] <- list(param$value)
+  }
+
+  # validate params passed to render
+  if (!is.null(params)) {
+
+    if (identical(params, "ask")) {
+      params <- knit_params_ask(
+        input_lines = input_lines, shiny_args = list(launch.browser = TRUE)
+      )
+      if (is.null(params)) {
+        stop("render parameter configuration canceled")
+      }
+    }
+
+    # verify they are a list
+    if (!is.list(params) || (length(names(params)) != length(params))) {
+      stop("render params argument must be a named list")
+    }
+
+    # verify that all parameters passed are also in the yaml
+    invalid_params <- setdiff(names(params), names(default_params))
+    if (length(invalid_params) > 0) {
+      stop("render params not declared in YAML: ",
+           paste(invalid_params, collapse = ", "))
+    }
+  }
+
+  # merge explicitly provided params with defaults
+  merge_lists(default_params, params, recursive = FALSE)
+}
+
+params_label <- function(inputControlFn, param) {
+  label <- ifelse(is.null(param$label), param$name, param$label)
+  if (identical(inputControlFn, shiny::fileInput)) {
+    if (is.character(param$value)) {
+      label <- paste0(label, " (default: ", param$value, ")")
+    }
+  }
+  label
+}
+
+params_value_to_ui <- function(inputControlFn, value, showDefault) {
+  if (is.null(showDefault)) {
+    showDefault <- TRUE
+  }
+
+  isNumericInput <- identical(inputControlFn, shiny::numericInput) ||
+    identical(inputControlFn, shiny::sliderInput)
+
+  if (identical(inputControlFn, shiny::fileInput)) {
+    NULL
+  } else if (identical(inputControlFn, shiny::textInput)) {
+    ## TODO: if long input, maybe truncate textInput values for display
+
+    if (showDefault) {
+      classes <- class(value)
+      if ("POSIXct" %in% classes) {
+        as.character(value)
+      } else {
+        value
+      }
+    } else {
+      NULL
+    }
+  } else if (is.null(value)) {
+    # The numerics can't deal with a NULL value, but everything else is fine.
+    if (isNumericInput) {
+      0
+    } else {
+      value
+    }
+  } else {
+    if (showDefault) {
+      ## A type/control that doesn't need special handling; just emit the value.
+      value
+    } else {
+      if (isNumericInput) {
+        0
+      } else if (identical(inputControlFn, shiny::dateInput)) {
+        # Use NA to clear date inputs:
+        # https://github.com/rstudio/shiny/pull/1299
+        NA
+      } else if (identical(inputControlFn, shiny::radioButtons)) {
+        # As suggested in ?radioButtons
+        character(0)
+      } else {
+        NULL
+      }
+    }
+  }
+}
+
+params_value_from_ui <- function(inputControlFn, value, uivalue) {
+  if (identical(inputControlFn, shiny::fileInput)) {
+    backup_file_input(uivalue$datapath)
+  } else if (identical(inputControlFn, shiny::textInput)) {
+    classes <- class(value)
+    if ("POSIXct" %in% classes) {
+      if (identical(uivalue, "")) {
+        # show_default: false produces this situation
+        # Empty POSIXct
+        Sys.time()[-1]
+      } else {
+        as.POSIXct(uivalue)
+      }
+    } else {
+      uivalue
+    }
+  } else {
+    ## A type/control that doesn't need special handling; just emit the value.
+    uivalue
+  }
+}
+
+# Uploaded files will be deleted when the shiny UI is closed, so we need to back
+# them up to new temp files: https://github.com/rstudio/rmarkdown/issues/919
+backup_file_input <- function(files) {
+  files2 <- files
+  for (i in seq_along(files)) {
+    dir.create(d <- tempfile())
+    files2[i] <- file.path(d, basename(files[i]))
+  }
+  file.copy(files, files2)
+  files2
+}
+
+params_get_input <- function(param) {
+  # Maps between value types and input: XXX
+  default_inputs <- list(
+      logical = "checkbox",
+      Date = "date",
+      ## BUG: shiny does not support datetime selectors
+      ##     https://github.com/rstudio/shiny/issues/897
+      ##     we ask for string input for now.
+      POSIXct = "datetime",
+      character = "text"
+      )
+  default_inputs$integer <- default_inputs$numeric <-  {
+    ## If min/max are specified, use a slider.
+    if (is.null(param$min) || is.null(param$max)) {
+      "numeric"
+    } else {
+      "slider"
+    }
+  }
+
+  input <- param$input
+  if (is.null(input)) {
+    if (!is.null(param$choices)) {
+      ## radio buttons for a small number of choices, select otherwise.
+      if (length(param$choices) <= 4) {
+        input <- "radio"
+      } else {
+        input <- "select"
+      }
+    } else {
+      ## Not choices. Look at the value type to find what input control we
+      ## should use.
+
+      ## A value might have multiple classes. Try: class(Sys.time())
+      ## Try to find first class listed with a named control.
+      for (c in class(param$value)) {
+        default_input <- default_inputs[[c]]
+        if (!is.null(default_input)) {
+          input <- default_input
+          break
+        }
+      }
+    }
+  }
+  input
+}
+
+params_get_control <- function(param) {
+  input <- params_get_input(param)
+  if (is.null(input)) {
+    return(NULL)
+  }
+
+  # Maps between input: XXX and the various Shiny input controls
+  input_controls <- list(
+      checkbox = shiny::checkboxInput,
+      numeric  = shiny::numericInput,
+      slider   = shiny::sliderInput,
+      date     = shiny::dateInput,
+      datetime = shiny::textInput, # placeholder for future datetime picker
+      text     = shiny::textInput,
+      file     = shiny::fileInput,
+      radio    = shiny::radioButtons,
+      select   = shiny::selectInput
+      )
+  control <- input_controls[[input]]
+  if (is.null(control)) {
+    stop(paste("could not determine what control to use for parameter", param$name, "with input:", input))
+  }
+  control
+}
+
+# Returns true if the parameter can be configurable with Shiny UI elements.
+params_configurable <- function(param) {
+  if (is.null(params_get_control(param))) {
+    return(FALSE)                       # no Shiny control
+  }
+  multiple_ok <- (!is.null(param$multiple) && param$multiple)
+  if (multiple_ok) {
+    return(TRUE)
+  }
+  return(length(param$value) <= 1)     # multiple values only when multi-input controls
+}
+
+# Returns a new empty named list.
+params_namedList <- function() {
+  empty <- list()
+  names(empty) <- character()
+  empty
+}
+
+#' Run a shiny application asking for parameter configuration for the given document.
+#'
+#' @param file Path to the R Markdown document with configurable parameters.
+#' @param input_lines Content of the R Markdown document. If \code{NULL}, the contents of \code{file} will be read.
+#' @param params A named list of optional parameter overrides used in place of the document defaults.
+#' @param shiny_args Additional arguments to \code{\link[shiny:runApp]{runApp}}.
+#' @param save_caption Caption to use use for button that saves/confirms parameters.
+#' @param encoding The encoding of the input file; see \code{\link{file}}.
+#'
+#' @return named list with overridden parameter names and value.
+#'
+#' @export
+knit_params_ask <- function(file = NULL,
+                            input_lines = NULL,
+                            params = NULL,
+                            shiny_args = NULL,
+                            save_caption = "Save",
+                            encoding = getOption("encoding")) {
+
+  if (is.null(input_lines)) {
+    if (is.null(file)) {
+      stop("knit_params_ask must have a non-NULL file or input_lines parameter")
+    }
+    input_lines <- read_lines_utf8(file, encoding)
+  }
+
+  knit_params <- knitr::knit_params(input_lines)
+  if (packageVersion('yaml') < '2.1.14') knit_params <- mark_utf8(knit_params)
+
+  ## Input validation on params (checks shared with render)
+  if (!is.null(params)) {
+    ## Must be a named list
+    if (!is.list(params) || (length(names(params)) != length(params))) {
+      stop("knit_params_ask params argument must be a named list")
+    }
+    ## We do not validate names(params) because the document may have changed
+    ## but we're loading parameters that were configured with an older
+    ## version.
+  }
+
+  ## If we happen to not have any knit_params, just return an empty named list
+  ## and don't fire up the Shiny app.
+  if (length(knit_params) == 0) {
+    return(params_namedList())
+  }
+
+  configurable <- Filter(params_configurable, knit_params)
+  unconfigurable <- Filter(Negate(params_configurable), knit_params)
+
+  ## This set of published values is the raw set that came from the user.
+  ## It does not include those values that cannot be configured or are
+  ## left to use the default.
+  values <- params_namedList()
+
+  server <- function(input, output, session) {
+    param.ui <- function(param) {
+      inputControlFn <- params_get_control(param)
+      inputControlFnFormals <- names(formals(inputControlFn))
+
+      inputId <- param$name
+      label <- params_label(inputControlFn, param)
+
+      arguments = list(
+          inputId = inputId,
+          label = label
+          )
+
+      # We MUST process the "value" name even if it is not present (due to
+      # NULL values).
+      attrib_names <- unique(c(names(param), "value"))
+      lapply(attrib_names, function(name) {
+        if (name %in% c("name", "input", "expr")) {
+        } else if (name == "label") {
+          arguments$label <<- label
+        } else if (name == "value") {
+
+          ## The current value for this parameter is either `params` when
+          ## overridden by our caller or `param$value` otherwise.
+          current_value <- param$value
+          if (!is.null(params)) {
+            override <- params[[param$name]]
+            if (!is.null(override)) {
+              current_value <- override
+            }
+          }
+          # Now, transform into something that the input control can handle.
+          current_value <- params_value_to_ui(inputControlFn, current_value,
+                                              param$show_default)
+
+          # value maps to either "value" or "selected" depending on the control.
+          if ("value" %in% inputControlFnFormals) {
+            arguments$value <<- current_value
+          } else if ("selected" %in% inputControlFnFormals) {
+            arguments$selected <<- current_value
+          }
+        } else if (name == "show_default") {
+          # No-op
+        } else {
+          ## Not a special field. Blindly promote to the input control.
+          arguments[[name]] <<- if (inherits(param[[name]], 'knit_param_expr')) {
+            param[[name]][['value']]
+          } else param[[name]]
+        }
+      })
+
+      ## This is based on param$value not current_value because we want to
+      ## understand deviation from the report default, not any (optional)
+      ## call-time override.
+      uidefault <- params_value_to_ui(inputControlFn, param$value, param$show_default)
+      hasDefaultValue <- function(value) {
+        identical(uidefault, value)
+      }
+
+      inputControl <- NULL
+      unsupported <- setdiff(names(arguments), inputControlFnFormals)
+      if (length(unsupported) > 0) {
+        inputControl <- shiny::div(class = "form-group",
+                                   tags$label(class = "control-label",param$name),
+                                   shiny::div(paste('Cannot customize the parameter "', param$name, '" ',
+                                                    'because the "', params_get_input(param), '" ',
+                                                    'Shiny control does not support: ',
+                                                    paste(unsupported, collapse = ', '), sep = '')))
+      } else {
+        inputControl <- do.call(inputControlFn, arguments)
+      }
+
+      showSelectControl <- NULL
+      selectControl <- NULL
+      selectInputId <- paste0("select_", param$name)
+
+      ## Helper to materialize a "default/customize" control.
+      makeSelectControl <- function(default_name, custom_name) {
+        showSelectControl <<- function(current) {
+          (is.null(current) || identical(current, "default"))
+        }
+        hasDefaultValue <<- function(value) { FALSE }
+        choices <- list()
+        choices[[default_name]] <- "default"
+        choices[[custom_name]] <- "custom"
+        selectControl <<- shiny::selectInput(inputId = selectInputId,
+                                             label = label,
+                                             choices = choices)
+      }
+
+      if (is.null(params[[param$name]])) { # prior value; implicit customization
+        ## Dates and times with expressions that mean "now" or "today" are first
+        ## materialized as selects. If the user chooses to customize the field,
+        ## we then show the type-specific picker.
+        if (identical("Sys.time()", param$expr)) {
+          makeSelectControl(paste0("now (", param$value, ")"),
+                            "Use a custom time")
+        } else if (identical("Sys.Date()", param$expr)) {
+          makeSelectControl(paste0("today (", param$value, ")"),
+                            "Use a custom date")
+        } else if (is.null(param$value)) {
+          # fileInput defaults to null, but for other null values, ask the
+          # user to explicitly choose to override (ie. we cannot use value
+          # comparison).
+          if (!identical(inputControlFn, shiny::fileInput)) {
+            makeSelectControl("Unspecified (NULL)",
+                              "Use a custom value")
+          }
+        }
+      }
+
+      output[[paste0("ui_", param$name)]] <- shiny::renderUI({
+        # For most parameters, the selectInputId input will be NULL.
+        if (!is.null(showSelectControl) && showSelectControl(input[[selectInputId]])) {
+          selectControl
+        } else {
+          inputControl
+        }
+      })
+
+      shiny::observe({
+        # A little reactive magic to keep in mind. If you're in one of the
+        # "default/custom" selector scenarios, this will never fire until the
+        # user selects "custom" because the value-producing input control is
+        # not rendered until that point.
+        uivalue <- input[[param$name]]
+        if (is.null(uivalue) || hasDefaultValue(uivalue)) {
+          values[[param$name]] <<- NULL
+        } else {
+          values[[param$name]] <<- params_value_from_ui(inputControlFn, param$value, uivalue)
+        }
+      })
+    }
+
+    lapply(configurable, function(param) {
+      param.ui(param)
+    })
+
+    shiny::observeEvent(input$save, {
+      session$onFlushed(function() {
+        session$close()
+        shiny::stopApp(values)
+      })
+    })
+
+    shiny::observeEvent(input$cancel, {
+      session$onFlushed(function() {
+        session$close()
+        shiny::stopApp(NULL)
+      })
+    })
+  }
+
+  contents <- shiny::tags$div(
+      shiny::fluidRow(shiny::column(12, lapply(configurable, function(param) {
+        shiny::uiOutput(paste0("ui_", param$name))
+      }))), class = "container-fluid")
+
+  if (length(unconfigurable) > 0) {
+    skipped <- shiny::tags$div(shiny::tags$strong("Note:"),
+                            "The following parameters cannot be customized:",
+                            paste(lapply(unconfigurable, function(param) { param$name }), collapse = ", "))
+    contents <- shiny::tagAppendChildren(contents, shiny::fluidRow(shiny::column(12, skipped)))
+  }
+  footer <- shiny::tags$div(
+      shiny::tags$div(
+          shiny::fluidRow(shiny::column(12,
+                                        shiny::actionButton("save", save_caption, class = "btn-primary navbar-btn pull-right"),
+                                        shiny::actionButton("cancel","Cancel", class = "navbar-btn pull-right"))),
+          class = "container-fluid"),
+      class = "navbar navbar-default navbar-fixed-bottom")
+
+  style <- shiny::tags$style(
+      # Our controls are wiiiiide.
+      ".container-fluid .shiny-input-container { width: auto; }",
+      # Prevent the save/cancel buttons from squashing together.
+      ".navbar button { margin-left: 10px; }",
+      # Style for the navbar footer.
+      # http://getbootstrap.com/components/#navbar-fixed-bottom
+      "body { padding-bottom: 70px; }"
+                             )
+  ## Escape is "cancel" and Enter is "save".
+  script <- shiny::tags$script(shiny::HTML("$(document).keyup(function(e) {\n",
+                                           "if (e.which == 13) { $('#save').click(); } // enter\n",
+                                           "if (e.which == 27) { $('#cancel').click(); } // esc\n",
+                                           "});"
+                                           ))
+  ui <- shiny::bootstrapPage(
+      shiny::tags$head(style, script),
+      contents,
+      footer)
+
+  shiny_app <- shiny::shinyApp(ui = ui, server = server)
+  shiny_args <- merge_lists(list(appDir = shiny_app), shiny_args)
+  do.call(shiny::runApp, shiny_args)
+}
diff --git a/R/pdf_document.R b/R/pdf_document.R
new file mode 100644
index 0000000..b90ef45
--- /dev/null
+++ b/R/pdf_document.R
@@ -0,0 +1,256 @@
+#' Convert to a PDF/LaTeX document
+#'
+#' Formats for converting from R Markdown to a PDF or LaTeX document.
+#'
+#' @inheritParams html_document
+#'
+#' @param fig_crop \code{TRUE} to automatically apply the \code{pdfcrop} utility
+#'   (if available) to pdf figures
+#' @param dev Graphics device to use for figure output (defaults to pdf)
+#' @param highlight Syntax highlighting style. Supported styles include
+#'   "default", "tango", "pygments", "kate", "monochrome", "espresso",
+#'   "zenburn", and "haddock". Pass \code{NULL} to prevent syntax highlighting.
+#' @param keep_tex Keep the intermediate tex file used in the conversion to PDF
+#' @param latex_engine LaTeX engine for producing PDF output. Options are
+#'   "pdflatex", "lualatex", and "xelatex".
+#' @param citation_package The LaTeX package to process citations, \code{natbib}
+#'   or \code{biblatex}. Use \code{none} if neither package is to be used.
+#' @param template Pandoc template to use for rendering. Pass "default" to use
+#'   the rmarkdown package default template; pass \code{NULL} to use pandoc's
+#'   built-in template; pass a path to use a custom template that you've
+#'   created.  See the documentation on
+#'   \href{http://pandoc.org/README.html}{pandoc online documentation}
+#'   for details on creating custom templates.
+#' @param extra_dependencies A LaTeX dependency \code{latex_dependency()}, a
+#'   list of LaTeX dependencies, a character vector of LaTeX package names (e.g.
+#'   \code{c("framed", "hyperref")}), or a named list of LaTeX package options
+#'   with the names being package names (e.g. \code{list(hypreref =
+#'   c("unicode=true", "breaklinks=true"), lmodern = NULL)}). It can be used to
+#'   add custom LaTeX packages to the .tex header.
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' See the \href{http://rmarkdown.rstudio.com/pdf_document_format.html}{online
+#' documentation} for additional details on using the \code{pdf_document} format.
+#'
+#' Creating PDF output from R Markdown requires that LaTeX be installed.
+#'
+#' R Markdown documents can have optional metadata that is used to generate a
+#' document header that includes the title, author, and date. For more details
+#' see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+#'
+#' R Markdown documents also support citations. You can find more information on
+#' the markdown syntax for citations in the
+#' \href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+#' and Citations} article in the online documentation.
+#'
+#' Many aspects of the LaTeX template used to create PDF documents can be
+#' customized using metadata. For example:
+#'
+#' \tabular{l}{
+#' \code{---} \cr
+#' \code{title: "Crop Analysis Q3 2013"} \cr
+#' \code{fontsize: 11pt} \cr
+#' \code{geometry: margin=1in} \cr
+#' \code{---}
+#' }
+#'
+#' Available metadata variables include:
+#'
+#' \describe{
+#'    \item{\code{lang}}{Document language code (e.g. "es", "fr", "pt-BR")}
+#'    \item{\code{fontsize}}{Font size (e.g. 10pt, 11pt, 12pt)}
+#'    \item{\code{documentclass}}{LaTeX document class (e.g. article)}
+#'    \item{\code{classoption}}{Option for \code{documentclass} (e.g. oneside); may be repeated}
+#'    \item{\code{geometry}}{Options for geometry class (e.g. margin=1in); may be repeated}
+#'    \item{\code{mainfont, sansfont, monofont, mathfont}}{Document fonts (works only with xelatex and lualatex, see the \code{latex_engine} option)}
+#'    \item{\code{linkcolor, urlcolor, citecolor}}{Color for internal, external, and citation links (red, green, magenta, cyan, blue, black)}
+#'    \item{\code{linestretch}}{Options for line spacing (e.g. 1, 1.5, 3)}
+#' }
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' # simple invocation
+#' render("input.Rmd", pdf_document())
+#'
+#' # specify an option for latex engine
+#' render("input.Rmd", pdf_document(latex_engine = "lualatex"))
+#'
+#' # add a table of contents and pass an option to pandoc
+#' render("input.Rmd", pdf_document(toc = TRUE, "--listings"))
+#' }
+#'
+#' @export
+pdf_document <- function(toc = FALSE,
+                         toc_depth = 2,
+                         number_sections = FALSE,
+                         fig_width = 6.5,
+                         fig_height = 4.5,
+                         fig_crop = TRUE,
+                         fig_caption = TRUE,
+                         dev = 'pdf',
+                         df_print = "default",
+                         highlight = "default",
+                         template = "default",
+                         keep_tex = FALSE,
+                         latex_engine = "pdflatex",
+                         citation_package = c("none", "natbib", "biblatex"),
+                         includes = NULL,
+                         md_extensions = NULL,
+                         pandoc_args = NULL,
+                         extra_dependencies = NULL) {
+
+  # base pandoc options for all PDF output
+  args <- c()
+
+  # table of contents
+  args <- c(args, pandoc_toc_args(toc, toc_depth))
+
+  # template path and assets
+  if (identical(template, "default")) {
+
+    pandoc_available(error = TRUE)
+    # choose the right template
+    version <- pandoc_version()
+    if (version >= "1.17.0.2")
+      latex_template <- "default-1.17.0.2.tex"
+    else if (version >= "1.15.2")
+      latex_template <- "default-1.15.2.tex"
+    else if (version >= "1.14")
+      latex_template <- "default-1.14.tex"
+    else
+      latex_template <- "default.tex"
+
+    # add to args
+    args <- c(args, "--template",
+              pandoc_path_arg(rmarkdown_system_file(paste0("rmd/latex/",
+                                                           latex_template))))
+
+  } else if (!is.null(template)) {
+    args <- c(args, "--template", pandoc_path_arg(template))
+  }
+
+  # numbered sections
+  if (number_sections)
+    args <- c(args, "--number-sections")
+
+  # highlighting
+  if (!is.null(highlight))
+    highlight <- match.arg(highlight, highlighters())
+  args <- c(args, pandoc_highlight_args(highlight))
+
+  # latex engine
+  latex_engine = match.arg(latex_engine, c("pdflatex", "lualatex", "xelatex"))
+  args <- c(args, pandoc_latex_engine_args(latex_engine))
+
+  # citation package
+  citation_package <- match.arg(citation_package)
+  if (citation_package != "none") args <- c(args, paste0("--", citation_package))
+
+  # content includes
+  args <- c(args, includes_to_pandoc_args(includes))
+
+  # make sure the graphics package is always loaded
+  if (identical(template, "default")) args <- c(args, "--variable", "graphics=yes")
+
+  # args args
+  args <- c(args, pandoc_args)
+
+  saved_files_dir <- NULL
+
+  # Use filter to set pdf geometry defaults (while making sure we don't override
+  # any geometry settings already specified by the user)
+  pdf_pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir,
+                                output_dir) {
+
+    args <- c()
+
+    # set the margin to 1 inch if no other geometry options specified
+    has_geometry <- function(text) {
+      length(grep("^geometry:.*$", text)) > 0
+    }
+    if (!has_geometry(readLines(input_file, warn = FALSE)))
+      args <- c(args, "--variable", "geometry:margin=1in")
+
+    if (length(extra_dependencies) || has_latex_dependencies(knit_meta)) {
+      extra_dependencies <- latex_dependencies(extra_dependencies)
+      all_dependencies <- append(extra_dependencies, flatten_latex_dependencies(knit_meta))
+      filename <- as_tmpfile(latex_dependencies_as_string(all_dependencies))
+      if ("header-includes" %in% names(metadata)) {
+        cat(c("", metadata[["header-includes"]]), sep = "\n", file = filename, append = TRUE)
+      }
+      args <- c(args, includes_to_pandoc_args(includes(in_header = filename)))
+    }
+    args
+  }
+
+
+  pre_processor <- function(metadata, input_file, runtime, knit_meta,
+                                files_dir, output_dir) {
+    # save files dir (for generating intermediates)
+    saved_files_dir <<- files_dir
+
+    # use a geometry filter when we are using the "default" template
+    if (identical(template, "default"))
+      pdf_pre_processor(metadata, input_file, runtime, knit_meta, files_dir,
+                        output_dir)
+    else
+      invisible(NULL)
+  }
+
+  intermediates_generator <- function(original_input, encoding,
+                                      intermediates_dir) {
+    return(pdf_intermediates_generator(saved_files_dir, original_input,
+                                        encoding, intermediates_dir))
+  }
+
+  # return format
+  output_format(
+    knitr = knitr_options_pdf(fig_width, fig_height, fig_crop, dev),
+    pandoc = pandoc_options(to = "latex",
+                            from = from_rmarkdown(fig_caption, md_extensions),
+                            args = args,
+                            latex_engine = latex_engine,
+                            keep_tex = keep_tex),
+    clean_supporting = !keep_tex,
+    df_print = df_print,
+    pre_processor = pre_processor,
+    intermediates_generator = intermediates_generator
+  )
+}
+
+pdf_intermediates_generator <- function(saved_files_dir, original_input,
+                                        encoding, intermediates_dir) {
+  # copy all intermediates (pandoc will need to bundle them in the PDF)
+  intermediates <- copy_render_intermediates(original_input, encoding,
+                                             intermediates_dir, FALSE)
+
+  # we need figures from the supporting files dir to be available during
+  # render as well; if we have a files directory, copy its contents
+  if (!is.null(saved_files_dir) && dir_exists(saved_files_dir)) {
+    file.copy(saved_files_dir, intermediates_dir, recursive = TRUE)
+    intermediates <- c(intermediates, list.files(
+      path = file.path(intermediates_dir, basename(saved_files_dir)),
+      all.files = TRUE, recursive = TRUE, full.names = TRUE))
+  }
+
+  intermediates
+}
+
+#' @param ... Arguments passed to \code{pdf_document()}.
+#' @rdname pdf_document
+#' @export
+latex_document <- function(...) {
+  merge_lists(pdf_document(...), list(pandoc = list(ext = ".tex", keep_tex = TRUE)))
+}
+
+#' @rdname pdf_document
+#' @export
+latex_fragment <- function(...) {
+  latex_document(..., template = rmarkdown_system_file("rmd/fragment/default.tex"))
+}
diff --git a/R/performance.R b/R/performance.R
new file mode 100644
index 0000000..2f7c261
--- /dev/null
+++ b/R/performance.R
@@ -0,0 +1,81 @@
+# Supporting functions for performance timers. These are primarily used to make
+# performance information available in Shiny documents (see ::run), but can
+# also display a summary of performance after any render:
+#
+# > rmarkdown::render( ... )
+# > rmarkdown:::perf_timer_summary()
+
+# private environment to store performance timers
+.perf_timers <- new.env(parent = emptyenv())
+
+# convenience for returning ms elapsed since the R session began
+elapsed_ms <- function() {
+  proc.time()[3] * 1000
+}
+
+# clears all perf timer state
+perf_timer_reset_all <- function() {
+  env <- environment(perf_timer_reset_all)
+  do.call("unlockBinding", list(".perf_timers", env))
+  env$.perf_timers <- new.env(parent = emptyenv())
+  lockBinding(".perf_timers", env)
+  invisible(.perf_timers)
+}
+
+# record a start time for a perf timer
+perf_timer_start <- function(timer_name) {
+  assign(timer_name, list(start = elapsed_ms()), .perf_timers)
+}
+
+# record a stop time for a perf timer
+perf_timer_stop <- function(timer_name) {
+  if (!exists(timer_name, envir = .perf_timers))
+    return()
+  timer <- .perf_timers[[timer_name]]
+  timer$stop = elapsed_ms()
+  assign(timer_name, timer, .perf_timers)
+}
+
+# return a formatted data frame with a performance timer summary
+perf_timer_summary <- function() {
+  time <- sapply(ls(.perf_timers), function(timer_name) {
+    timer <- .perf_timers[[timer_name]]
+    timer$stop - timer$start
+  })
+  names(time) <- ls(.perf_timers)
+  data.frame(time)
+}
+
+# return a formatted JSON string with a performance timer summary
+# (for use in rmd_perf.js)
+perf_timers_as_json <- function() {
+  summary <- perf_timer_summary()
+  json <- paste(lapply(row.names(summary), function(t) {
+                         paste("{ marker: '", t, "',",
+                                " elapsed: ", as.integer(summary[t,]), " }",
+                               sep = "")
+                         }),
+                collapse = ", ")
+  json <- paste("[", json, "]")
+  json
+}
+
+# inject performance timings into rmd_perf.js; write performance timing
+# supporting files to files_dir and return an HTML dependency object suitable
+# for inclusion in the document for which the timings were collected
+create_performance_dependency <- function(files_dir) {
+  performance_js <- rmarkdown_system_file("rmd/h/rmarkdown/rmd_perf.js")
+  js_lines <- readLines(performance_js, warn = FALSE, encoding = "UTF-8")
+  js_lines <- gsub("RMARKDOWN_PERFORMANCE_TIMINGS", perf_timers_as_json(),
+                   js_lines, fixed = TRUE)
+  perf_js_file <- file.path(files_dir, "rmd_perf.js")
+  writeLines(js_lines, perf_js_file)
+  file.copy(rmarkdown_system_file("rmd/h/rmarkdown/rmd_perf.css"),
+            file.path(files_dir, "rmd_perf.css"))
+  htmlDependency(
+    name = "rmarkdown-performance",
+    version = "0.1",
+    src = files_dir,
+    script = "rmd_perf.js",
+    stylesheet = "rmd_perf.css")
+}
diff --git a/R/relative_to.R b/R/relative_to.R
new file mode 100644
index 0000000..d035312
--- /dev/null
+++ b/R/relative_to.R
@@ -0,0 +1,37 @@
+
+#' Relative path utility function
+#'
+#' Given a directory and a file, return a relative path from the directory to
+#' the file, or the unmodified file path if the file does not appear to be in
+#' the directory.
+#'
+#' @param dir Directory
+#' @param file File
+#'
+#' @return Relative path from the directory to the file (or the unmodified file
+#'   path if the file does not appear to be in the directory).
+#'
+#' @export
+relative_to <- function(dir, file) {
+  # ensure directory ends with a /
+  if (!identical(substr(dir, nchar(dir), nchar(dir)), "/")) {
+    dir <- paste0(dir, "/")
+  }
+
+  # if the file is prefixed with the directory, return a relative path
+  if (identical(substr(file, 1, nchar(dir)), dir))
+    file <- substr(file, nchar(dir) + 1, nchar(file))
+
+  # simplify ./
+  if (identical(substr(file, 1, 2), "./"))
+    file <- substr(file, 3, nchar(file))
+
+  file
+}
+
+# A variant of relative_to that normalizes its inputs.
+normalized_relative_to <- function(dir, file) {
+  relative_to(
+    normalize_path(dir, mustWork = FALSE),
+    normalize_path(file, mustWork = FALSE))
+}
diff --git a/R/render.R b/R/render.R
new file mode 100644
index 0000000..c33c7cb
--- /dev/null
+++ b/R/render.R
@@ -0,0 +1,847 @@
+#' The YAML metadata of the current R Markdown document
+#'
+#' The object \code{metadata} stores the YAML metadata of the current R Markdown
+#' document as a list, which you may use in the R code chunks, e.g.
+#' \code{rmarkdown::metadata$title} (the title of the document),
+#' \code{rmarkdown::metadata$author}, and \code{rmarkdown::metadata$foo} (if you
+#' have a YAML field named \code{foo}), etc.
+#' @usage NULL
+#' @examples rmarkdown::metadata
+#' @export
+metadata <- list()
+
+#' @export
+render <- function(input,
+                   output_format = NULL,
+                   output_file = NULL,
+                   output_dir = NULL,
+                   output_options = NULL,
+                   intermediates_dir = NULL,
+                   knit_root_dir = NULL,
+                   runtime =  c("auto", "static", "shiny", "shiny_prerendered"),
+                   clean = TRUE,
+                   params = NULL,
+                   knit_meta = NULL,
+                   envir = parent.frame(),
+                   run_pandoc = TRUE,
+                   quiet = FALSE,
+                   encoding = getOption("encoding")) {
+
+  perf_timer_start("render")
+
+  init_render_context()
+  on.exit(clear_render_context(), add = TRUE)
+
+  on.exit(clean_tmpfiles(), add = TRUE)
+
+  # check for "all" output formats
+  if (identical(output_format, "all")) {
+    output_format <- enumerate_output_formats(input, envir, encoding)
+    if (is.null(output_format))
+      output_format <- "html_document"
+  }
+
+  # check for a list of output formats -- if there is more than one
+  # then recursively call this function with each format by name
+  if (is.character(output_format) && length(output_format) > 1) {
+    outputs <- character()
+    for (format in output_format) {
+      # the output_file argument is intentionally ignored (we can't give
+      # the same name to each rendered output); copy the rest by name
+      output <- render(input = input,
+                       output_format = format,
+                       output_file = NULL,
+                       output_dir = output_dir,
+                       output_options = output_options,
+                       intermediates_dir = intermediates_dir,
+                       knit_root_dir = knit_root_dir,
+                       runtime = runtime,
+                       clean = clean,
+                       params = params,
+                       knit_meta = knit_meta,
+                       envir = envir,
+                       run_pandoc = run_pandoc,
+                       quiet = quiet,
+                       encoding = encoding)
+      outputs <- c(outputs, output)
+    }
+    if (length(output_file) > 1) {
+      file.rename(outputs, output_file)
+      outputs <- output_file
+    }
+    return(invisible(outputs))
+  }
+
+  # check for required version of pandoc if we are running pandoc
+  if (run_pandoc) {
+    required_pandoc <- "1.12.3"
+    pandoc_available(required_pandoc, error = TRUE)
+  }
+
+  # setup a cleanup function for intermediate files
+  intermediates <- c()
+  on.exit(if (clean) unlink(intermediates, recursive = TRUE), add = TRUE)
+
+  # ensure we have a directory to store intermediates
+  if (!is.null(intermediates_dir)) {
+    if (!dir_exists(intermediates_dir))
+      dir.create(intermediates_dir, recursive = TRUE)
+    intermediates_dir <- normalize_path(intermediates_dir)
+  }
+  intermediates_loc <- function(file) {
+    if (is.null(intermediates_dir))
+      file
+    else
+      file.path(intermediates_dir, file)
+  }
+
+  # resolve output directory before we change the working directory in
+  # preparation for rendering the document
+  if (!is.null(output_dir)) {
+    if (!dir_exists(output_dir))
+      dir.create(output_dir, recursive = TRUE)
+    output_dir <- normalize_path(output_dir)
+  }
+
+  # check whether this document requires a knit
+  requires_knit <- tolower(tools::file_ext(input)) %in% c("r", "rmd", "rmarkdown")
+
+  # remember the name of the original input document (we overwrite 'input' once
+  # we've knitted)
+  original_input <- normalize_path(input)
+
+  # if the input file has shell characters in its name then make a copy that
+  # doesn't have shell characters
+  if (grepl(.shell_chars_regex, basename(input))) {
+    # form the name of the file w/o shell characters
+    input_no_shell_chars <- intermediates_loc(
+        file_name_without_shell_chars(basename(input)))
+
+    if (file.exists(input_no_shell_chars)) {
+      stop("The name of the input file cannot contain the special shell ",
+           "characters: ", .shell_chars_regex, " (attempted to copy to a ",
+           "version without those characters '", input_no_shell_chars, "' ",
+           "however that file already exists)", call. = FALSE)
+    }
+    file.copy(input, input_no_shell_chars, overwrite = TRUE)
+    intermediates <- c(intermediates, input_no_shell_chars)
+    input <- input_no_shell_chars
+
+    # if an intermediates directory wasn't explicit before, make it explicit now
+    if (is.null(intermediates_dir)) {
+      intermediates_dir <-
+        dirname(normalize_path(input_no_shell_chars))
+      # never use the original input directory as the intermediate directory,
+      # otherwise external resources discovered will be deleted as intermediate
+      # files later (because they are copied to the "intermediate" dir)
+      if (same_path(intermediates_dir, dirname(original_input)))
+        intermediates_dir <- NULL
+    }
+  }
+
+  # force evaluation of knitr root dir before we change directory context
+  force(knit_root_dir)
+
+  # execute within the input file's directory
+  oldwd <- setwd(dirname(tools::file_path_as_absolute(input)))
+  on.exit(setwd(oldwd), add = TRUE)
+
+  # reset the name of the input file to be relative and calculate variations
+  # on the filename for our various intermediate targets
+  input <- basename(input)
+  knit_input <- input
+  knit_output <- intermediates_loc(file_with_meta_ext(input, "knit", "md"))
+
+  intermediates <- c(intermediates, knit_output)
+  utf8_input <- intermediates_loc(file_with_meta_ext(input, "utf8", "md"))
+  intermediates <- c(intermediates, utf8_input)
+
+  # track whether this was straight markdown input (to prevent keep_md later)
+  md_input <- identical(tolower(tools::file_ext(input)), "md")
+
+  # if this is an R script then spin it first
+  if (identical(tolower(tools::file_ext(input)), "r")) {
+    # make a copy of the file to spin
+    spin_input <- intermediates_loc(file_with_meta_ext(input, "spin", "R"))
+    file.copy(input, spin_input, overwrite = TRUE)
+    intermediates <- c(intermediates, spin_input)
+    # spin it
+    spin_rmd <- knitr::spin(spin_input,
+                            knit = FALSE,
+                            envir = envir,
+                            format = "Rmd")
+    intermediates <- c(intermediates, spin_rmd)
+    knit_input <- spin_rmd
+    # append default metadata (this will be ignored if there is user
+    # metadata elsewhere in the file)
+    metadata <- paste('\n',
+      '---\n',
+      'title: "', input, '"\n',
+      'author: "', Sys.info()[["user"]], '"\n',
+      'date: "', date(), '"\n',
+      '---\n'
+    , sep = "")
+    if (!identical(encoding, "native.enc"))
+      metadata <- iconv(metadata, to = encoding)
+    cat(metadata, file = knit_input, append = TRUE)
+  }
+
+  # read the input file
+  input_lines <- read_lines_utf8(knit_input, encoding)
+
+  # read the yaml front matter
+  yaml_front_matter <- parse_yaml_front_matter(input_lines)
+
+  # if this is shiny_prerendered then modify the output format to
+  # be single-page and to output dependencies to the shiny.dep file
+  shiny_prerendered_dependencies <- list()
+  if (requires_knit && is_shiny_prerendered(yaml_front_matter$runtime)) {
+
+    # first validate that the user hasn't passed an already created output_format
+    if (is_output_format(output_format)) {
+      stop("You cannot pass a fully constructed output_format to render when ",
+           "using runtime: shiny_prerendered")
+    }
+
+    # require shiny for the knit
+    if (requireNamespace("shiny")) {
+      if (!"package:shiny" %in% search())
+        attachNamespace("shiny")
+    }
+    else
+      stop("The shiny package is required for 'shiny_prerendered' documents")
+
+    # force various output options
+    output_options$self_contained <- FALSE
+    output_options$dependency_resolver <- function(deps) {
+      shiny_prerendered_dependencies <<- deps
+      list()
+    }
+  }
+
+  # if we haven't been passed a fully formed output format then
+  # resolve it by looking at the yaml
+  if (!is_output_format(output_format)) {
+    output_format <- output_format_from_yaml_front_matter(input_lines,
+                                                          output_options,
+                                                          output_format,
+                                                          encoding = encoding)
+    output_format <- create_output_format(output_format$name,
+                                          output_format$options)
+  }
+  pandoc_to <- output_format$pandoc$to
+
+  # generate outpout file based on input filename
+  if (is.null(output_file))
+    output_file <- pandoc_output_file(input, output_format$pandoc)
+
+  # if an output_dir was specified then concatenate it with the output file
+  if (!is.null(output_dir)) {
+    output_file <- file.path(output_dir, basename(output_file))
+  }
+  output_dir <- dirname(output_file)
+
+  # use output filename based files dir
+  files_dir <- file.path(output_dir, knitr_files_dir(basename(output_file)))
+  files_dir <- pandoc_path_arg(files_dir)
+
+  # default to no cache_dir (may be generated by the knit)
+  cache_dir <- NULL
+
+  # call any intermediate files generator, if we have an intermediates directory
+  # (do this before knitting in case the knit requires intermediates)
+  if (!is.null(intermediates_dir) &&
+      !is.null(output_format$intermediates_generator)) {
+    intermediates <- c(intermediates,
+                       output_format$intermediates_generator(original_input,
+                                                             encoding,
+                                                             intermediates_dir))
+  }
+
+  # reset knit_meta (and ensure it's always reset before exiting render)
+  old_knit_meta <- knit_meta_reset()
+  on.exit({
+    knit_meta_reset()
+    if (length(old_knit_meta)) {
+      knitr::knit_meta_add(old_knit_meta, attr(old_knit_meta, 'knit_meta_id'))
+    }
+  }, add = TRUE)
+
+  # presume that we're rendering as a static document unless specified
+  # otherwise in the parameters
+  runtime <- match.arg(runtime)
+  if (identical(runtime, "auto")) {
+    if (!is.null(yaml_front_matter$runtime))
+      runtime <- yaml_front_matter$runtime
+    else
+      runtime <- "static"
+  }
+
+  # set df_print
+  context <- render_context()
+  context$df_print <- resolve_df_print(output_format$df_print)
+
+  # call any pre_knit handler
+  if (!is.null(output_format$pre_knit)) {
+    output_format$pre_knit(input = original_input)
+  }
+
+  # function used to call post_knit handler
+  call_post_knit_handler <- function() {
+    if (!is.null(output_format$post_knit)) {
+      post_knit_extra_args <- output_format$post_knit(yaml_front_matter,
+                                                      knit_input,
+                                                      runtime,
+                                                      encoding = encoding)
+    } else {
+      post_knit_extra_args <- NULL
+    }
+    c(output_format$pandoc$args, post_knit_extra_args)
+  }
+
+  # determine our id-prefix (add one if necessary for runtime: shiny)
+  id_prefix <- id_prefix_from_args(output_format$pandoc$args)
+  if (!nzchar(id_prefix) && is_shiny(runtime)) {
+    id_prefix <- "section-"
+    output_format$pandoc$args <- c(output_format$pandoc$args, rbind("--id-prefix", id_prefix))
+  }
+
+  # knit if necessary
+  if (requires_knit) {
+
+    # restore options and hooks after knit
+    optk <- knitr::opts_knit$get()
+    on.exit(knitr::opts_knit$restore(optk), add = TRUE)
+    optc <- knitr::opts_chunk$get()
+    on.exit(knitr::opts_chunk$restore(optc), add = TRUE)
+    hooks <- knitr::knit_hooks$get()
+    on.exit(knitr::knit_hooks$restore(hooks), add = TRUE)
+    ohooks <- knitr::opts_hooks$get()
+    on.exit(knitr::opts_hooks$restore(ohooks), add = TRUE)
+    templates <- knitr::opts_template$get()
+    on.exit(knitr::opts_template$restore(templates), add = TRUE)
+
+    # run render on_exit (run after the knit hooks are saved so that
+    # any hook restoration can take precedence)
+    if (is.function(output_format$on_exit))
+      on.exit(output_format$on_exit(), add = TRUE)
+
+    # default rendering and chunk options
+    knitr::render_markdown()
+    knitr::opts_chunk$set(tidy = FALSE, error = FALSE)
+
+    # store info about the final output format in opts_knit
+    knitr::opts_knit$set(
+      rmarkdown.pandoc.from = output_format$pandoc$from,
+      rmarkdown.pandoc.to = pandoc_to,
+      rmarkdown.pandoc.id_prefix = id_prefix,
+      rmarkdown.keep_md = output_format$keep_md,
+      rmarkdown.df_print = output_format$df_print,
+      rmarkdown.version = 2,
+      rmarkdown.runtime = runtime
+    )
+
+    # read root directory from argument (has precedence) or front matter
+    root_dir <- knit_root_dir
+    if (is.null(root_dir))
+      root_dir <- yaml_front_matter$knit_root_dir
+    if (!is.null(root_dir))
+      knitr::opts_knit$set(root.dir = root_dir)
+
+    # use filename based figure and cache directories
+    base_pandoc_to <- gsub('[-+].*', '', pandoc_to)
+    figures_dir <- paste(files_dir, "/figure-", base_pandoc_to, "/", sep = "")
+    knitr::opts_chunk$set(fig.path = figures_dir)
+    cache_dir <- knitr_cache_dir(input, base_pandoc_to)
+    knitr::opts_chunk$set(cache.path = cache_dir)
+
+    # strip the trailing slash from cache_dir so that file.exists() and unlink()
+    # check on it later works on windows
+    cache_dir <- gsub("/$", "", cache_dir)
+
+    # merge user options and hooks
+    if (!is.null(output_format$knitr)) {
+      knitr::opts_knit$set(as.list(output_format$knitr$opts_knit))
+      knitr::opts_chunk$set(adjust_dev(as.list(output_format$knitr$opts_chunk)))
+      knitr::opts_template$set(as.list(output_format$knitr$opts_template))
+      knitr::knit_hooks$set(as.list(output_format$knitr$knit_hooks))
+      knitr::opts_hooks$set(as.list(output_format$knitr$opts_hooks))
+    }
+
+    # setting the runtime (static/shiny) type
+    knitr::opts_knit$set(rmarkdown.runtime = runtime)
+
+    # install evaluate hook for shiny_prerendred
+    if (is_shiny_prerendered(runtime)) {
+
+      # remove uncached .RData (will be recreated from context="data" chunks)
+      shiny_prerendered_remove_uncached_data(original_input)
+
+      # set the cache option hook and evaluate hook
+      knitr::opts_hooks$set(label = shiny_prerendered_option_hook(original_input,encoding))
+      knitr::knit_hooks$set(evaluate = shiny_prerendered_evaluate_hook(original_input))
+    }
+
+    # install global chunk handling for runtime: shiny (evaluate the 'global'
+    # chunk only once, and in the global environment)
+    if (is_shiny_classic(runtime) && !is.null(shiny::getDefaultReactiveDomain())) {
+
+      # install evaluate hook to ensure that the 'global' chunk for this source
+      # file is evaluated only once and is run outside of a user reactive domain
+      knitr::knit_hooks$set(evaluate = function(code, envir, ...) {
+
+        # check for 'global' chunk label
+        if (identical(knitr::opts_current$get("label"), "global")) {
+
+          # check list of previously evaludated global chunks
+          code_string <- paste(code, collapse = '\n')
+          if (!code_string %in% .globals$evaluated_global_chunks) {
+
+            # save it in our list of evaluated global chunks
+            .globals$evaluated_global_chunks <-
+              c(.globals$evaluated_global_chunks, code_string)
+
+            # evaluate with no reactive domain to prevent any shiny code (e.g.
+            # a reactive timer) from attaching to the current user session
+            # (resulting in it's destruction when that session ends)
+            shiny::withReactiveDomain(NULL, {
+              evaluate::evaluate(code, envir = globalenv(), ...)
+            })
+
+          } else {
+            list()
+          }
+        # delegate to standard evaluate for everything else
+        } else {
+          evaluate::evaluate(code, envir, ...)
+        }
+      })
+    }
+
+    # make the params available within the knit environment
+    # (only do this if there are parameters in the front matter
+    # so we don't require recent knitr for all users)
+    if (!is.null(yaml_front_matter$params)) {
+
+      params <- knit_params_get(input_lines, params)
+
+      # bail if an object called 'params' exists in this environment,
+      # and it seems to be an unrelated user-created object. store
+      # references so we can restore them post-render
+      hasParams <- exists("params", envir = envir, inherits = FALSE)
+      envirParams <- NULL
+
+      if (hasParams) {
+        envirParams <- get("params", envir = envir, inherits = FALSE)
+        isKnownParamsObject <-
+          inherits(envirParams, "knit_param_list") ||
+          inherits(envirParams, "knit_param")
+
+        if (!isKnownParamsObject) {
+          stop("params object already exists in knit environment ",
+               "so can't be overwritten by render params", call. = FALSE)
+        }
+      }
+
+      # make the params available in the knit environment
+      assign("params", params, envir = envir)
+      lockBinding("params", envir)
+      on.exit({
+        do.call("unlockBinding", list("params", envir))
+        if (hasParams)
+          assign("params", envirParams, envir = envir)
+        else
+          remove("params", envir = envir)
+      }, add = TRUE)
+    }
+
+    # make the yaml_front_matter available as 'metadata' within the
+    # knit environment (unless it is already defined there in which case
+    # we emit a warning)
+    env <- environment(render)
+    metadata_this <- env$metadata
+    do.call("unlockBinding", list("metadata", env))
+    on.exit({
+      if (bindingIsLocked("metadata", env)) {
+        do.call("unlockBinding", list("metadata", env))
+      }
+      env$metadata <- metadata_this
+      lockBinding("metadata", env)
+    }, add = TRUE)
+    env$metadata <- yaml_front_matter
+
+    # call onKnit hooks (normalize to list)
+    sapply(as.list(getHook("rmarkdown.onKnit")), function(hook) {
+      tryCatch(hook(input = original_input), error = function(e) NULL)
+    })
+    on.exit({
+      sapply(as.list(getHook("rmarkdown.onKnitCompleted")), function(hook) {
+        tryCatch(hook(input = original_input), error = function(e) NULL)
+      })
+    }, add = TRUE)
+
+    perf_timer_start("knitr")
+
+    # perform the knit
+    input <- knitr::knit(knit_input,
+                         knit_output,
+                         envir = envir,
+                         quiet = quiet,
+                         encoding = encoding)
+
+    perf_timer_stop("knitr")
+
+    # call post_knit handler
+    output_format$pandoc$args <- call_post_knit_handler()
+
+    # pull any R Markdown warnings from knit_meta and emit
+    rmd_warnings <- knit_meta_reset(class = "rmd_warning")
+    for (rmd_warning in rmd_warnings) {
+      message("Warning: ", rmd_warning)
+    }
+
+    # pull out shiny_prerendered_contexts and append them as script tags
+    shiny_prerendered_append_contexts(runtime, input, encoding)
+
+    # collect remaining knit_meta
+    knit_meta <- knit_meta_reset()
+
+  } else {
+    output_format$pandoc$args <- call_post_knit_handler()
+  }
+
+  # if this isn't html and there are html dependencies then flag an error
+  if (!(is_pandoc_to_html(output_format$pandoc) ||
+        identical(tolower(tools::file_ext(output_file)), "html")))  {
+    if (has_html_dependencies(knit_meta)) {
+      if (!isTRUE(yaml_front_matter$always_allow_html)) {
+        stop("Functions that produce HTML output found in document targeting ",
+             pandoc_to, " output.\nPlease change the output type ",
+             "of this document to HTML. Alternatively, you can allow\n",
+             "HTML output in non-HTML formats by adding this option to the YAML front",
+             "-matter of\nyour rmarkdown file:\n\n",
+             "  always_allow_html: yes\n\n",
+             "Note however that the HTML output will not be visible in non-HTML formats.\n\n",
+             call. = FALSE)
+      }
+    }
+    if (!identical(runtime, "static")) {
+      stop("Runtime '", runtime, "' is not supported for ",
+           pandoc_to, " output.\nPlease change the output type ",
+           "of this document to HTML.", call. = FALSE)
+    }
+  }
+
+  # clean the files_dir if we've either been asking to clean supporting files or
+  # the knitr cache is active
+  if (output_format$clean_supporting && (is.null(cache_dir) || !dir_exists(cache_dir)))
+      intermediates <- c(intermediates, files_dir)
+
+  # read the input text as UTF-8 then write it back out
+  input_text <- read_lines_utf8(input, encoding)
+  writeLines(input_text, utf8_input, useBytes = TRUE)
+
+  if (run_pandoc) {
+
+    perf_timer_start("pre-processor")
+
+    # call any pre_processor
+    if (!is.null(output_format$pre_processor)) {
+      extra_args <- output_format$pre_processor(yaml_front_matter,
+                                                utf8_input,
+                                                runtime,
+                                                knit_meta,
+                                                files_dir,
+                                                output_dir)
+      output_format$pandoc$args <- c(output_format$pandoc$args, extra_args)
+    }
+
+    # write shiny_prerendered_dependencies if we have them
+    if (is_shiny_prerendered(runtime)) {
+      shiny_prerendered_append_dependencies(utf8_input,
+                                            shiny_prerendered_dependencies,
+                                            files_dir,
+                                            output_dir)
+    }
+
+    perf_timer_stop("pre-processor")
+
+    need_bibtex <- grepl('[.](pdf|tex)$', output_file) &&
+      any(c('--natbib', '--biblatex') %in% output_format$pandoc$args)
+
+    perf_timer_start("pandoc")
+
+    convert <- function(output, citeproc = FALSE) {
+
+      # temporarily move figures to the intermediate dir if specified:
+      # https://github.com/rstudio/rmarkdown/issues/500
+      figures_dir <- gsub('/$', '', knitr::opts_chunk$get("fig.path"))
+      if (!is.null(intermediates_dir) && dir_exists(figures_dir)) {
+        figures_dir_tmp <- intermediates_loc(figures_dir)
+        move_dir(figures_dir, figures_dir_tmp)
+        on.exit(move_dir(figures_dir_tmp, figures_dir), add = TRUE)
+      }
+
+      # ensure we expand paths (for Windows where leading `~/` does
+      # not get expanded by pandoc)
+      utf8_input <- path.expand(utf8_input)
+      output     <- path.expand(output)
+
+      # if we don't detect any invalid shell characters in the
+      # target path, then just call pandoc directly
+      if (!grepl(.shell_chars_regex, output) && !grepl(.shell_chars_regex, utf8_input)) {
+        return(pandoc_convert(
+          utf8_input, pandoc_to, output_format$pandoc$from, output,
+          citeproc, output_format$pandoc$args, !quiet
+        ))
+      }
+
+      # render to temporary file (preserve extension)
+      # this also ensures we don't pass a file path with invalid
+      # characters to our pandoc invocation
+      file_ext <- tools::file_ext(output)
+      ext <- if (nzchar(file_ext))
+        paste(".", file_ext, sep = "")
+      else
+        ""
+
+      # render to a path in the current working directory
+      # (avoid passing invalid characters to shell)
+      pandoc_output_tmp <- basename(tempfile("pandoc", tmpdir = getwd(), fileext = ext))
+
+      # clean up temporary file on exit
+      on.exit(unlink(pandoc_output_tmp), add = TRUE)
+
+      # call pandoc to render file
+      status <- pandoc_convert(
+        utf8_input, pandoc_to, output_format$pandoc$from, pandoc_output_tmp,
+        citeproc, output_format$pandoc$args, !quiet
+      )
+
+      # construct output path (when passed only a file name to '--output',
+      # pandoc seems to render in the same directory as the input file)
+      pandoc_output_tmp_path <- file.path(dirname(utf8_input), pandoc_output_tmp)
+
+      # rename output file to desired location
+      renamed <- suppressWarnings(file.rename(pandoc_output_tmp_path, output))
+
+      # rename can fail if the temporary directory and output path
+      # lie on different volumes; in such a case attempt a file copy
+      # see: https://github.com/rstudio/rmarkdown/issues/705
+      if (!renamed) {
+        copied <- file.copy(pandoc_output_tmp_path, output, overwrite = TRUE)
+        if (!copied) {
+          stop("failed to copy rendered pandoc artefact to '", output, "'")
+        }
+      }
+
+      # return status
+      status
+    }
+    texfile <- file_with_ext(output_file, "tex")
+    # compile Rmd to tex when we need to generate bibliography with natbib/biblatex
+    if (need_bibtex) {
+      convert(texfile)
+      # manually compile tex if PDF output is expected
+      if (grepl('[.]pdf$', output_file)) {
+        latexmk(texfile, output_format$pandoc$latex_engine, '--biblatex' %in% output_format$pandoc$args)
+        file.rename(file_with_ext(texfile, "pdf"), output_file)
+      }
+      # clean up the tex file if necessary
+      if ((texfile != output_file) && !output_format$pandoc$keep_tex)
+        on.exit(unlink(texfile), add = TRUE)
+    } else {
+      # determine whether we need to run citeproc (based on whether we
+      # have references in the input)
+      run_citeproc <- citeproc_required(yaml_front_matter, input_lines)
+      # generate .tex if we want to keep the tex source
+      if (texfile != output_file && output_format$pandoc$keep_tex)
+        convert(texfile, run_citeproc)
+      # run the main conversion if the output file is not .tex
+      convert(output_file, run_citeproc)
+    }
+
+    # pandoc writes the output alongside the input, so if we rendered from an
+    # intermediate directory, move the output file
+    if (!is.null(intermediates_dir)) {
+      intermediate_output <- file.path(intermediates_dir, basename(output_file))
+      if (file.exists(intermediate_output)) {
+        file.rename(intermediate_output, output_file)
+      }
+    }
+
+    perf_timer_stop("pandoc")
+
+    perf_timer_start("post-processor")
+
+    # if there is a post-processor then call it
+    if (!is.null(output_format$post_processor))
+      output_file <- output_format$post_processor(yaml_front_matter,
+                                                  utf8_input,
+                                                  output_file,
+                                                  clean,
+                                                  !quiet)
+
+    if (!quiet) {
+      message("\nOutput created: ", relative_to(oldwd, output_file))
+    }
+
+    perf_timer_stop("post-processor")
+
+  }
+
+  perf_timer_stop("render")
+
+  # write markdown output if requested
+  if (output_format$keep_md && !md_input) {
+    file.copy(input, file_with_ext(output_file, "md"), overwrite = TRUE)
+  }
+
+  if (run_pandoc) {
+    # return the full path to the output file
+    invisible(tools::file_path_as_absolute(output_file))
+  } else {
+    # did not run pandoc; returns the markdown output with attributes of the
+    # knitr meta data and intermediate files
+    structure(input, knit_meta = knit_meta, intermediates = intermediates)
+  }
+}
+
+
+#' Render supporting files for an input document
+#'
+#' Render (copy) required supporting files for an input document to the _files
+#' directory associated with the document.
+#'
+#' @param from Directory to copy from
+#' @param files_dir Directory to copy files into
+#' @param rename_to Optional rename of source directory after it is copied
+#'
+#' @return The relative path to the supporting files. This path is suitable
+#' for inclusion in HTML\code{href} and \code{src} attributes.
+#'
+#' @export
+render_supporting_files <- function(from, files_dir, rename_to = NULL) {
+
+  # auto-create directory for supporting files
+  if (!dir_exists(files_dir))
+    dir.create(files_dir)
+
+  # target directory is based on the dirname of the path or the rename_to
+  # value if it was provided
+  target_stage_dir <- file.path(files_dir, basename(from))
+  target_dir <- file.path(files_dir, ifelse(is.null(rename_to),
+                                     basename(from),
+                                     rename_to))
+
+  # copy the directory if it hasn't already been copied
+  if (!dir_exists(target_dir) && !dir_exists(target_stage_dir)) {
+    file.copy(from = from,
+              to = files_dir,
+              recursive = TRUE,
+              copy.mode = FALSE)
+    if (!is.null(rename_to)) {
+      file.rename(from = target_stage_dir,
+                  to = target_dir)
+    }
+  }
+
+  # return the target dir (used to form links in the HTML)
+  target_dir
+}
+
+# reset knitr meta output (returns any meta output generated since the last
+# call to knit_meta_reset), optionally scoped to a specific output class
+knit_meta_reset <- function(class = NULL) {
+  knitr::knit_meta(class, clean = TRUE)
+}
+
+# render context (render-related state can be stuffed here)
+.render_context <- NULL # initialized in .onLoad
+render_context <- function() {
+  .render_context$peek()
+}
+
+init_render_context <- function() {
+  .render_context$push(new_render_context())
+}
+
+clear_render_context <- function() {
+  .render_context$pop()
+}
+
+new_render_context <- function() {
+  env <- new.env(parent = emptyenv())
+  env$chunk.index <- 1
+  env
+}
+
+merge_render_context <- function(context) {
+  elements <- ls(envir = render_context(), all.names = TRUE)
+  for (el in elements)
+    context[[el]] <- get(el, envir = render_context())
+  context
+}
+
+
+id_prefix_from_args <- function(args) {
+
+  # scan for id-prefix argument
+  for (i in 1:length(args)) {
+    arg <- args[[i]]
+    if (identical(arg, "--id-prefix") && (i < length(args)))
+      return(args[[i + 1]])
+  }
+
+  # default to empty string
+  ""
+}
+
+
+resolve_df_print <- function(df_print) {
+
+  # available methods
+  valid_methods <- c("default", "kable", "tibble", "paged")
+
+  # if we are passed NULL then select the first method
+  if (is.null(df_print))
+    df_print <- valid_methods[[1]]
+
+  # if we are passed all of valid_methods then select the first one
+  if (identical(valid_methods, df_print))
+    df_print <- valid_methods[[1]]
+
+  if (!is.function(df_print)) {
+    if (df_print == "kable")
+      df_print <- knitr::kable
+    else if (df_print == "tibble") {
+      if (!requireNamespace("tibble", quietly = TRUE))
+        stop("Printing 'tibble' without 'tibble' package available")
+
+      df_print <- function(x) print(tibble::as_tibble(x))
+    }
+    else if (df_print == "paged")
+      df_print <- function(x) {
+        if (!identical(knitr::opts_current$get("paged.print"), FALSE)) {
+          knitr::asis_output(paged_table_html(x))
+        }
+        else {
+          print(x)
+        }
+      }
+    else if (df_print == "default")
+      df_print <- print
+    else
+      stop('Invalid value for df_print (valid values are ',
+           paste(valid_methods, collapse = ", "), call. = FALSE)
+  }
+
+  df_print
+}
+
+
+# package level globals
+.globals <- new.env(parent = emptyenv())
+.globals$evaluated_global_chunks <- character()
+
+
diff --git a/R/render_html.R b/R/render_html.R
new file mode 100644
index 0000000..a32d2a6
--- /dev/null
+++ b/R/render_html.R
@@ -0,0 +1,20 @@
+notebook_render_html_widget <- function(output) {
+
+  # TODO: add htmlUnpreserve function to htmlwidgets?
+  unpreserved <- substring(
+    output,
+    n_bytes("<!--html_preserve-->") + 1,
+    n_bytes(output) - n_bytes("<!--/html_preserve-->")
+  )
+
+  meta <- base64_encode_object(attr(output, "knit_meta"))
+
+  before <- sprintf("\n<!-- rnb-htmlwidget-begin %s-->", meta)
+  after  <- "<!-- rnb-htmlwidget-end -->\n"
+  pasted <- paste(before, unpreserved, after, sep = "\n")
+
+  annotated <- htmltools::htmlPreserve(pasted)
+  attributes(annotated) <- attributes(output)
+
+  return(annotated)
+}
diff --git a/R/render_site.R b/R/render_site.R
new file mode 100644
index 0000000..f866f8c
--- /dev/null
+++ b/R/render_site.R
@@ -0,0 +1,442 @@
+
+#' @noRd
+#' @export
+render_site <- function(input = ".",
+                        output_format = "all",
+                        envir = parent.frame(),
+                        quiet = FALSE,
+                        encoding = getOption("encoding")) {
+
+  # capture original input
+  original_input <- input
+
+  # normalize to a directory
+  input <- input_as_dir(input)
+
+  # if it's a file then capture that and force output_format to be NULL
+  # (to only render a single format for incremental/previewing)
+  input_file <- NULL
+  if (!dir_exists(original_input)) {
+    input_file <- original_input
+    if (output_format == "all")
+      output_format <- NULL
+  }
+
+  # find the site generator
+  generator <- site_generator(input, output_format, encoding)
+  if (is.null(generator))
+    stop("No site generator found.")
+
+  # execute it
+  generator$render(input_file = input_file,
+                   output_format = output_format,
+                   envir = envir,
+                   quiet = quiet,
+                   encoding = encoding)
+
+  # compute the name of the output file. if the input was a filename
+  # use that as a base (otherwise use index.html)
+  if (!dir_exists(original_input))
+    output <- file_with_ext(basename(original_input), "html")
+  else
+    output <- "index.html"
+  output <- file.path(input, generator$output_dir, output)
+  output <- normalized_relative_to(input, output)
+
+  # return it invisibly
+  invisible(output)
+}
+
+#' @noRd
+#' @export
+clean_site <- function(input = ".", preview = FALSE, quiet = FALSE,
+                       encoding = getOption("encoding")) {
+
+  # normalize to a directory
+  input <- input_as_dir(input)
+
+  # find the site generator
+  generator <- site_generator(input = input,
+                              output_format = NULL,
+                              encoding = encoding)
+  if (is.null(generator))
+    stop("No site generator found.")
+
+  # get the files to be cleaned
+  files <- generator$clean()
+
+  # if it's just a preview then return the files, otherwise
+  # actually remove the files
+  if (preview)
+    files
+  else {
+    if (!quiet) {
+      cat("Removing files: \n")
+      cat(paste(paste0(" ", files), collapse = "\n"))
+    }
+    unlink(file.path(input, files), recursive = TRUE)
+  }
+}
+
+#' @noRd
+#' @export
+site_generator <- function(input = ".",
+                           output_format = NULL,
+                           encoding = getOption("encoding")) {
+
+  # normalize input
+  input <- input_as_dir(input)
+
+  # if we have an index.Rmd (or .md) then check it's yaml for "site:"
+  index <- file.path(input, "index.Rmd")
+  if (!file.exists(index))
+    index <- file.path(input, "index.md")
+  if (file.exists(index)) {
+
+    # read index.Rmd and extract the front matter
+    index_lines <- read_lines_utf8(index, encoding)
+    front_matter <- parse_yaml_front_matter(index_lines)
+
+    # is there a custom site generator function?
+    if (!is.null(front_matter$site)) {
+
+      create_site_generator <- eval(parse(text = front_matter$site))
+      create_site_generator(input, encoding)
+
+    # is there a "_site.yml"?
+    } else if (file.exists(site_config_file(input))) {
+
+      default_site(input, encoding)
+
+    # no custom site generator or "_site.yml"
+    } else {
+      NULL
+    }
+
+  # no index.Rmd or index.md
+  } else {
+    NULL
+  }
+}
+
+# helper function to get the site configuration as an R list
+site_config <- function(input, encoding = getOption("encoding")) {
+
+  # normalize input
+  input <- input_as_dir(input)
+
+  # check for config file
+  config_file <- site_config_file(input)
+  if (file.exists(config_file)) {
+
+    # parse the yaml
+    config_lines <- read_lines_utf8(config_file, encoding)
+    config <- yaml_load_utf8(config_lines)
+    if (!is.list(config))
+      config <- list()
+
+    # provide defaults if necessary
+    if (is.null(config$name))
+      config$name <- basename(normalize_path(input))
+    if (is.null(config$output_dir))
+      config$output_dir <- "_site"
+
+    # return config
+    config
+
+  # no _site.yml
+  } else {
+    NULL
+  }
+}
+
+# default site implementation (can be overridden by custom site generators)
+default_site <- function(input, encoding = getOption("encoding"), ...) {
+
+  # get the site config
+  config <- site_config(input, encoding)
+  if (is.null(config))
+    stop("No site configuration (_site.yml) file found.")
+
+  # helper function to get all input files. includes all .Rmd and
+  # .md files that don't start with "_" (note that we don't do this
+  # recursively because rmarkdown in general handles applying common
+  # options/elements across subdirectories poorly)
+  input_files <- function() {
+    list.files(input, pattern = "^[^_].*\\.[Rr]?md$")
+  }
+
+  # define render function (use ... to gracefully handle future args)
+  render <- function(input_file,
+                     output_format,
+                     envir,
+                     quiet,
+                     encoding, ...) {
+
+    site_yml  <- file.path(input, '_site.yml')
+    site_yml2 <- patch_html_document_options(config, encoding, site_yml)
+    on.exit(file.copy(site_yml2, site_yml, overwrite = TRUE), add = TRUE)
+
+    # track outputs
+    outputs <- c()
+
+    # see if this is an incremental render
+    incremental <- !is.null(input_file)
+
+    # files list is either a single file (for incremental) or all
+    # file within the input directory
+    if (incremental)
+      files <- input_file
+    else {
+      files <- file.path(input, input_files())
+    }
+    sapply(files, function(x) {
+      # we suppress messages so that "Output created" isn't emitted
+      # (which could result in RStudio previewing the wrong file)
+      output <- suppressMessages(
+        rmarkdown::render(x,
+                          output_format = output_format,
+                          envir = envir,
+                          quiet = quiet,
+                          encoding = encoding)
+      )
+
+      # add to global list of outputs
+      outputs <<- c(outputs, output)
+
+      # check for files dir and add that as well
+      sidecar_files_dir <- knitr_files_dir(output)
+      files_dir_info <- file.info(sidecar_files_dir)
+      if (isTRUE(files_dir_info$isdir))
+        outputs <<- c(outputs, sidecar_files_dir)
+    })
+
+    # do we have a relative output directory? if so then remove,
+    # recreate, and copy outputs to it (we don't however remove
+    # it for incremental builds)
+    if (config$output_dir != '.') {
+
+      # remove and recreate output dir if necessary
+      output_dir <- file.path(input, config$output_dir)
+      if (file.exists(output_dir)) {
+        if (!incremental) {
+          unlink(output_dir, recursive = TRUE)
+          dir.create(output_dir)
+        }
+      } else {
+        dir.create(output_dir)
+      }
+
+      # move outputs
+      for (output in outputs) {
+
+        # don't move it if it's a _files dir that has a _cache dir
+        if (grepl("^.*_files$", output)) {
+          cache_dir <- gsub("_files$", "_cache", output)
+          if (dir_exists(cache_dir))
+            next;
+        }
+
+        output_dest <- file.path(output_dir, basename(output))
+        if (dir_exists(output_dest))
+          unlink(output_dest, recursive = TRUE)
+        file.rename(output, output_dest)
+      }
+
+      # copy lib dir a directory at a time (allows it to work with incremental)
+      lib_dir <- file.path(input, "site_libs")
+      output_lib_dir <- file.path(output_dir, "site_libs")
+      if (!file.exists(output_lib_dir))
+        dir.create(output_lib_dir)
+      libs <- list.files(lib_dir)
+      for (lib in libs)
+        file.copy(file.path(lib_dir, lib), output_lib_dir, recursive = TRUE)
+      unlink(lib_dir, recursive = TRUE)
+
+      # copy other files
+      copy_site_resources(input, encoding)
+    }
+
+    # Print output created for rstudio preview
+    if (!quiet) {
+      # determine output file
+      output_file <- ifelse(is.null(input_file),
+                            "index.html",
+                            file_with_ext(basename(input_file), "html"))
+      if (config$output_dir != ".")
+        output_file <- file.path(config$output_dir, output_file)
+      message("\nOutput created: ", output_file)
+    }
+  }
+
+  # define clean function
+  clean <- function() {
+
+    # build list of generated files
+    generated <- c()
+
+    # enumerate rendered markdown files
+    files <- input_files()
+
+    # get html files
+    html_files <- file_with_ext(files, "html")
+
+    # _files peers are always removed (they could be here due to
+    # output_dir == "." or due to a _cache existing for the page)
+    html_supporting <- paste0(knitr_files_dir(html_files), '/')
+    generated <- c(generated, html_supporting)
+
+    # _cache peers are always removed
+    html_cache <- paste0(knitr_root_cache_dir(html_files), '/')
+    generated <- c(generated, html_cache)
+
+    # for rendering in the current directory we need to eliminate
+    # output files for our inputs (including _files) and the lib dir
+    if (config$output_dir == ".") {
+
+      # .html peers
+      generated <- c(generated, html_files)
+
+      # site_libs dir
+      generated <- c(generated, "site_libs/")
+
+    # for an explicit output_dir just remove the directory
+    } else {
+      generated <- c(generated, paste0(config$output_dir, '/'))
+    }
+
+    # filter out by existence
+    generated[file.exists(file.path(input, generated))]
+  }
+
+  # return site generator
+  list(
+    name = config$name,
+    output_dir = config$output_dir,
+    render = render,
+    clean = clean
+  )
+}
+
+# utility function to copy all files into the _site directory
+copy_site_resources <- function(input, encoding = getOption("encoding")) {
+
+  # get the site config
+  config <- site_config(input, encoding)
+
+  if (config$output_dir != ".") {
+
+    # get the list of files
+    files <- copyable_site_resources(input = input,
+                                     config = config,
+                                     recursive = FALSE,
+                                     encoding = encoding)
+
+    # perform the copy
+    output_dir <- file.path(input, config$output_dir)
+    file.copy(from = file.path(input, files),
+              to = output_dir,
+              recursive = TRUE)
+  }
+}
+
+# utility function to list the files that should be copied
+copyable_site_resources <- function(input,
+                                    config = site_config(input, encoding),
+                                    recursive = FALSE,
+                                    encoding = getOption("encoding")) {
+
+  # get the original file list (we'll need it to apply includes)
+  all_files <- list.files(input, all.files = TRUE)
+
+  # excludes:
+  #   - known source/data extensions
+  #   - anything that starts w/ '.' or '_'
+  #   - rsconnect and packrat directories
+  #   - user excludes
+  extensions <- c("R", "r", "S", "s",
+                  "Rmd", "rmd", "md", "Rmarkdown", "rmarkdown",
+                  "Rproj", "rproj",
+                  "RData", "rdata", "rds")
+  extensions_regex <- utils::glob2rx(paste0("*.", extensions))
+  excludes <- c("^rsconnect$", "^packrat$", "^\\..*$", "^_.*$", "^.*_cache$",
+                extensions_regex,
+                utils::glob2rx(config$exclude))
+  # add ouput_dir to excludes if it's not '.'
+  if (config$output_dir != '.')
+    excludes <- c(excludes, config$output_dir)
+  files <- all_files
+  for (exclude in excludes)
+    files <- files[!grepl(exclude, files)]
+
+  # allow back in anything specified as an explicit "include"
+  includes <- utils::glob2rx(config$include)
+  for (include in includes) {
+    include_files <- all_files[grepl(include, all_files)]
+    files <- unique(c(files, include_files))
+  }
+
+  # if this is recursive then we need to blow out the directories
+  if (recursive) {
+    recursive_files <- c()
+    for (file in files) {
+      file_path <- file.path(input, file)
+      if (dir_exists(file_path)) {
+        dir_files <- file.path(list.files(file_path,
+                                          full.names = FALSE,
+                                          recursive = TRUE))
+        dir_files <- file.path(file, dir_files)
+        recursive_files <- c(recursive_files, dir_files)
+      } else {
+        recursive_files <- c(recursive_files, file)
+      }
+    }
+    recursive_files
+  } else {
+    files
+  }
+}
+
+# utility function to ensure that 'input' is a valid directory
+# (converts from file to parent directory as necessary)
+input_as_dir <- function(input) {
+
+  # ensure the input dir exists
+  if (!file.exists(input)) {
+    stop("The specified directory '", normalize_path(input, mustWork = FALSE),
+         "' does not exist.", call. = FALSE)
+  }
+
+  # convert from file to directory if necessary
+  if (!dir_exists(input))
+    input <- dirname(input)
+
+  # return it
+  input
+}
+
+# get the path to the site config file
+site_config_file <- function(input) {
+  file.path(input, "_site.yml")
+}
+
+# make sure the html_document format has options `lib_dir` and `self_contained`
+patch_html_document_options <- function(config, encoding, site_yml) {
+  out <- as.list(config[['output']])
+  # when output is not a list, e.g., output: html_document
+  for (i in seq_along(out)) {
+    if (is.character(out[[i]])) out[[i]] = setNames(list('default'), out[[i]])
+  }
+  opts <- out[['html_document']]
+  if (identical(opts, 'default')) opts <- list()
+  opts <- merge_lists(as.list(opts), list(
+    lib_dir = "site_libs", self_contained = FALSE
+  ))
+  config$output <- list(html_document = opts)
+  tmp <- tempfile()
+  file.copy(site_yml, tmp, overwrite = TRUE)
+  con <- file(site_yml, open = 'w', encoding = encoding)
+  on.exit(close(con), add = TRUE)
+  writeLines(yaml::as.yaml(config), con)
+  tmp
+}
diff --git a/R/rtf_document.R b/R/rtf_document.R
new file mode 100644
index 0000000..d5e66eb
--- /dev/null
+++ b/R/rtf_document.R
@@ -0,0 +1,98 @@
+#' Convert to an RTF document
+#'
+#' Format for converting from R Markdown to an RTF document.
+#'
+#' @inheritParams pdf_document
+#' @inheritParams html_document
+#' @inheritParams word_document
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' See the \href{http://rmarkdown.rstudio.com/rtf_document_format.html}{online
+#' documentation} for additional details on using the \code{rtf_document} format.
+#'
+#' R Markdown documents can have optional metadata that is used to generate a
+#' document header that includes the title, author, and date. For more details
+#' see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+#'
+#' R Markdown documents also support citations. You can find more information on
+#' the markdown syntax for citations in the
+#' \href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+#' and Citations} article in the online documentation.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' # simple invocation
+#' render("input.Rmd", rtf_document())
+#'
+#' # specify table of contents option
+#' render("input.Rmd", rtf_document(toc = TRUE))
+#' }
+#'
+#' @export
+rtf_document <- function(toc = FALSE,
+                         toc_depth = 3,
+                         fig_width = 5,
+                         fig_height = 4,
+                         keep_md = FALSE,
+                         md_extensions = NULL,
+                         pandoc_args = NULL) {
+
+  # knitr options and hooks
+  knitr <- knitr_options(
+    opts_chunk = list(dev = 'png',
+                      dpi = 96,
+                      fig.width = fig_width,
+                      fig.height = fig_height)
+  )
+
+  # build pandoc args
+  args <- c("--standalone")
+
+  # table of contents
+  args <- c(args, pandoc_toc_args(toc, toc_depth))
+
+  # pandoc args
+  args <- c(args, pandoc_args)
+
+  preserved_chunks <- character()
+
+  check_knitr_version <- function() {
+    if (packageVersion('knitr') < '1.15') {
+      warning('You need to install a newer version of the knitr package')
+      FALSE
+    } else TRUE
+  }
+
+  pre_processor <- function(metadata, input_file, runtime, knit_meta,
+                             files_dir, output_dir) {
+    if (!check_knitr_version()) return()
+    preserved_chunks <<- extract_preserve_chunks(input_file, knitr::extract_raw_output)
+    NULL
+  }
+
+  post_processor <- function(metadata, input_file, output_file, clean, verbose) {
+    if (!check_knitr_version()) return(output_file)
+    output_str <- readLines(output_file, encoding = 'UTF-8')
+    output_res <- knitr::restore_raw_output(output_str, preserved_chunks)
+    if (!identical(output_str, output_res))
+      writeLines(enc2utf8(output_res), output_file, useBytes = TRUE)
+    output_file
+  }
+
+  # return output format
+  output_format(
+    knitr = knitr,
+    pandoc = pandoc_options(to = "rtf",
+                            from = from_rmarkdown(extensions = md_extensions),
+                            args = args),
+    keep_md = keep_md,
+    pre_processor = pre_processor,
+    post_processor = post_processor
+  )
+}
diff --git a/R/shiny.R b/R/shiny.R
new file mode 100644
index 0000000..1132582
--- /dev/null
+++ b/R/shiny.R
@@ -0,0 +1,599 @@
+#' Run a Shiny document
+#'
+#' Start a Shiny server for the given document, and render it for display.
+#'
+#' @param file Path to the R Markdown document to launch in a web browser.
+#'   Defaults to \code{index.Rmd} in the current working directory, but may be
+#'   \code{NULL} to skip launching a browser.
+#' @param dir The directory from which to to read input documents. Defaults to
+#'   the parent directory of \code{file}.
+#' @param default_file The file to serve at the Shiny server's root URL. If
+#'   \code{NULL} (the default), a sensible default is chosen (see Details)
+#' @param auto_reload If \code{TRUE} (the default), automatically reload the
+#'   Shiny application when the file currently being viewed is changed on disk.
+#' @param shiny_args Additional arguments to \code{\link[shiny:runApp]{runApp}}.
+#' @param render_args Additional arguments to \code{\link{render}}.
+#'
+#' @return Invisible NULL.
+#'
+#' @details The \code{run} function runs a Shiny document by starting a Shiny
+#'   server associated with the document. The \code{shiny_args} parameter can be
+#'   used to configure the server; see the \code{\link[shiny:runApp]{runApp}}
+#'   documentation for details.
+#'
+#'   Once the server is started, the document will be rendered using
+#'   \code{\link{render}}. The server will initiate a render of the document
+#'   whenever necessary, so it is not necessary to call \code{run} every time
+#'   the document changes: if \code{auto_reload} is \code{TRUE}, saving the
+#'   document will trigger a render. You can also manually trigger a render by
+#'   reloading the document in a Web browser.
+#'
+#'   The server will render any R Markdown (\code{.Rmd}) document in \code{dir};
+#'   the \code{file} argument specifies only the initial document to be
+#'   rendered and viewed. You can therefore link to other documents in the
+#'   directory using standard Markdown syntax, e.g.
+#'   \code{[Analysis Page 2](page2.Rmd)}.
+#'
+#'   If \code{default_file} is not specified, nor is a file specified on the
+#'   URL, then the default document to serve at \code{/} is chosen from (in
+#'   order of preference):
+#'   \itemize{
+#'     \item{If \code{dir} contains only one \code{Rmd}, that \code{Rmd}.}
+#'     \item{The file \code{index.Rmd}, if it exists in \code{dir}}
+#'     \item{The file \code{index.html}, if it exists in \code{dir}}
+#'   }
+#'
+#'   If you wish to share R code between your documents, place it in a file
+#'   named \code{global.R} in \code{dir}; it will be sourced into the global
+#'   environment.
+#'
+#' @note Unlike \code{\link{render}}, \code{run} does not render the document to
+#'   a file on disk. In most cases a Web browser will be started automatically
+#'   to view the document; see \code{launch.browser} in the
+#'   \code{\link[shiny:runApp]{runApp}} documentation for details.
+#'
+#'   When using an external web browser with the server, specify the name of the
+#'   R Markdown file to view in the URL (e.g.
+#'   \code{http://127.0.0.1:1234/foo.Rmd}). A URL without a filename will show
+#'   the \code{default_file} as described above.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' # Run the Shiny document "index.Rmd" in the current directory
+#' rmarkdown::run()
+#'
+#' # Run the Shiny document "shiny_doc.Rmd" on port 8241
+#' rmarkdown::run("shiny_doc.Rmd", shiny_args = list(port = 8241))
+#'
+#' }
+#' @export
+run <- function(file = "index.Rmd", dir = dirname(file), default_file = NULL,
+                auto_reload = TRUE, shiny_args = NULL, render_args = NULL) {
+
+  # select the document to serve at the root URL if not user-specified. We exclude
+  # documents which start with a leading underscore (same pattern is used to
+  # designate "sub-documents" in R Markdown websites and bookdown)
+  if (is.null(default_file)) {
+    allRmds <- list.files(path = dir, pattern = "^[^_].*\\.[Rr][Mm][Dd]$")
+    if (length(allRmds) == 1) {
+      # just one R Markdown document
+      default_file <- allRmds
+    } else {
+      # more than one: look for an index
+      index <- which(tolower(allRmds) == "index.rmd")
+      if (length(index) > 0) {
+        default_file <- allRmds[index[1]]
+      }
+      # look for first one that has runtime: shiny
+      else {
+        for (rmd in allRmds) {
+          encoding <- getOption("encoding")
+          if (!is.null(render_args) && !is.null(render_args$encoding))
+            encoding <- render_args$encoding
+          runtime <- yaml_front_matter(file.path(dir,rmd), encoding)$runtime
+          if (is_shiny(runtime)) {
+            default_file <- rmd
+            break
+          }
+        }
+      }
+    }
+  }
+
+  if (is.null(default_file)) {
+    # no R Markdown default found; how about an HTML?
+    indexHtml <- list.files(path = dir, pattern = "index.html?",
+                            ignore.case = TRUE)
+    if (length(indexHtml) > 0) {
+      default_file <- indexHtml[1]
+    }
+  }
+
+  # form and test locations
+  dir <- normalize_path(dir)
+  if (!dir_exists(dir))
+    stop("The directory '", dir, "' does not exist")
+
+  if (!is.null(file)) {
+    # compute file path relative to directory (remove common directory prefix
+    # if it exists)
+    file_rel <- normalize_path(file)
+    if (identical(substr(file_rel, 1, nchar(dir)), dir))
+      file_rel <- substr(file_rel, nchar(dir) + 2, nchar(file_rel))
+
+    # if we don't have a default to launch, make sure the user-specified file
+    # exists
+    if (is.null(default_file)) {
+      resolved <- resolve_relative(dir, file_rel)
+      if (is.null(resolved) || !file.exists(resolved))
+        stop("The file '", file, "' does not exist in the directory '", dir, "'")
+    }
+  }
+
+  # pick up encoding
+  encoding <-
+    if (is.null(render_args$encoding))
+      "UTF-8"
+    else
+      render_args$encoding
+
+  if (is.null(render_args$envir)) render_args$envir <- parent.frame()
+
+  # determine the runtime of the target file
+  target_file <- ifelse(!is.null(file), file, default_file)
+  if (!is.null(target_file))
+    runtime <- yaml_front_matter(target_file, encoding)$runtime
+  else
+    runtime <- NULL
+
+  # run using the requested mode
+  if (is_shiny_prerendered(runtime)) {
+
+    # get the pre-rendered shiny app
+    app <- shiny_prerendered_app(target_file,
+                                 encoding = encoding,
+                                 render_args = render_args)
+  }
+  else {
+
+    # add rmd_resources handler on start
+    onStart <- function() {
+      global_r <- file.path.ci(dir, "global.R")
+      if (file.exists(global_r)) {
+        source(global_r, local = FALSE)
+      }
+      shiny::addResourcePath("rmd_resources", rmarkdown_system_file("rmd/h/rmarkdown"))
+    }
+
+    # combine the user-supplied list of Shiny arguments with our own and start
+    # the Shiny server; handle requests for the root (/) and any R markdown files
+    # within
+    app <- shiny::shinyApp(ui = rmarkdown_shiny_ui(dir, default_file),
+                           uiPattern = "^/$|^/index\\.html?$|^(/.*\\.[Rr][Mm][Dd])$",
+                           onStart = onStart,
+                           server = rmarkdown_shiny_server(
+                             dir, default_file, encoding, auto_reload, render_args))
+
+    # cleanup evaluated cache when the current shiny app exits
+    on.exit({
+      .globals$evaluated_global_chunks <- character()
+    }, add = TRUE)
+  }
+
+  # launch the app and open a browser to the requested page, if one was
+  # specified
+  if (!is.null(shiny_args) && !is.null(shiny_args$launch.browser))
+    launch_browser <- shiny_args$launch.browser
+  else
+    launch_browser <- (!is.null(file)) && interactive()
+  if (isTRUE(launch_browser)) {
+    launch_browser <- function(url) {
+      url <- paste(url, file_rel, sep = "/")
+      browser <- getOption("shiny.launch.browser")
+      if (is.function(browser)) {
+        browser(url)
+      } else {
+        utils::browseURL(url)
+      }
+    }
+  }
+
+  shiny_args <- merge_lists(list(appDir = app,
+                                 launch.browser = launch_browser),
+                            shiny_args)
+  do.call(shiny::runApp, shiny_args)
+  invisible(NULL)
+}
+
+# create the Shiny server function
+rmarkdown_shiny_server <- function(dir, file, encoding, auto_reload, render_args) {
+  function(input, output, session) {
+    path_info <- utils::URLdecode(session$request$PATH_INFO)
+    # strip /websocket/ from the end of the request path if present
+    if (identical(substr(path_info, nchar(path_info) - 10, nchar(path_info)),
+                  "/websocket/")) {
+      path_info <- substr(path_info, 1, nchar(path_info) - 11)
+    }
+    if (!nzchar(path_info)) {
+      path_info <- file
+    }
+
+    file <- resolve_relative(dir, path_info)
+    reactive_file <- if (auto_reload)
+      shiny::reactiveFileReader(500, session, file, identity)
+    else
+      function() { file }
+
+    envir_global <- render_args[['envir']]
+    envir_server <- list2env(list(
+      input = input, output = output, session = session
+    ), parent = envir_global)
+    render_args$envir <- new.env(parent = envir_server)
+
+    # when the file loads (or is changed), render to a temporary file, and
+    # read the contents into a reactive value
+    doc <- shiny::reactive({
+      # check to see whether we have cached output for this file
+      out <- rmd_cached_output(file, encoding)
+      output_dest <- out$dest
+
+      # if output is cached, return it directly
+      if (out$cached) {
+        if (nchar(out$resource_folder) > 0) {
+          shiny::addResourcePath(basename(out$resource_folder),
+                                 out$resource_folder)
+        }
+        return(out$shiny_html)
+      }
+
+      # ensure destination directory exists
+      if (!file.exists(dirname(output_dest))) {
+        dir.create(dirname(output_dest), recursive = TRUE, mode = "0700")
+      }
+
+      # check to see if the output already exists
+      resource_folder <- knitr_files_dir(output_dest)
+
+      # clear out performance timings
+      perf_timer_reset_all()
+
+      # use a custom dependency resolver that just accumulates the dependencies
+      # (we'll pass these to Shiny in a moment)
+      dependencies <- list()
+      shiny_dependency_resolver <- function(deps) {
+        dependencies <<- deps
+        list()
+      }
+
+      # ensure that the document is not rendered to one page
+      output_opts <- list(
+        self_contained = FALSE,
+        copy_resources = TRUE,
+        dependency_resolver = shiny_dependency_resolver)
+
+      # remove console clutter from any previous renders
+      message("\f")
+
+      # merge our inputs with those supplied by the user and invoke render
+      args <- merge_lists(list(input = reactive_file(),
+                               output_file = output_dest,
+                               output_dir = dirname(output_dest),
+                               output_options = output_opts,
+                               intermediates_dir = dirname(output_dest),
+                               runtime = "shiny"),
+                          render_args)
+      result_path <- shiny::maskReactiveContext(do.call(render, args))
+
+      # ensure the resource folder exists, and map requests to it in Shiny
+      if (!dir_exists(resource_folder))
+        dir.create(resource_folder, recursive = TRUE)
+      shiny::addResourcePath(basename(resource_folder), resource_folder)
+
+      # extra dependency: emit performance information collected during render
+      dependencies <- append(dependencies, list(create_performance_dependency(resource_folder)))
+
+      # save the structured dependency information
+      write_shiny_deps(resource_folder, dependencies)
+
+      # attach rstudio rsiframe script if we are in rstudio (we do this after
+      # persisting the dependencies since this dependency is ephemeral)
+      if (nzchar(Sys.getenv("RSTUDIO")))
+        dependencies <- append(dependencies, list(html_dependency_rsiframe()))
+
+      # when the session ends, remove the rendered document and any supporting
+      # files, if they're not cacheable
+      if (!isTRUE(out$cacheable)) {
+        shiny::onReactiveDomainEnded(shiny::getDefaultReactiveDomain(), function() {
+          unlink(result_path)
+          unlink(resource_folder, recursive = TRUE)
+        })
+      }
+      shinyHTML_with_deps(result_path, dependencies)
+    })
+
+    doc_ui <- shiny::renderUI({
+      doc()
+    })
+
+    # For test snapshots. (The snapshotPreprocessOutput function was added
+    # in shiny 1.0.4.)
+    if (exists("snapshotPreprocessOutput", asNamespace("shiny"))) {
+      doc_ui <- shiny::snapshotPreprocessOutput(
+        doc_ui,
+        function(value) {
+          # Since the html data can be very large, just record a hash of it.
+          value$html <- sprintf("[html data sha1: %s]",
+            digest::digest(value$html, algo = "sha1", serialize = FALSE)
+          )
+
+          value
+        }
+      )
+    }
+
+    output$`__reactivedoc__` <- doc_ui
+  }
+}
+
+# create the Shiny UI function
+rmarkdown_shiny_ui <- function(dir, file) {
+  function(req) {
+    # map requests to / to requests for the default--index.Rmd, or another if
+    # specified
+    req_path <- utils::URLdecode(req$PATH_INFO)
+    if (identical(req_path, "/")) {
+      req_path <- file
+    }
+
+    # request must be for an R Markdown or HTML document
+    ext <- tolower(tools::file_ext(req_path))
+    if (!identical(ext, "rmd") &&
+        !identical(ext, "htm") &&
+        !identical(ext, "html")) {
+      return(NULL)
+    }
+
+    # document must exist
+    target_file <- resolve_relative(dir, req_path)
+    if (is.null(target_file) || !file.exists(target_file)) {
+      return(NULL)
+    }
+
+    tags$div(
+      tags$head(
+        tags$script(src = "rmd_resources/rmd_loader.js"),
+        tags$link(href = "rmd_resources/rmd_loader.css", rel = "stylesheet")
+      ),
+
+      # Shiny shows the outer conditionalPanel as long as the document hasn't
+      # loaded; the inner rmd_loader is shown by rmd_loader.js as soon as
+      # we've been waiting a certain number of ms
+      shiny::conditionalPanel(
+        "!output.__reactivedoc__",
+        tags$div(
+          id = "rmd_loader_wrapper",
+          tags$div(id = "rmd_loader", style = "display: none",
+                   tags$img(src = "rmd_resources/rmd_loader.gif"),
+                   tags$p("Loading")))),
+      shiny::uiOutput("__reactivedoc__")
+    )
+  }
+}
+
+shinyHTML_with_deps <- function(html_file, deps) {
+
+  # read the html_file
+  html <- readLines(html_file, encoding = "UTF-8", warn = FALSE)
+
+  # if we are running in RStudio and have local MathJax then serve locally
+  # (for static Rmds we do this substitution inside RStudio as we serve the
+  # html over our port, however these documents are served by Shiny so there
+  # is no opportunity to do the substituion)
+  if (nzchar(Sys.getenv("RSTUDIO"))) {
+    local_mathjax <- Sys.getenv("RMARKDOWN_MATHJAX_PATH")
+    if (nzchar(local_mathjax)) {
+      html <- gsub(pattern = "https://mathjax.rstudio.com/latest/MathJax.js?",
+                   replacement = "mathjax-local/MathJax.js?",
+                   x = html,
+                   fixed = TRUE,
+                   useBytes = TRUE)
+      shiny::addResourcePath("mathjax-local", local_mathjax)
+    }
+  }
+
+  # attach dependencies and return HTML
+  htmltools::attachDependencies(
+    htmltools::HTML(paste(html, collapse = "\n")),
+    deps
+  )
+}
+
+# given an input file and its encoding, return a list with values indicating
+# whether the input file's Shiny document can be cached and, if so, its cached
+# representation if available
+rmd_cached_output <- function(input, encoding) {
+  # init return values
+  cacheable <- FALSE
+  cached <- FALSE
+  shiny_html <- NULL
+  resource_folder <- ""
+
+  # if the file is raw HTML, return it directly
+  if (identical(tolower(tools::file_ext(input)), "htm") ||
+      identical(tolower(tools::file_ext(input)), "html")) {
+    return(list(
+      cacheable = TRUE,
+      cached = TRUE,
+      dest = "",
+      shiny_html = shinyHTML_with_deps(input, NULL),
+      resource_folder = ""))
+  }
+
+  # check to see if the file is a Shiny document
+  front_matter <- parse_yaml_front_matter(read_lines_utf8(input, encoding))
+  if (!is_shiny_classic(front_matter$runtime)) {
+
+    # If it's not a Shiny document, then its output is cacheable. Hash the file
+    # with its modified date to get a cache key.
+    cacheable <- TRUE
+    output_key <- digest::digest(paste(input, file.info(input)[4]),
+                                 algo = "md5", serialize = FALSE)
+    output_dest <- paste(file.path(dirname(tempdir()), "rmarkdown", output_key,
+                                   paste("rmd", output_key, sep = "_")),
+                         "html", sep = ".")
+
+    # If the output is cacheable, it may also be already cached
+    if (file.exists(output_dest)) {
+      resource_folder <- knitr_files_dir(output_dest)
+      dependencies <- read_shiny_deps(resource_folder)
+      shiny_html <- shinyHTML_with_deps(output_dest, dependencies)
+      cached <- TRUE
+    }
+  } else {
+    # It's not cacheable, and should be rendered to a session-specific temporary
+    # file
+    output_dest <- tempfile(fileext = ".html")
+  }
+  list(
+    cacheable = cacheable,
+    cached = cached,
+    dest = output_dest,
+    shiny_html = shiny_html,
+    resource_folder = resource_folder)
+}
+
+# resolve a path relative to a directory (from Shiny)
+resolve_relative <- function(dir, relpath) {
+  abs.path <- file.path(dir, relpath)
+  if (!file.exists(abs.path))
+    return(NULL)
+  abs.path <- normalize_path(abs.path, mustWork = TRUE)
+  dir <- normalize_path(dir, mustWork = TRUE)
+  # trim the possible trailing slash under Windows
+  if (.Platform$OS.type == 'windows') dir <- sub('/$', '', dir)
+  if (nchar(abs.path) <= nchar(dir) + 1)
+    return(NULL)
+  if (substr(abs.path, 1, nchar(dir)) != dir ||
+        substr(abs.path, nchar(dir) + 1, nchar(dir) + 1) != '/') {
+    return(NULL)
+  }
+  return(abs.path)
+}
+
+# find 'name' in 'dir', without matching on case (from Shiny)
+file.path.ci <- function(dir, name) {
+  default <- file.path(dir, name)
+  if (file.exists(default))
+    return(default)
+  if (!dir_exists(dir))
+    return(default)
+
+  matches <- list.files(dir, name, ignore.case = TRUE, full.names = TRUE,
+                        include.dirs = TRUE)
+  if (length(matches) == 0)
+    return(default)
+  return(matches[[1]])
+}
+
+#' Delay Rendering for an Expression
+#'
+#' In a Shiny document, evaluate the given expression after the document has
+#' finished rendering, instead of during render.
+#'
+#' @param expr The expression to evaluate.
+#'
+#' @return An object representing the expression.
+#'
+#' @details This function is useful inside Shiny documents. It delays the
+#'   evaluation of its argument until the document has finished its initial
+#'   render, so that the document can be viewed before the calculation is
+#'   finished.
+#'
+#'   Any expression that returns HTML can be wrapped in \code{render_delayed}.
+#'
+#' @note \code{expr} is evaluated in a \strong{copy} of the environment in which
+#'   the \code{render_delayed} call appears. Consequently, no side effects
+#'   created by \code{expr} are visible in succeeding expressions, nor are
+#'   changes to the environment after the call to \code{render_delayed} visible
+#'   to \code{expr}.
+#'
+#'   \code{expr} must be an expression that produces HTML.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' # Add the following code to an R Markdown document
+#'
+#' div(Sys.time())
+#'
+#' render_delayed({
+#'  Sys.sleep(3)      # simulate an expensive computation
+#'  div(Sys.time())
+#' })
+#'
+#' div(Sys.time())
+#' }
+#'
+#' @export
+render_delayed <- function(expr) {
+  # take a snapshot of the environment in which the expr should be rendered
+  env <- parent.frame()
+  env_snapshot <- new.env(parent = parent.env(env))
+  for (var in ls(env, all.names = TRUE))
+      assign(var, get(var, env), env_snapshot)
+
+  # take a snapshot of the current knitr and chunk options and the
+  # expression to be evaluated
+  assign("knitr_cached_chunk_opts", knitr::opts_current$get(), env_snapshot)
+  assign("knitr_cached_knit_opts", knitr::opts_knit$get(), env_snapshot)
+  assign("knitr_orig_expr", substitute(expr), env_snapshot)
+
+  # evaluate the expression at runtime
+  shiny::renderUI(quote({
+    knitr::opts_current$restore(knitr_cached_chunk_opts)
+    knitr::opts_knit$restore(knitr_cached_knit_opts)
+    shiny::HTML(knitr::knit_print(eval(knitr_orig_expr),
+                                  knitr::opts_current$get()))
+  }),
+  env = env_snapshot,
+  quoted = TRUE)
+}
+
+is_shiny <- function(runtime) {
+  !is.null(runtime) && grepl('^shiny', runtime)
+}
+
+is_shiny_classic <- function(runtime) {
+  identical(runtime, "shiny")
+}
+
+is_shiny_prerendered <- function(runtime) {
+  identical(runtime, "shiny_prerendered")
+}
+
+write_shiny_deps <- function(files_dir, deps) {
+  if (!dir_exists(files_dir))
+    dir.create(files_dir, recursive = TRUE)
+  deps_file <- file.path(files_dir, "dependencies.json")
+  deps_json <- jsonlite::serializeJSON(deps, pretty = TRUE)
+  writeLines(deps_json, deps_file, useBytes = TRUE)
+}
+
+read_shiny_deps <- function(files_dir) {
+  deps_path <- file.path(files_dir, "dependencies.json")
+  if (file.exists(deps_path)) {
+    deps_json <- readLines(deps_path, encoding = 'UTF-8')
+    dependencies <- jsonlite::unserializeJSON(deps_json)
+
+    # attach rstudio rsiframe script if we are in rstudio
+    if (nzchar(Sys.getenv("RSTUDIO")))
+      dependencies <- append(dependencies, list(html_dependency_rsiframe()))
+
+    # return
+    dependencies
+  }
+  else {
+    list()
+  }
+}
diff --git a/R/shiny_module.R b/R/shiny_module.R
new file mode 100644
index 0000000..e69de29
diff --git a/R/shiny_prerendered.R b/R/shiny_prerendered.R
new file mode 100644
index 0000000..7366bb6
--- /dev/null
+++ b/R/shiny_prerendered.R
@@ -0,0 +1,591 @@
+
+# Create a shiny app object from an Rmd w/ runtime: shiny_prerendered
+shiny_prerendered_app <- function(input_rmd, encoding, render_args) {
+
+  # get rendered html and capture dependencies
+  html <- shiny_prerendered_html(input_rmd, encoding, render_args)
+  deps <- attr(html, "html_dependencies")
+
+  # create the server environment
+  server_envir = new.env(parent = globalenv())
+
+  # extract the server-start context
+  html_lines <- strsplit(html, "\n", fixed = TRUE)[[1]]
+  server_start_context <- shiny_prerendered_extract_context(html_lines,
+                                                            "server-start")
+
+  # extract the code used for server startup (this encompasses both the
+  # context="server-start" code and the context="data" code). This can be
+  # retreived later via the shiny_prerendered_server_start_code function. The
+  # purpose of this is for appliations which want to run user in other
+  # processes while still duplicating the setup context (e.g. tutorials).
+  server_start_code <- paste(c(server_start_context,
+                               shiny_prerendered_extract_context(html_lines, "data")),
+                             collapse = "\n")
+
+  onStart <- function() {
+
+    # save the server_start_code
+    assign(".shiny_prerendered_server_start_code", server_start_code, envir = server_envir)
+
+    # execute the startup code (server_start_context + context="data" loading)
+    eval(parse(text = server_start_context), envir = server_envir)
+    shiny_prerendered_data_load(input_rmd, server_envir)
+
+    # lock the environment to prevent inadvertant assignments
+    lockEnvironment(server_envir)
+  }
+
+  # extract the server context
+  .server_context <- shiny_prerendered_extract_context(html_lines, "server")
+  server_envir$.server_context <- .server_context
+  server <- function(input, output, session) {
+    eval(parse(text = .server_context))
+  }
+  environment(server) <- new.env(parent = server_envir)
+
+  # remove server code before serving
+  server_contexts <-  c("server-start", "data", "server")
+  html_lines <- shiny_prerendered_remove_contexts(html_lines, server_contexts)
+  html <- HTML(paste(html_lines, collapse = "\n"))
+  html <- htmltools::attachDependencies(html, deps)
+
+  # create shiny app
+  shiny::shinyApp(
+    ui = function(req) html,
+    server = server,
+    onStart = onStart,
+    uiPattern = "^/$|^(/.*\\.[Rr][Mm][Dd])$"
+  )
+}
+
+
+# Generate the html for a runtime: shiny_prerendered Rmd (attempts to use
+# an existing rendering of the html if it's still valid)
+shiny_prerendered_html <- function(input_rmd, encoding, render_args) {
+
+  # determine the path to the rendered_html
+  output_file <- render_args$output_file
+  if (is.null(output_file))
+    output_file <- file_with_ext(basename(input_rmd), "html")
+  output_dir <- render_args$output_dir
+  if (is.null(output_dir))
+    output_dir <- dirname(input_rmd)
+  rendered_html <- file.path(output_dir, output_file)
+
+  # determine whether we need to render the Rmd in advance
+  prerender_option <- tolower(Sys.getenv("RMARKDOWN_RUN_PRERENDER", "1"))
+
+  if (file.access(output_dir, 2) != 0) {
+    if (!file.exists(rendered_html))
+      stop("Unable to write prerendered HTML file to ", rendered_html)
+
+    prerender <- FALSE
+  }
+  else if (identical(prerender_option, "0")) {
+    prerender <- FALSE
+  }
+  else if (identical(prerender_option, "1")) {
+
+    # determine the last modified time of the output file
+    if (file.exists(rendered_html))
+      output_last_modified <- as.integer(file.info(rendered_html)$mtime)
+    else
+      output_last_modified <- 0L
+
+    # short circuit for Rmd modified. if it hasn't been modified since the
+    # html was generated look at external resources
+    input_last_modified <- as.integer(file.info(input_rmd)$mtime)
+    if (input_last_modified > output_last_modified) {
+      prerender <- TRUE
+    }
+    else {
+      # find external resources referenced by the file
+      external_resources <- find_external_resources(input_rmd, encoding)
+
+      # get paths to external resources
+      input_files <- c(input_rmd,
+                       file.path(output_dir, external_resources$path))
+
+      # what's the maximum last_modified time of an input file
+      input_last_modified <- max(as.integer(file.info(input_files)$mtime),
+                                 na.rm = TRUE)
+
+      # render if an input file was modified after the output file
+      prerender <- input_last_modified > output_last_modified
+    }
+  }
+  else {
+    stop("Invalid value '", prerender_option, "' for RMARKDOWN_RUN_PRERENDER")
+  }
+
+  # prerender if necessary
+  if (prerender) {
+
+    # execute the render
+    args <- merge_lists(list(input = input_rmd, encoding = encoding), render_args)
+    rendered_html <- do.call(render, args)
+  }
+
+  if (!file.exists(rendered_html)) {
+    stop("Prerendered HTML file not found at ", rendered_html)
+  }
+
+  # normalize paths
+  rendered_html <- normalize_path(rendered_html, winslash = "/")
+  output_dir <- dirname(rendered_html)
+
+  # add some resource paths
+  add_resource_path <- function(path) {
+    if (dir_exists(path))
+      shiny::addResourcePath(basename(path), path)
+  }
+  files_dir <- knitr_files_dir(rendered_html)
+  add_resource_path(files_dir)
+  add_resource_path(file.path(output_dir,"css"))
+  add_resource_path(file.path(output_dir,"js"))
+  add_resource_path(file.path(output_dir,"images"))
+  add_resource_path(file.path(output_dir,"www"))
+
+  # extract dependencies from html
+  html_lines <- readLines(rendered_html, encoding = "UTF-8", warn = FALSE)
+  dependencies_json <- shiny_prerendered_extract_context(html_lines, "dependencies")
+  dependencies <- jsonlite::unserializeJSON(dependencies_json)
+
+  # resolve package paths (this will happen automatically for the
+  # development version of htmltools but this isn't on CRAN yet)
+  dependencies <- lapply(dependencies, function(dependency) {
+    if (!is.null(dependency$package) && !is.null(dependency$src$file)) {
+      dependency$src$file <- system.file(dependency$src$file,
+                                         package = dependency$package)
+      dependency$package <- NULL
+    }
+    dependency
+  })
+
+  # attach rstudio rsiframe script if we are in rstudio
+  if (nzchar(Sys.getenv("RSTUDIO")))
+    dependencies <- append(dependencies, list(html_dependency_rsiframe()))
+
+  # return html w/ dependencies
+  shinyHTML_with_deps(rendered_html, dependencies)
+}
+
+
+# Write the dependencies for a shiny_prerendered document.
+#' @import rprojroot
+shiny_prerendered_append_dependencies <- function(input, # always UTF-8
+                                                  shiny_prerendered_dependencies,
+                                                  files_dir,
+                                                  output_dir) {
+
+
+
+  # transform dependencies (if we aren't in debug mode)
+  dependencies <- lapply(shiny_prerendered_dependencies, function(dependency) {
+
+    # no transformation in dev mode (so browser dev tools can map directly
+    # to the locations of CSS and JS files in their pkg src directory)
+    if (nzchar(Sys.getenv("RMARKDOWN_SHINY_PRERENDERED_DEVMODE")))
+      return(dependency)
+
+    # see if we can convert absolute paths into package-aliased ones
+    if (is.null(dependency$package) && !is.null(dependency$src$file)) {
+
+      # check for a package directory parent
+      package_dir <- tryCatch(
+        find_root(is_r_package, path = dependency$src$file),
+        error = function(e) NULL
+      )
+      # if we have one then populate the package field and make the
+      # src$file relative to the package
+      if (!is.null(package_dir)) {
+        package_desc <- read.dcf(file.path(package_dir, "DESCRIPTION"),
+                                 all = TRUE)
+        dependency$package <- package_desc$Package
+        dependency$src$file <- normalized_relative_to(package_dir,
+                                                      dependency$src$file)
+      }
+    }
+
+    # if we couldn't resolve the src to a package then copy the files
+    if (is.null(dependency$package) && !is.null(dependency$src$file)) {
+      dependency <- htmltools::copyDependencyToDir(dependency, files_dir)
+      dependency <- htmltools::makeDependencyRelative(dependency, output_dir)
+      dependency$src = list(href = unname(dependency$src))
+    }
+
+    # return dependency
+    dependency
+  })
+
+  # remove NULLs (excluded dependencies)
+  dependencies <- dependencies[!sapply(dependencies, is.null)]
+
+  # append them to the file (guarnateed to be UTF-8)
+  con <- file(input, open = "at", encoding = "UTF-8")
+  on.exit(close(con), add = TRUE)
+
+  # write deps to connection
+  dependencies_json <- jsonlite::serializeJSON(dependencies, pretty = FALSE)
+  shiny_prerendered_append_context(con, "dependencies", dependencies_json)
+}
+
+
+#' Clean prerendered content for the specified Rmd input file
+#'
+#' Remove the associated html file and supporting _files directory
+#' for a shiny_prerendered documet.
+#'
+#' @param input Rmd input file to clean content for
+#'
+#' @export
+shiny_prerendered_clean <- function(input) {
+
+  # html file
+  html_file <- file_with_ext(input, "html")
+  if (file.exists(html_file))
+    file.remove(html_file)
+
+  # cache dir
+  cache_dir <- knitr_root_cache_dir(input)
+  if (dir_exists(cache_dir))
+    unlink(cache_dir, recursive = TRUE)
+
+  # files dir
+  files_dir <- knitr_files_dir(input)
+  if (dir_exists(files_dir))
+    unlink(files_dir, recursive = TRUE)
+
+  # data dir
+  data_dir <- shiny_prerendered_data_dir(input)
+  if (dir_exists(data_dir))
+    unlink(data_dir, recursive = TRUE)
+}
+
+
+#' Add code to a shiny_prerendered context
+#'
+#' Programmatic equivalent to including a code chunk with a
+#' context in a runtime: shiny_prerendered document.
+#'
+#' @param context Context name (e.g. "server", "server-start")
+#' @param code Character vector with code
+#' @param singleton Collapse multiple identical versions of this
+#'   chunk into a single chunk.
+#'
+#' @export
+shiny_prerendered_chunk <- function(context, code, singleton = FALSE) {
+
+  # verify we are in runtime: shiny_prerendered
+  if (!identical(knitr::opts_knit$get("rmarkdown.runtime"),"shiny_prerendered"))
+      stop("The shiny_prerendered_chunk function can only be called from ",
+           "within runtime: shiny_prerenered")
+
+  # add the prerendered chunk to knit_meta
+  knitr::knit_meta_add(list(
+    structure(class = "shiny_prerendered", list(
+      name = context,
+      code = code,
+      singleton = singleton
+    ))
+  ))
+
+  # return NULL invisibly
+  invisible(NULL)
+}
+
+
+#' Get the server startup code for a shiny_prerendered server instance
+#'
+#' @param server_envir Shiny server environment to get code for
+#'
+#' @keywords internal
+#' @export
+shiny_prerendered_server_start_code <- function(server_envir) {
+  if (exists(".shiny_prerendered_server_start_code", envir = server_envir))
+    get(".shiny_prerendered_server_start_code", envir = server_envir)
+  else
+    ""
+}
+
+
+# Record which context="data" chunks are actually executed during
+# the current render as well as the file names they are saved with.
+# We'll use this later to determine which .RData files in the _data
+# directory should actually be loaded (as some could be from chunks
+# that used to be cached / were cached under different names)
+shiny_prerendered_option_hook <- function(input, encoding) {
+  function(options) {
+
+    # convert chunk labels to contexts as necessary
+    if (options$label %in% c("setup", "data", "server_start", "server"))
+      options$context <- options$label
+
+    if (identical(options$context, "data")) {
+      data_file <- shiny_prerendered_data_file_name(options$label,
+                                                    options$cache > 0)
+      data_file <- to_utf8(data_file, encoding)
+      data_dir <- shiny_prerendered_data_dir(input, create = TRUE)
+      index_file <- shiny_prerendred_data_chunks_index(data_dir)
+      conn <- file(index_file, open = "ab", encoding = "UTF-8")
+      on.exit(close(conn), add = TRUE)
+      write(data_file, file = conn, append = TRUE)
+    }
+    options
+  }
+}
+
+# Evaluate hook to capture chunks with e.g. context="server" and
+# append their code to the appropriate shiny_prerendered_context
+shiny_prerendered_evaluate_hook <- function(input) {
+
+  function(code, envir, ...) {
+
+    # get the context (default to "render")
+    context <- knitr::opts_current$get("context")
+    if (is.null(context))
+      context <- "render"
+
+    # "setup" is an alias for c("render", "server-start")
+    if ("setup" %in% context) {
+      context <- c(context[!context == "setup"], "render", "server-start")
+      context <- unique(context)
+    }
+
+    # if there are server-side contexts then emit knit_meta for them
+    for (name in context) {
+      if (!name %in% c("render"))
+        shiny_prerendered_chunk(name, code)
+    }
+
+    # capture and serialize data for context = "data"
+    if ("data" %in% context) {
+
+      # determine whether caching is active
+      label <- knitr::opts_current$get("label")
+      cache_option <- knitr::opts_current$get("cache")
+      cache <- !is.null(cache_option) && cache_option > 0
+
+      # evaluate the chunk in a new environment parented by the default envir
+      data_env <- new.env(parent = envir)
+      result <- evaluate::evaluate(code, data_env, ...)
+
+      # save all of the created objects then move them back into the parent
+      data_dir <- shiny_prerendered_data_dir(input, create = TRUE)
+      # use a special path prefix for cached chunks so we know not
+      # to remove them at the beginning of render
+      rdata_file <- file.path(data_dir,
+                              shiny_prerendered_data_file_name(label, cache))
+      save(list = ls(data_env),
+           file = rdata_file,
+           envir = data_env,
+           compress = FALSE)
+
+      for (name in ls(data_env)) {
+        assign(name, get(name, envir = data_env), envir = envir)
+        remove(list = c(name), envir = data_env)
+      }
+
+      # return results of evaluation (used for knitr cache)
+      result
+    }
+
+    # straight evaluate if this is a render context
+    else if ("render" %in% context) {
+      evaluate::evaluate(code, envir, ...)
+    }
+
+    # otherwise parse so we can throw an error for invalid code
+    else {
+      parse(text = code)
+      list()
+    }
+  }
+}
+
+# Remove prerendered .RData that isn't in the cache (as data in the
+# cache won't necessarily be recreated during the next render)
+shiny_prerendered_remove_uncached_data <- function(input) {
+  data_dir <- shiny_prerendered_data_dir(input)
+  if (dir_exists(data_dir)) {
+    index_file <- shiny_prerendred_data_chunks_index(data_dir)
+    if (file.exists(index_file))
+      unlink(index_file)
+    rdata_files <- list.files(data_dir, pattern = utils::glob2rx("*.RData"))
+    cached_rdata_files <- list.files(data_dir, pattern = utils::glob2rx("*.cached.RData"))
+    uncached_rdata_files <- setdiff(rdata_files, cached_rdata_files)
+    unlink(file.path(data_dir, uncached_rdata_files))
+  }
+}
+
+
+
+# Extract application/shiny-prerendered script tags from an html document
+shiny_prerendered_extract_context <- function(html_lines, context) {
+
+  # look for lines that start the context
+  pattern <- paste0('<script type="application/shiny-prerendered" data-context="', context, '">')
+  matches <- regmatches(html_lines, regexec(pattern, html_lines, fixed = TRUE))
+
+  # extract the code within the contexts
+  in_context <- FALSE
+  context_lines <- character()
+  for (i in 1:length(matches)) {
+    if (length(matches[[i]]) > 0) {
+      in_context <- TRUE
+      next
+    }
+    else if (in_context && identical(html_lines[[i]], "</script>")) {
+      in_context <- FALSE
+    }
+    if (in_context)
+      context_lines <- c(context_lines, html_lines[[i]])
+  }
+
+  # unescape code, see https://github.com/rstudio/rmarkdown/issues/943
+  context_lines <- gsub("<\\u002f", "</", context_lines, fixed = TRUE)
+  context_lines
+}
+
+shiny_prerendered_remove_contexts <- function(html_lines, contexts) {
+
+  # look for lines that start the contexts
+  pattern <- paste0('<script type="application/shiny-prerendered" data-context="')
+  matches <- regmatches(html_lines, regexec(pattern, html_lines, fixed = TRUE))
+
+  # create a regex pattern used for matching named contexts
+  contexts_pattern <- paste0(pattern, "(", paste(contexts, collapse = "|"), ")")
+
+  # new_html_lines to return
+  new_html_lines <- character()
+
+  # ignore the code within the contexts
+  in_context <- FALSE
+  for (i in 1:length(matches)) {
+    if (length(matches[[i]]) > 0 && grepl(contexts_pattern, html_lines[[i]])) {
+      in_context = TRUE
+    }
+    else if (in_context && identical(html_lines[[i]], "</script>")) {
+      in_context <- FALSE
+    }
+    else if (!in_context)
+      new_html_lines <- c(new_html_lines, html_lines[[i]])
+  }
+
+  # return
+  new_html_lines
+}
+
+
+
+# Gather shiny_prerendred contexts and append them as script tags to
+# the passed file
+shiny_prerendered_append_contexts <- function(runtime, file, encoding) {
+
+  # collect contexts
+  shiny_prerendered_contexts <- knit_meta_reset(class = "shiny_prerendered")
+  if (length(shiny_prerendered_contexts) > 0) {
+
+    # validate we are in runtime: shiny_prerendered
+    if (!is_shiny_prerendered(runtime)) {
+      stop("The code within this document requires runtime: shiny_prerendered",
+           call. = FALSE)
+    }
+
+    # open the file
+    con <- file(file, open = "at", encoding = encoding)
+    on.exit(close(con), add = TRUE)
+
+    # track singletons
+    singletons <- list()
+
+    # append the contexts as script tags
+    for (context in shiny_prerendered_contexts) {
+
+      # resovle singletons
+      if (isTRUE(context$singleton)) {
+        found_singleton <- FALSE
+        for (singleton in singletons) {
+          if (identical(context, singleton)) {
+            found_singleton <- TRUE
+            break
+          }
+        }
+        if (found_singleton)
+          next
+        else
+          singletons[[length(singletons) + 1]] <- context
+      }
+
+      # append context
+      shiny_prerendered_append_context(con, context$name, context$code)
+    }
+  }
+}
+
+shiny_prerendered_append_context <- function(con, name, code) {
+  lines <- c('<!--html_preserve-->',
+             paste0('<script type="application/shiny-prerendered" ',
+                    'data-context="', name ,'">'),
+             # escape code, see https://github.com/rstudio/rmarkdown/issues/943
+             gsub("</", "<\\u002f", code, fixed = TRUE),
+             '</script>',
+             '<!--/html_preserve-->')
+  writeLines(lines, con = con)
+}
+
+
+# Prerendred data_dir for a given Rmd input file
+shiny_prerendered_data_dir <- function(input, create = FALSE) {
+  data_dir <- paste0(tools::file_path_sans_ext(input), "_data")
+  if (create && !dir_exists(data_dir))
+    dir.create(data_dir)
+  data_dir
+}
+
+
+# Load prerendred data into the server environment. There are two
+# reasons we load data based on a previously generated index file:
+#
+# (1) We don't remove all of the previously generated .RData files
+#     at the beginning of a render. Specifically, we don't remove
+#     .RData files that were created within a chunk w/ caching
+#     enabled, since that .RData won't necessarily be re-created on
+#     the next render. This means that we could be left with "stale"
+#     .RData files from cached chunks. Reading based on the list
+#     ensures that we only read .RData for chunks that were
+#     included in the last rendered document.
+#
+# (2) We want to load data into the server environemnt in the
+#     exact same chunk order that it appears in the document.
+#
+shiny_prerendered_data_load <- function(input_rmd, server_envir) {
+  # check for data_dir
+  data_dir <- shiny_prerendered_data_dir(input_rmd)
+  if (dir_exists(data_dir)) {
+    # read index of data files
+    index_file <- shiny_prerendred_data_chunks_index(data_dir)
+    if (file.exists(index_file)) {
+      rdata_files <- readLines(index_file, encoding = "UTF-8")
+      # load each of the files in the index
+      for (rdata_file in rdata_files) {
+        rdata_file <- file.path(data_dir,rdata_file)
+        if (file.exists(rdata_file)) # won't exist if the chunk has no code
+          load(rdata_file, envir = server_envir)
+      }
+    }
+  }
+}
+
+# File used to store names of chunks which had cache=TRUE during the last render
+shiny_prerendred_data_chunks_index <- function(data_dir) {
+  file.path(data_dir, "data_chunks_index.txt")
+}
+
+# Form the name of a shiny_prerendered .RData file
+shiny_prerendered_data_file_name <- function(label, cache) {
+  type <- ifelse(cache, ".cached", "")
+  sprintf("%s%s.RData", label, type)
+}
+
diff --git a/R/slidy_presentation.R b/R/slidy_presentation.R
new file mode 100644
index 0000000..013eed3
--- /dev/null
+++ b/R/slidy_presentation.R
@@ -0,0 +1,163 @@
+
+#' Convert to a slidy presentation
+#'
+#' Format for converting from R Markdown to a slidy presentation.
+#'
+#' @inheritParams pdf_document
+#' @inheritParams html_document
+#' @inheritParams beamer_presentation
+#'
+#' @param duration Duration (in minutes) of the slide deck. This value is used
+#'   to add a countdown timer to the slide footer.
+#' @param footer Footer text (e.g. organization name and/or copyright)
+#' @param font_adjustment Increase or decrease the default font size (e.g. -1 or
+#'   +1). You can also manually adjust the font size during the presentation
+#'   using the 'S' (smaller) and 'B' (bigger) keys.
+#' @param ... Additional function arguments to pass to the base R Markdown HTML
+#'   output formatter \code{\link{html_document_base}}
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' See the
+#' \href{http://rmarkdown.rstudio.com/slidy_presentation_format.html}{online
+#' documentation} for additional details on using the \code{slidy_presentation}
+#' format.
+#'
+#' For more information on markdown syntax for presentations see the
+#' \href{http://pandoc.org/README.html}{pandoc online documentation}.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' # simple invocation
+#' render("pres.Rmd", slidy_presentation())
+#'
+#' # specify an option for incremental rendering
+#' render("pres.Rmd", slidy_presentation(incremental = TRUE))
+#' }
+#'
+#' @export
+slidy_presentation <- function(incremental = FALSE,
+                               duration = NULL,
+                               footer = NULL,
+                               font_adjustment = 0,
+                               fig_width = 8,
+                               fig_height = 6,
+                               fig_retina = 2,
+                               fig_caption = TRUE,
+                               dev = 'png',
+                               df_print = "default",
+                               smart = TRUE,
+                               self_contained = TRUE,
+                               highlight = "default",
+                               mathjax = "default",
+                               template = "default",
+                               css = NULL,
+                               includes = NULL,
+                               keep_md = FALSE,
+                               lib_dir = NULL,
+                               md_extensions = NULL,
+                               pandoc_args = NULL,
+                               extra_dependencies = NULL,
+                               ...) {
+
+  # base pandoc options for all reveal.js output
+  args <- c()
+
+  # template path and assets
+  if (identical(template, "default"))
+    args <- c(args, "--template",
+              pandoc_path_arg(rmarkdown_system_file(
+                "rmd/slidy/default.html")))
+  else if (!is.null(template))
+    args <- c(args, "--template", pandoc_path_arg(template))
+
+  # html dependency for slidy
+  extra_dependencies <- append(extra_dependencies,
+                               list(html_dependency_slidy()))
+
+  # incremental
+  if (incremental)
+    args <- c(args, "--incremental")
+
+  # duration
+  if (!is.null(duration))
+    args <- c(args, pandoc_variable_arg("duration", duration))
+
+  # footer
+  if (!is.null(footer))
+    args <- c(args, pandoc_variable_arg("footer", footer))
+
+  # font size adjustment
+  if (font_adjustment != 0)
+    args <- c(args, pandoc_variable_arg("font-size-adjustment",
+                                        font_adjustment))
+
+  md_extensions <- smart_extension(smart, md_extensions)
+
+  # content includes
+  args <- c(args, includes_to_pandoc_args(includes))
+
+  # pagedtables
+  if (identical(df_print, "paged")) {
+    extra_dependencies <- append(extra_dependencies,
+                                 list(html_dependency_pagedtable()))
+  }
+
+  # additional css
+  for (css_file in css)
+    args <- c(args, "--css", pandoc_path_arg(css_file))
+
+  # pre-processor for arguments that may depend on the name of the
+  # the input file (e.g. ones that need to copy supporting files)
+  pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir,
+                            output_dir) {
+
+    # use files_dir as lib_dir if not explicitly specified
+    if (is.null(lib_dir))
+      lib_dir <- files_dir
+
+    # extra args
+    args <- c()
+
+    # highlight
+    args <- c(args, pandoc_highlight_args(highlight, default = "pygments"))
+
+    # return additional args
+    args
+  }
+
+  # return format
+  output_format(
+    knitr = knitr_options_html(fig_width, fig_height, fig_retina, keep_md, dev),
+    pandoc = pandoc_options(to = "slidy",
+                            from = from_rmarkdown(fig_caption, md_extensions),
+                            args = args),
+    keep_md = keep_md,
+    clean_supporting = self_contained,
+    df_print = df_print,
+    pre_processor = pre_processor,
+    base_format = html_document_base(smart = smart, lib_dir = lib_dir,
+                                     self_contained = self_contained,
+                                     mathjax = mathjax,
+                                     bootstrap_compatible = TRUE,
+                                     pandoc_args = pandoc_args,
+                                     extra_dependencies = extra_dependencies,
+                                     ...))
+}
+
+
+html_dependency_slidy <- function() {
+  htmlDependency(
+    name = "slidy",
+    version = "2",
+    src = rmarkdown_system_file("rmd/slidy/Slidy2"),
+    script = "scripts/slidy.js",
+    stylesheet = "styles/slidy.css"
+  )
+}
+
diff --git a/R/stack.R b/R/stack.R
new file mode 100644
index 0000000..1ce9170
--- /dev/null
+++ b/R/stack.R
@@ -0,0 +1,28 @@
+new_stack <- function() {
+
+  .data  <- list()
+  .index <- 0
+
+  push <- function(data) {
+    .index <<- .index + 1
+    .data[[.index]] <<- data
+  }
+
+  pop <- function() {
+    if (.index == 0)
+      return(NULL)
+
+    result <- .data[[.index]]
+    .index <<- .index - 1
+    result
+  }
+
+  peek <- function() {
+    if (.index == 0)
+      return(NULL)
+    .data[[.index]]
+  }
+
+  list(push = push, pop = pop, peek = peek)
+}
+
diff --git a/R/tufte_handout.R b/R/tufte_handout.R
new file mode 100644
index 0000000..0ceed5e
--- /dev/null
+++ b/R/tufte_handout.R
@@ -0,0 +1,36 @@
+
+#' Tufte handout format (PDF)
+#'
+#' Template for creating a handout according to the style of
+#' Edward R. Tufte and Richard Feynman.
+#'
+#' @inheritParams pdf_document
+#'
+#' @export
+tufte_handout <- function(fig_width = 4,
+                          fig_height = 2.5,
+                          fig_crop = TRUE,
+                          dev = 'pdf',
+                          highlight = "default",
+                          keep_tex = FALSE,
+                          citation_package = c("none", "natbib", "biblatex"),
+                          includes = NULL,
+                          md_extensions = NULL,
+                          pandoc_args = NULL) {
+
+  # confirm we have the tufte package available
+  if (!requireNamespace("tufte", quietly = TRUE))
+    stop("The 'tufte' package is required to render the tufte_handout format.")
+
+  # delegate to the tufte package
+  tufte::tufte_handout(fig_width = fig_width,
+                       fig_height = fig_height,
+                       fig_crop = fig_crop,
+                       dev = dev,
+                       highlight = highlight,
+                       keep_tex = keep_tex,
+                       citation_package = citation_package,
+                       includes = includes,
+                       md_extensions = md_extensions,
+                       pandoc_args = pandoc_args)
+}
diff --git a/R/util.R b/R/util.R
new file mode 100644
index 0000000..8638649
--- /dev/null
+++ b/R/util.R
@@ -0,0 +1,655 @@
+#' @import stats
+
+createUniqueId <- function(bytes) {
+  paste(as.hexmode(sample(256, bytes) - 1), collapse = "")
+}
+
+is_windows <- function() {
+  identical(.Platform$OS.type, "windows")
+}
+
+is_osx <- function() {
+  Sys.info()["sysname"] == "Darwin"
+}
+
+# determine the output file for a pandoc conversion
+pandoc_output_file <- function(input, pandoc_options) {
+  to <- pandoc_options$to
+  if (!is.null(pandoc_options$ext))
+    ext <- pandoc_options$ext
+  else if (to %in% c("latex", "beamer"))
+    ext <- ".pdf"
+  else if (to %in% c("html", "html5", "s5", "slidy",
+                     "slideous", "dzslides", "revealjs"))
+    ext <- ".html"
+  else if (grepl("^markdown", to)) {
+    if (!identical(tolower(tools::file_ext(input)), "md"))
+      ext <- ".md"
+    else {
+      ext <- paste(".", strsplit(to, "[\\+\\-]")[[1]][[1]], sep = "")
+    }
+  }
+  else
+    ext <- paste(".", to, sep = "")
+  output <- paste(tools::file_path_sans_ext(input), ext, sep = "")
+  basename(output)
+}
+
+
+rmarkdown_system_file <- function(file) {
+  system.file(file, package = "rmarkdown")
+}
+
+
+#' @rdname rmarkdown_format
+#' @export
+from_rmarkdown <- function(implicit_figures = TRUE, extensions = NULL) {
+
+  # paste extensions together and remove whitespace
+  extensions <- paste0(extensions, collapse = "")
+  extensions <- gsub(" ", "", extensions)
+
+  # exclude implicit figures unless the user has added them back
+  if (!implicit_figures && !grepl("implicit_figures", extensions))
+    extensions <- paste0("-implicit_figures", extensions)
+
+  rmarkdown_format(extensions)
+}
+
+is_null_or_string <- function(text) {
+  is.null(text) || (is.character(text) && (length(text) == 1))
+}
+
+read_lines_utf8 <- function(file, encoding) {
+
+  # read the file
+  lines <- readLines(file, warn = FALSE)
+
+  # convert to utf8
+  to_utf8(lines, encoding)
+}
+
+
+to_utf8 <- function(x, encoding) {
+  # normalize encoding to iconv compatible form
+  if (identical(encoding, "native.enc"))
+    encoding <- ""
+
+  # convert to utf8
+  if (!identical(encoding, "UTF-8"))
+    iconv(x, from = encoding, to = "UTF-8")
+  else
+    mark_utf8(x)
+}
+
+# mark the encoding of character vectors as UTF-8
+mark_utf8 <- function(x) {
+  if (is.character(x)) {
+    Encoding(x) <- 'UTF-8'
+    return(x)
+  }
+  if (!is.list(x)) return(x)
+  attrs <- attributes(x)
+  res <- lapply(x, mark_utf8)
+  attributes(res) <- attrs
+  names(res) <- mark_utf8(names(res))
+  res
+}
+
+# the yaml UTF-8 bug has been fixed https://github.com/viking/r-yaml/issues/6
+# but yaml >= 2.1.14 Win/Mac binaries are not available for R < 3.2.0, so we
+# still need the mark_utf8 trick
+#' @importFrom utils packageVersion
+yaml_load_utf8 <- function(string, ...) {
+  string <- paste(string, collapse = '\n')
+  if (packageVersion('yaml') >= '2.1.14') {
+    yaml::yaml.load(string, ...)
+  } else {
+    mark_utf8(yaml::yaml.load(enc2utf8(string), ...))
+  }
+}
+
+yaml_load_file_utf8 <- function(input, ...) {
+  yaml_load_utf8(readLines(input, encoding = 'UTF-8'), ...)
+}
+
+file_name_without_shell_chars <- function(file) {
+  name <- gsub(.shell_chars_regex, '_', basename(file))
+  dir <- dirname(file)
+  if (nzchar(dir) && !identical(dir, "."))
+    file.path(dir, name)
+  else
+    name
+}
+
+tmpfile_pattern <- "rmarkdown-str"
+
+# return a string as a tempfile
+as_tmpfile <- function(str) {
+  if (length(str) > 0) {
+    str_tmpfile <- tempfile(tmpfile_pattern, fileext = ".html")
+    writeLines(str, str_tmpfile, useBytes =  TRUE)
+    str_tmpfile
+  } else {
+    NULL
+  }
+}
+
+# temp files created by as_tmpfile() cannot be immediately removed because they
+# are needed later by the pandoc conversion; we have to clean up the temp files
+# that have the pattern specified in `tmpfile_pattern` when render() exits
+clean_tmpfiles <- function() {
+  unlink(list.files(
+    tempdir(), sprintf("^%s[0-9a-f]+[.]html$", tmpfile_pattern), full.names = TRUE
+  ))
+}
+
+dir_exists <- function(x) {
+  utils::file_test('-d', x)
+}
+
+file_with_ext <- function(file, ext) {
+  paste(tools::file_path_sans_ext(file), ".", ext, sep = "")
+}
+
+
+file_with_meta_ext <- function(file, meta_ext, ext = tools::file_ext(file)) {
+  paste(tools::file_path_sans_ext(file),
+        ".", meta_ext, ".", ext, sep = "")
+}
+
+knitr_files_dir <- function(file) {
+  paste(tools::file_path_sans_ext(file), "_files", sep = "")
+}
+
+knitr_root_cache_dir <- function(file) {
+  paste(tools::file_path_sans_ext(file), "_cache", sep = "")
+}
+
+knitr_cache_dir <- function(file, pandoc_to) {
+  paste(tools::file_path_sans_ext(file), "_cache/", pandoc_to, "/", sep = "")
+}
+
+get_knitr_hook_list <- function(hook_names = NULL) {
+  if (is.null(hook_names))
+    hook_names <- c("knit_hooks", "opts_chunk", "opts_hooks", "opts_knit")
+  knitr_ns <- asNamespace("knitr")
+  hook_list <- lapply(hook_names, function(hook_name) {
+    hooks <- get(hook_name, envir = knitr_ns, inherits = FALSE)
+    hooks$get()
+  })
+  names(hook_list) <- hook_names
+  hook_list
+}
+
+set_knitr_hook_list <- function(hook_list) {
+  knitr_ns <- asNamespace("knitr")
+  enumerate(hook_list, function(hook_name, hook_value) {
+    hook <- get(hook_name, envir = knitr_ns, inherits = FALSE)
+    hook$set(hook_value)
+  })
+}
+
+highlighters <- function() {
+  c("default",
+    "tango",
+    "pygments",
+    "kate",
+    "monochrome",
+    "espresso",
+    "zenburn",
+    "haddock")
+}
+
+merge_lists <- function(base_list, overlay_list, recursive = TRUE) {
+  if (length(base_list) == 0)
+    overlay_list
+  else if (length(overlay_list) == 0)
+    base_list
+  else {
+    merged_list <- base_list
+    for (name in names(overlay_list)) {
+      base <- base_list[[name]]
+      overlay <- overlay_list[[name]]
+      if (is.list(base) && is.list(overlay) && recursive)
+        merged_list[[name]] <- merge_lists(base, overlay)
+      else {
+        merged_list[[name]] <- NULL
+        merged_list <- append(merged_list,
+                              overlay_list[which(names(overlay_list) %in% name)])
+      }
+    }
+    merged_list
+  }
+}
+
+strip_white <- function(x)
+{
+  if (!length(x))
+    return(x)
+  while (is_blank(x[1])) {
+    x = x[-1]
+    if (!length(x))
+      return(x)
+  }
+  while (is_blank(x[(n <- length(x))])) {
+    x = x[-n]
+    if (n < 2)
+      return(x)
+  }
+  x
+}
+
+is_blank <- function(x)
+{
+  if (length(x))
+    all(grepl("^\\s*$", x))
+  else TRUE
+}
+
+trim_trailing_ws <- function(x) {
+  sub("\\s+$", "", x)
+}
+
+
+# Find common base directory, throw error if it doesn't exist
+base_dir <- function(x) {
+  abs <- vapply(x, tools::file_path_as_absolute, character(1))
+
+  base <- unique(dirname(abs))
+  if (length(base) > 1) {
+    stop("Input files not all in same directory, please supply explicit wd",
+      call. = FALSE)
+  }
+
+  base
+}
+
+move_dir <- function(from, to) {
+  dir.create(dirname(to), showWarnings = FALSE)
+  file.rename(from, to)
+}
+
+# Check if two paths are the same after being normalized
+same_path <- function(path1, path2, ...) {
+  if (length(path1) * length(path2) != 1)
+    stop('The two paths must be both of length 1')
+  normalize_path(path1, ...) == normalize_path(path2, ...)
+}
+
+# Regular expression representing characters likely to be considered special by
+# the shell (require quoting/escaping)
+.shell_chars_regex <- '[ <>()|\\:&;#?*\']'
+
+# Find a program within the PATH. On OSX we need to explictly call
+# /usr/bin/which with a forwarded PATH since OSX Yosemite strips
+# the PATH from the environment of child processes
+find_program <- function(program) {
+  if (is_osx()) {
+    res <- suppressWarnings({
+      # Quote the path (so it can contain spaces, etc.) and escape any quotes
+      # and escapes in the path itself
+      sanitized_path <- gsub("\\", "\\\\", Sys.getenv("PATH"), fixed = TRUE)
+      sanitized_path <- gsub("\"", "\\\"", sanitized_path, fixed = TRUE)
+      system(paste0("PATH=\"", sanitized_path, "\" /usr/bin/which ", program),
+             intern = TRUE)
+    })
+    if (length(res) == 0)
+      ""
+    else
+      res
+  } else {
+    Sys.which(program)
+  }
+}
+
+# given a string, escape the regex metacharacters it contains:
+# regex metas are these,
+#   . \ | ( ) [ { ^ $ * + ?
+# as defined here:
+#   http://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html
+escape_regex_metas <- function(in_str) {
+  gsub("([.\\|()[{^$+?])", "\\\\\\1", in_str)
+}
+
+# call latexmk to compile tex to PDF; if not available, use a simple emulation
+latexmk <- function(file, engine, biblatex = FALSE) {
+  if (!grepl('[.]tex$', file))
+    stop("The input file '", file, "' does not appear to be a LaTeX document")
+  engine <- find_latex_engine(engine)
+  latexmk_path <- find_program('latexmk')
+  if (latexmk_path == '') {
+    # latexmk not found
+    latexmk_emu(file, engine, biblatex)
+  } else if (find_program('perl') != '' && latexmk_installed(latexmk_path)) {
+    system2_quiet(latexmk_path, c(
+      '-pdf -latexoption=-halt-on-error -interaction=batchmode',
+      paste0('-pdflatex=', shQuote(engine)), shQuote(file)
+    ), error = {
+      check_latexmk_version(latexmk_path)
+      show_latex_error(file)
+    })
+    system2(latexmk_path, '-c', stdout = FALSE)  # clean up nonessential files
+  } else {
+    latexmk_emu(file, engine, biblatex)
+  }
+}
+
+# a quick and dirty version of latexmk (should work reasonably well unless the
+# LaTeX document is extremely complicated)
+latexmk_emu <- function(file, engine, biblatex = FALSE) {
+  owd <- setwd(dirname(file))
+  on.exit(setwd(owd), add = TRUE)
+  # only use basename because bibtex may not work with full path
+  file <- basename(file)
+
+  file_with_same_base <- function(file) {
+    files <- list.files()
+    files <- files[utils::file_test('-f', files)]
+    base <- tools::file_path_sans_ext(file)
+    normalizePath(files[tools::file_path_sans_ext(files) == base])
+  }
+  # clean up aux files from LaTeX compilation
+  files1 <- file_with_same_base(file)
+  keep_log <- FALSE
+  on.exit(add = TRUE, {
+    files2 <- file_with_same_base(file)
+    files3 <- setdiff(files2, files1)
+    aux <- c(
+      'aux', 'log', 'bbl', 'blg', 'fls', 'out', 'lof', 'lot', 'idx', 'toc',
+      'nav', 'snm', 'vrb', 'ilg', 'ind'
+    )
+    if (keep_log) aux <- setdiff(aux, 'log')
+    unlink(files3[tools::file_ext(files3) %in% aux])
+  })
+
+  fileq <- shQuote(file)
+  run_engine <- function() {
+    system2_quiet(engine, c('-halt-on-error -interaction=batchmode', fileq), error = {
+      keep_log <<- TRUE
+      show_latex_error(file)
+    })
+  }
+  run_engine()
+  # generate index
+  idx <- sub('[.]tex$', '.idx', file)
+  if (file.exists(idx)) {
+    system2_quiet(find_latex_engine('makeindex'), shQuote(idx), error = {
+      stop("Failed to build the index via makeindex", call. = FALSE)
+    })
+  }
+  # generate bibliography
+  if (biblatex) {
+    aux_ext <- '.bcf'
+    bib_engine <- 'biber'
+  } else {
+    aux_ext <- '.aux'
+    bib_engine <- 'bibtex'
+  }
+  aux <- sub('[.]tex$', aux_ext, file)
+  if (file.exists(aux)) {
+    if (biblatex || require_bibtex(aux))
+      system2_quiet(find_latex_engine(bib_engine), shQuote(aux), error = {
+        stop("Failed to build the bibliography via ", bib_engine, call. = FALSE)
+      })
+  }
+  run_engine()
+  run_engine()
+}
+
+require_bibtex <- function(aux) {
+  x <- readLines(aux)
+  r <- length(grep('^\\\\citation\\{', x)) && length(grep('^\\\\bibdata\\{', x)) &&
+    length(grep('^\\\\bibstyle\\{', x))
+  if (r && is_windows()) tweak_aux(aux, x)
+  r
+}
+
+# remove the .bib extension in \bibdata{} in the .aux file, because bibtex on
+# Windows requires no .bib extension (sigh)
+tweak_aux <- function(aux, x = readLines(aux)) {
+  r <- '^\\\\bibdata\\{.+\\}\\s*$'
+  if (length(i <- grep(r, x)) == 0) return()
+  x[i] = gsub('[.]bib([,}])', '\\1', x[i])
+  writeLines(x, aux)
+}
+
+system2_quiet <- function(..., error = NULL) {
+  # run the command quietly if possible
+  res <- system2(..., stdout = FALSE, stderr = FALSE)
+  # if failed, use the normal mode
+  if (res != 0) res <- system2(...)
+  # if still fails, run the error callback
+  if (res != 0) error  # lazy evaluation
+  invisible(res)
+}
+
+# parse the LaTeX log and show error messages
+show_latex_error <- function(file) {
+  logfile <- file_with_ext(file, 'log')
+  e <- c('Failed to compile ', file, '.')
+  if (!file.exists(logfile)) stop(e, call. = FALSE)
+  x <- readLines(logfile, warn = FALSE)
+  b <- grep('^\\s*$', x)  # blank lines
+  m <- NULL
+  for (i in grep('^! ', x)) {
+    # ignore the last error message about the fatal error
+    if (grepl('==> Fatal error occurred', x[i], fixed = TRUE)) next
+    n <- b[b > i]
+    n <- if (length(n) == 0) i else min(n) - 1L
+    m <- c(m, x[i:n], '')
+  }
+  if (length(m)) {
+    message(paste(m, collapse = '\n'))
+    stop(e, ' See ', logfile, ' for more info.', call. = FALSE)
+  }
+}
+
+# check if latexmk was correctly installed; see more info at
+# https://github.com/rstudio/bookdown/issues/121
+latexmk_installed <- function(latexmk_path) {
+  if (system2_quiet(latexmk_path, '-v') == 0) return(TRUE)
+  warning('The LaTeX package latexmk was not correctly installed.', call. = FALSE)
+  if (!is_windows()) return(FALSE)
+  shell('latexmk -v')  # hopefully MiKTeX can fix it automatically
+  system2_quiet(latexmk_path, '-v') == 0
+}
+
+# check the version of latexmk
+check_latexmk_version <- function(latexmk_path = find_program('latexmk')) {
+  out <- system2(latexmk_path, '-v', stdout = TRUE)
+  reg <- '^.*Version (\\d+[.]\\d+).*$'
+  out <- grep(reg, out, value = TRUE)
+  if (length(out) == 0) return()
+  ver <- as.numeric_version(gsub(reg, '\\1', out[1]))
+  if (ver >= '4.43') return()
+  system2(latexmk_path, '-v')
+  warning(
+    'Your latexmk version seems to be too low. ',
+    'You may need to update the latexmk package or your LaTeX distribution.',
+    call. = FALSE
+  )
+}
+
+n_bytes <- function(string) {
+  nchar(string, type = "bytes")
+}
+
+starts_with_bytes <- function(string, bytes) {
+  Encoding(string) <- Encoding(bytes) <- "bytes"
+  if (n_bytes(bytes) > n_bytes(string))
+    return(FALSE)
+  substring(string, 1, n_bytes(bytes)) == bytes
+}
+
+ends_with_bytes <- function(string, bytes) {
+  Encoding(string) <- Encoding(bytes) <- "bytes"
+  if (n_bytes(bytes) > n_bytes(string))
+    return(FALSE)
+  substring(string, n_bytes(string) - n_bytes(bytes) + 1, n_bytes(string)) == bytes
+}
+
+base64_encode_object <- function(object) {
+  object <- rapply(object, unclass, how = "list")
+  json <- charToRaw(jsonlite::toJSON(object, auto_unbox = TRUE))
+  base64enc::base64encode(json)
+}
+
+base64_decode_object <- function(encoded) {
+  json <- rawToChar(base64enc::base64decode(encoded))
+  jsonlite::fromJSON(json)
+}
+
+read_file <- function(path, binary = FALSE) {
+  n <- file.info(path)$size
+  if (binary) {
+    readBin(path, raw(), n)
+  } else {
+    readChar(path, n, TRUE)
+  }
+}
+
+surround <- function(string, with) {
+  paste(with, string, with, sep = "")
+}
+
+to_html_attributes <- function(data, on_empty = "", prefix = " ") {
+
+  if (inherits(data, "html"))
+    return(data)
+
+  if (!length(data))
+    return(on_empty)
+
+  # escape attribute contents
+  escaped <- unlist(lapply(data, function(el) {
+    htmltools::htmlEscape(join(as.character(el), collapse = " "), attribute = TRUE)
+  }))
+
+  # generate html attributes as string
+  quoted <- surround(escaped, with = "\"")
+  result <- join(names(data), quoted, sep = "=", collapse = " ")
+
+  # add prefix if necessary
+  if (nzchar(prefix))
+    result <- join(prefix, result)
+
+  # mark as html and return
+  class(result) <- "html"
+  result
+
+}
+
+to_css <- function(data, on_empty = "", prefix = "") {
+
+  if (inherits(data, "html"))
+    return(data)
+
+  if (!length(data))
+    return(on_empty)
+
+  # collapse vectors in data list
+  collapsed <- unlist(lapply(data, function(el) {
+    join(el, collapse = " ")
+  }))
+
+  # paste into single string
+  joined <- join(names(data), collapsed, sep = ": ", collapse = "; ")
+
+  # add prefix
+  if (nzchar(prefix))
+    joined <- join(prefix, joined)
+
+  # return with trailing semi-colon
+  result <- join(joined, ";", sep = "")
+  class(result) <- "html"
+  result
+}
+
+rbind_list <- function(data) {
+  result <- do.call(mapply, c(c, data, USE.NAMES = FALSE, SIMPLIFY = FALSE))
+  names(result) <- names(data[[1]])
+  as.data.frame(result, stringsAsFactors = FALSE)
+}
+
+enumerate <- function(data, f, ...) {
+  lapply(seq_along(data), function(i) {
+    f(names(data)[[i]], data[[i]], ...)
+  })
+}
+
+insert <- function(vector, index, ...) {
+
+  dots <- list(...)
+  mode(dots) <- mode(vector)
+  n <- length(vector)
+
+  result <- if (index == 0) {
+    c(dots, vector)
+  } else if (index == n) {
+    c(vector, dots)
+  } else {
+    c(vector[1:index], dots, vector[(index + 1):n])
+  }
+
+  result
+}
+
+replace_binding <- function(binding, package, override) {
+  # override in namespace
+  if (!requireNamespace(package, quietly = TRUE))
+    stop(sprintf("Failed to load namespace for package '%s'", package))
+
+  namespace <- asNamespace(package)
+
+  # get reference to original binding
+  original <- get(binding, envir = namespace)
+
+  # replace the binding
+  if (is.function(override))
+    environment(override) <- namespace
+
+  do.call("unlockBinding", list(binding, namespace))
+  assign(binding, override, envir = namespace)
+  do.call("lockBinding", list(binding, namespace))
+
+  # if package is attached, override there as well
+  search_name <- paste("package", package, sep = ":")
+  if (search_name %in% search()) {
+    env <- as.environment(search_name)
+    do.call("unlockBinding", list(binding, env))
+    assign(binding, override, envir = env)
+    do.call("lockBinding", list(binding, env))
+  }
+
+  # return original
+  original
+}
+
+join <- function(..., sep = "", collapse = "") {
+  paste(..., sep = sep, collapse = collapse)
+}
+
+shell_exec <- function(cmd, intern = FALSE, wait = TRUE, ...) {
+  if (Sys.info()[["sysname"]] == "Windows")
+    shell(cmd, intern = intern, wait = wait, ...)
+  else
+    system(cmd, intern = intern, wait = wait, ...)
+}
+
+# Adjust the graphical device in chunk options: if the device from the output
+# format is png but knitr's global chunk option is not png, respect knitr's
+# option, because (1) users may knitr::opts_chunk$set(dev) (which usually means
+# they know what they are doing) before rmarkdown::render(), and we probably
+# should not override the user's choice; (2) the png device does not work on
+# certain platforms (e.g. headless servers without X11), in which case knitr
+# will set the device to svg instead of png by default in knitr:::set_html_dev,
+# and rmarkdown should also respect this setting, otherwise we will run into
+# issues like https://github.com/rstudio/rmarkdown/issues/1100
+adjust_dev <- function(opts) {
+  dev <- knitr::opts_chunk$get('dev')
+  if (identical(opts$dev, 'png') && length(dev) == 1 && dev != 'png') {
+    opts$dev <- dev
+  }
+  opts
+}
diff --git a/R/word_document.R b/R/word_document.R
new file mode 100644
index 0000000..9b4c761
--- /dev/null
+++ b/R/word_document.R
@@ -0,0 +1,108 @@
+#' Convert to an MS Word document
+#'
+#' Format for converting from R Markdown to an MS Word document.
+#'
+#' @inheritParams pdf_document
+#' @inheritParams html_document
+#'
+#' @param reference_docx Use the specified file as a style reference in
+#'   producing a docx file. For best results, the reference docx should be a
+#'   modified version of a docx file produced using pandoc. Pass "default"
+#'   to use the rmarkdown default styles.
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' See the \href{http://rmarkdown.rstudio.com/word_document_format.html}{online
+#' documentation} for additional details on using the \code{word_document} format.
+#'
+#' R Markdown documents can have optional metadata that is used to generate a
+#' document header that includes the title, author, and date. For more details
+#' see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+#'
+#' R Markdown documents also support citations. You can find more information on
+#' the markdown syntax for citations in the
+#' \href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+#' and Citations} article in the online documentation.
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#'
+#' # simple invocation
+#' render("input.Rmd", word_document())
+#'
+#' # specify an option for syntax highlighting
+#' render("input.Rmd", word_document(highlight = "zenburn"))
+#' }
+#'
+#' @export
+word_document <- function(toc = FALSE,
+                          toc_depth = 3,
+                          fig_width = 5,
+                          fig_height = 4,
+                          fig_caption = TRUE,
+                          df_print = "default",
+                          smart = TRUE,
+                          highlight = "default",
+                          reference_docx = "default",
+                          keep_md = FALSE,
+                          md_extensions = NULL,
+                          pandoc_args = NULL) {
+
+  # knitr options and hooks
+  knitr <- knitr_options(
+    opts_chunk = list(dev = 'png',
+                      dpi = 96,
+                      fig.width = fig_width,
+                      fig.height = fig_height)
+  )
+
+  # base pandoc options for all docx output
+  args <- c()
+
+  # smart quotes, etc.
+  if (smart && !pandoc2.0()) {
+    args <- c(args, "--smart")
+  } else {
+    md_extensions <- smart_extension(smart, md_extensions)
+  }
+
+  # table of contents
+  if (pandoc_available("1.14"))
+    args <- c(args, pandoc_toc_args(toc, toc_depth))
+  else
+    warning("table of contents for word_document requires pandoc >= 1.14")
+
+  # highlighting
+  if (!is.null(highlight))
+    highlight <- match.arg(highlight, highlighters())
+  args <- c(args, pandoc_highlight_args(highlight))
+
+  # reference docx
+  if (!is.null(reference_docx) && !identical(reference_docx, "default")) {
+    args <- c(args, reference_doc_arg("docx"), pandoc_path_arg(reference_docx))
+  }
+
+  # pandoc args
+  args <- c(args, pandoc_args)
+
+  # return output format
+  output_format(
+    knitr = knitr,
+    pandoc = pandoc_options(to = "docx",
+                            from = from_rmarkdown(fig_caption, md_extensions),
+                            args = args),
+    keep_md = keep_md,
+    df_print = df_print
+  )
+}
+
+reference_doc_arg <- function(type) {
+  paste0("--reference-", if (pandoc2.0()) "doc" else {
+    match.arg(type, c("docx", "odt"))
+  })
+}
+
diff --git a/R/zzz.R b/R/zzz.R
new file mode 100644
index 0000000..956449a
--- /dev/null
+++ b/R/zzz.R
@@ -0,0 +1,31 @@
+.onLoad <- function(lib, pkg) {
+  .render_context <<- new_stack()
+  if (getOption("rmarkdown.df_print", TRUE)) {
+    registerMethods(list(
+      # c(package, genname, class)
+      c("knitr", "knit_print", "data.frame")
+    ))
+  }
+}
+
+# Reusable function for registering a set of methods with S3 manually. The
+# methods argument is a list of character vectors, each of which has the form
+# c(package, genname, class).
+registerMethods <- function(methods) {
+  lapply(methods, function(method) {
+    pkg <- method[[1]]
+    generic <- method[[2]]
+    class <- method[[3]]
+    func <- get(paste(generic, class, sep = "."))
+    if (pkg %in% loadedNamespaces()) {
+      registerS3method(generic, class, func, envir = asNamespace(pkg))
+    }
+    setHook(
+      packageEvent(pkg, "onLoad"),
+      function(...) {
+        registerS3method(generic, class, func, envir = asNamespace(pkg))
+      }
+    )
+  })
+}
+
diff --git a/inst/COPYING b/inst/COPYING
new file mode 100644
index 0000000..6542260
--- /dev/null
+++ b/inst/COPYING
@@ -0,0 +1,678 @@
+The rmarkdown package is licensed to you under the GPLv3, the terms of
+which are included below. The rmarkdown package includes other open
+source software whose license terms can be found in the file NOTICE.
+
+                    GNU GENERAL PUBLIC LICENSE
+                     Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/inst/NEWS b/inst/NEWS
new file mode 100644
index 0000000..e192189
--- /dev/null
+++ b/inst/NEWS
@@ -0,0 +1,564 @@
+rmarkdown 1.8
+--------------------------------------------------------------------------------
+
+## BUG FIXES
+
+* `render_site()` does not work with `_site.yml` that does not have the `output` setting (#1189).
+
+* The variables `input` and `output` do not work in Shiny R Markdown documents (#1193).
+
+* `ioslides_presentation` fails to embed images (#1197).
+
+* With Pandoc 2.x, `github_document()` generates the wrong filename extension `.gfm-ascii_identifiers` instead of `.md`, and line height of code blocks in the HTML preview is too big (#1200).
+
+rmarkdown 1.7
+--------------------------------------------------------------------------------
+
+* Fixed an issue with `df_print: paged` where row names where not printed and
+  added support for `rownames.print` option to control when they print.
+
+* Add `smart` option for `word_document()` format.
+
+* Save render intermediates when generating beamer presentations (fixes #1106).
+
+* Fixed issues when specifying NULL/null/empty parameter values (#729 and #762).
+
+* Better error message when unable to prerender a document. (#1125)
+
+* `shiny::renderText()` does not work in Markdown section headings (#133).
+
+* The `value` argument of `pandoc_variable_arg()` can be missing now (#287).
+
+* Background colors and images are supported for ioslides presentations (#687).
+
+* HTML widgets in an Rmd document cannot be rendered if another Rmd document is
+  rendered via `rmarkdown::render()` in this document (#993).
+
+* Try harder to clean up temporary files created during `render()` (#820).
+
+* Wrong environment for evaluating R code chunks in Shiny R Markdown docs
+  (#1162, #1124).
+
+* Do not call `bibtex` to create the bibliography when there are no citations in
+  the document and the output format is `pdf_document()` with `citation_package
+  = 'natbib'` (#1113).
+
+* `render()` will stop if the output format is PDF but there are any errors
+  during building the index or bibliography (#1166).
+
+* `beamer_presentation()` doesn't work when `citation_package != 'none'` (#1161).
+
+* File-based inputs don't work in parameterized documents (#919).
+
+* rmarkdown is compatible with Pandoc 2.0 now (#1120).
+
+* `render()` with `intermediates_dir` fails with R plots (#500).
+
+* Added two new output formats `latex_document()` and `latex_fragment()` (#626).
+
+* Relative paths of images in HTML output should not be resolved to absolute
+  paths (#808).
+
+* `render_site()` does not support multiple output formats for a single Rmd (#793).
+
+* Unicode characters may be scrambled when downloading the Rmd source file using
+  the download button generated by `html_document(code_download = TRUE)` (#722).
+
+* Upgraded highlight.js from v1.1 to v9.12.0 (#988, #907).
+
+* The argument `keep_md = TRUE` actually preserves the Markdown output file from
+  `knitr::knit()` now (as documented). Previously, it generates a new Markdown
+  file by concatenating the YAML metadata (title, author, date) with the body of
+  the original Markdown output file (#450).
+
+* For `md_document()`, when `variant == 'markdown'` and `perserve_yaml = TRUE`,
+  the Pandoc argument `--standalone` should not be used (#656).
+
+rmarkdown 1.6
+--------------------------------------------------------------------------------
+
+* Fixed an issue where headers with non-ASCII text would not be linked
+  to correctly in the table of contents.
+
+* Support code folding for bash, python, sql, Rcpp, and Stan chunks.
+
+* Provide rmarkdown.pandoc.id_prefix as Knit option
+
+* Fixed two issue with `df_print: paged`, one would prevent rendering data with
+  lists of lists and the other where the column type would get cut off.
+
+* Better support for `citation_package: biblatex` in `pdf_document()` (#1062).
+
+* On certain Windows platforms, compiling LaTeX to PDF may fail because
+  `system2(stdout = FALSE)` is not supported, in which case the default `system2()`
+  will be used (#1061).
+
+* Allow paged tables to render even when page load / visibility has a long delay
+
+
+rmarkdown 1.5
+--------------------------------------------------------------------------------
+
+* Fixed an issue where code within Shiny pre-rendered documents was not
+  rendered correctly.
+
+* Add `includes` parameter to `html_fragment` format.
+
+* Use RStudio redirection URL to replace deprecated MathJax CDN
+
+
+rmarkdown 1.4
+--------------------------------------------------------------------------------
+
+* `data.table` expressions involving `:=` are no longer automatically
+  printed within R Markdown documents. (#829)
+
+* Fix #910: the extra_dependencies argument of pdf_document() does not work when
+  no code chunks contain LaTeX dependencies.
+
+* The extra_dependencies of pdf_document() can also take a character vector of
+  LaTeX package names, or a named list of LaTeX package options (with names
+  being package names), which makes it much easier to express LaTeX dependencies
+  via YAML.
+
+* Automatically ignore packrat directory for render_site
+
+* Fix #943: escape end tags in shiny_prerendered code contexts
+
+* Add support for sticky tabs in html_document via tabset-sticky class
+
+* Process Rmd files with lowercase extension (.rmd) in render_site
+
+* Fix stack space consumption issues with large JS payloads in chunks
+
+* Add `section_divs` argument to html_document and html_fragment to control
+  generation of section tags/divs.
+
+* Remove data-context="(data|server|server-start)" chunks from HTML served
+  to client in shiny_prerendered
+
+
+rmarkdown 1.3
+--------------------------------------------------------------------------------
+
+* Fix v1.2 regression in ordering of CSS for ioslides_presentation.
+
+* Fix rendering of pagedtables within html_notebook format.
+
+* Ensure that html_prerendered UI is never cached.
+
+* Add `citeproc` argument to YAML header; controls whether pandoc-citeproc is used (#831)
+
+
+rmarkdown 1.2
+--------------------------------------------------------------------------------
+
+* Add support for df_print to handle additional dplyr classes: grouped_df,
+  rowwise_df and tbl_sql.
+
+* Add new `runtime: shiny_prerendered` mode for interactive documents.
+
+* Prepend "section-" to ids in runtime: shiny[_prerendered] to eliminate
+  potential conflicts with shiny output ids
+
+* Use html_dependencies for highlight.js, pagedtables, slidy, ioslides,
+  & navigation (improved dependency behavior for runtime: shiny[_prerendered])
+
+* Serialize runtime: shiny[_prerendered] dependencies to JSON rather than .rds
+
+* ioslides: check for null before concatenating attr["class"] (#836)
+
+* Add rmarkdown.onKnit/onKnitCompleted package hooks
+
+* Non-ASCII keys in yaml file should be marked to UTF8 as well, when read
+  into R as the name of a list (#841)
+
+* Remove key-column special-case left alignment in pagedtables (#829)
+
+* Replace backslashes in floating TOC headings (#849)
+
+* Suggests rather than Imports for tibble (R 3.0 compatibility)
+
+* Add `paged_table` function for printing paged tables within HTML documents
+
+* Support `{.active}` attribute for setting initially active tab (#789)
+
+* Add `knit_root_dir` argument to `render()` and YAML header, a convenience
+  for setting knitr's root.dir option
+
+* Improve alignment of text in sub-topics for floating TOC
+
+* Bibliography file paths in YAML containing forward slashes could not be
+  rendered (#875)
+
+rmarkdown 1.1
+--------------------------------------------------------------------------------
+
+* Fixed an issue where attempts to render an R Notebook could fail if the
+  path contained multibyte characters.
+
+* Fixed an issue where the default Beamer template did not provide vertical
+  padding between paragraphs with certain versions of pandoc (<= 1.17.2).
+
+* Try to install latexmk automatically on Windows
+
+* Added `df_print` option to html_document format for optionally printing data
+  frames using `knitr::kable`, the `tibble` package, or an arbitrary function
+
+* Fix for render_site not showing Chinese characters correctly
+
+* Fix for ignoring knit_meta that is explicitly passed to render
+
+* Parameter editing: don't allow NULL to overwrite previous state
+
+* Parameter editing: fix incorrect name for parameters with expressions
+
+* Parameter editing: allow multiple values when the parameter is configured
+  to use a "multiple" selector
+
+* Switched the order in which format dependencies are added for
+  `html_document` so that `extra_dependencies` are added at the end, after
+  bootstrap, etc. (#737)
+
+* `pdf_document(keep_tex = TRUE)` will generate the .tex document even if PDF
+  conversion fails (#779).
+
+* Move latex header includes to just before \begin{document}
+
+* Special 'global' chunk label for runtime: shiny which designates
+  a chunk to be run once and only once in the global environment
+  (startup performance improvement for multi-user shiny documents)
+
+* Ensure supporting files are writeable (#800)
+
+* Make the "show code" buttons more CSS-friendly (#795)
+
+* Exclude `output_dir` from site files (#803)
+
+* Export `navbar_html` and `yaml_front_matter` functions
+
+
+rmarkdown 1.0
+--------------------------------------------------------------------------------
+
+* `toc_float` no longer automatically sets `toc = TRUE`
+
+* Added an argument `error` to `pandoc_available()` to signal an error when (if
+  `error = TRUE`) pandoc with the required version is not found.
+
+* Added `html_notebook` format for creating HTML documents that include source
+  code and output.
+
+* Added `resolve_output_format` function (useful for front ends that need to
+  mirror the default format resolution logic of `render`).
+
+* Added `code_download` option to `html_document` to provide an option to
+  embed a downloadable copy of the Rmd source code within the document.
+
+* Added `slide_level` option to ioslides_presentation to set the level of
+  heading used for individual slides.
+
+* Added `hard_line_breaks` option to `github_document` to deal with change
+  in behavior of GitHub's markdown renderer with respect to line breaks.
+
+* Use "markdown_strict" rather than "markdown" for `pandoc_self_contained_html`
+  when pandoc >= 1.17 (pandoc hanging bug was fixed in this version)
+
+* Default highlighting engine for `html_document` now highlights bash, c++,
+  css, ini, javascript, perl, python, r, ruby, scala, stan and xml
+
+* Added `print` sub-option to `toc_float` to control whether the table of
+  contents appears when user prints out the HTML page.
+
+* Added `readme` option to `html_vignette` which automatically creates a
+  package level README.md (for GitHub) in addition to rendering the vignette.
+
+* Support for `keep_md` in `html_vignette` format.
+
+* Try to install the latexmk package automatically on Windows if the executable
+  latexmk.exe exists.
+
+rmarkdown 0.9.6
+--------------------------------------------------------------------------------
+
+* Ability to set `opts_hooks` in `knitr_options()` (#672)
+
+* Added `render_site` and related functions for rendering collections of
+  documents within a directory as a website.
+
+* Ability to define html_document navigation bar using simple yaml format.
+
+* Added `pre_knit` and `post_knit` hooks for output formats.
+
+* Discover `LaTeX` dependencies and add them to the `.tex` preamble (#647)
+
+* Added new `all_output_formats` function to enumerate all output
+  formats registered for an Rmd.
+
+* Change `fig_caption` default to TRUE for all formats
+
+* Change `fig_retina` to 2 for HTML formats (no longer contingent on `fig_caption`)
+
+* Ensure pandoc binary exists before binding to pandoc directory (#632)
+
+* Handle relative paths for 'default_output_format' (#638)
+
+* Eliminate duplicate viewport meta tag from html_document
+
+* Added biblatex biblio-style support to the LaTeX template for Pandoc 1.15.2 (#643)
+
+* Allow override of header font-size in html_document custom css (#652)
+
+* Fix for horizontal scrollbars appearing w/ code folding (#654)
+
+* Specifying `toc_float` in `html_document` now automatically sets `toc = TRUE`
+
+* Enable per-header opt-out of `toc-float` via {.toc-ignore} attribute
+
+* Correctly handle soft line breaks in ioslides_presentation (#661)
+
+* Don't use text-muted for code folding btns (text visibility in non-default themes)
+
+* Fix for rendering non-HTML formats from .md files (resolve runtime before knit)
+
+* `html_dependency_bootstrap` now accepts theme = "default" argument
+
+* Use pandoc 1.17.0.2 compatible LaTeX template when pandoc >= 1.17.0.2
+
+* Support custom template for `ioslides_presentation`
+
+* Added `analytics` option for `ioslides_presentation` for Google Analytics
+
+* Removed the extra tag `<p></p>` around HTML output (typically generated by htmltools) from code chunks, to avoid invalid HTML like `<p><div>...</div><p>` (#685)
+
+rmarkdown 0.9.5
+--------------------------------------------------------------------------------
+
+* Added odt_document format for OpenDocument Text output
+
+* Added rtf_document format for Rich Text Format output
+
+* Added github_document format for GitHub Flavored Markdown output
+
+* Only apply white background for themed HTML documents (#588)
+
+* Added <meta name="viewport" content="width=device-width, initial-scale=1"> to
+  the default HTML template to make it work better with mobile browsers. (#589)
+
+* Specify --filter pandoc-citeproc after custom pandoc args
+
+* Long lines in code blocks will be wrapped in the `html_vignette()` output (#595)
+
+* Added new arguments `run_pandoc = TRUE` and `knit_meta = NULL` to `render()`.
+  See the help page of `render` for details. (#594)
+
+* The `tufte_handout` format now delegates to the `tufte` package and no longer
+  provides a base template.
+
+* Use pandoc 1.15.2 compatible LaTeX template when pandoc >= 1.15.2
+
+* Fix issue with Beamer template and pandoc 1.15.2
+
+* Updated embedded JQuery to v1.11.3 and Bootstrap to v3.3.5.
+
+* Expose core HTML dependencies for use by custom R Markdown formats.
+
+* New `html_document` themes: "lumen", "paper", "sandstone", "simplex", & "yeti".
+
+* Ability to include bootstrap navbar for multi-page `html_document` websites
+
+* Added support for `abstract` field to `html_document` format
+
+* Added support for floating table of contents (via tocify) to `html_document`
+
+* Added support for tabsets via use of {.tabset} class on top-level headings
+
+* Added support for folding/unfolding of R code chunks in `html_document`
+
+* Support `url` references in CSS files for `runtime: shiny`
+
+* Change name of common options file to `_output.yml`
+
+* Tweak pandoc conversion used in `pandoc_self_contained_html` to prevent
+  hanging with large script elements (use "markdown" rather than
+  "markdown-strict" as input format)
+
+* The filename extension .bib will be removed before bibliography files are
+  passed to Pandoc when the output is LaTeX/PDF and the citation package natbib
+  or biblatex is used on Windows. This is because bibtex in MikTeX will always
+  add the extension .bib to bibliography files, e.g. it treats foo.bib as
+  foo.bib.bib. (#623)
+
+* Render Shiny documents in a clean environment; fixes issue in which code in
+  Shiny documents could access internal R Markdown state
+
+
+rmarkdown 0.9.2
+--------------------------------------------------------------------------------
+
+* Added a fix to #580 for Windows users.
+
+
+rmarkdown 0.9.1
+--------------------------------------------------------------------------------
+
+* Fix for a bug causing certain files to be deleted as intermediate files. (#580)
+
+* PDF/LaTeX output no longer uses natbib as the citation package by default. If
+  you do want to use natbib or biblatex, you may still use the argument
+  citation_package = 'natbib' or 'biblatex'. (#577)
+
+rmarkdown 0.9
+--------------------------------------------------------------------------------
+
+* Fix for JS exception in slidy_presentation when served from the filesystem
+  (don't call pushState for file:// urls)
+
+* Escape single quotes in file paths
+
+* Fix for missing resources when rendering a filename with shell characters
+
+* For PDF/LaTeX output, citations are processed via natbib or biblatex instead
+  of pandoc-citeproc. The ciation package natbib or biblatex can be chosen using
+  the argument `citation_package` in `pdf_document()`, `beamer_presentation()`,
+  and `tufte_handout()`. LaTeX is compiled to PDF via latexmk
+  (https://www.ctan.org/pkg/latexmk/); if it is not installed, a simple
+  emulation will be used (run pdflatex/xelatex/lualatex, bibtex, and makeindex
+  a few times). You are recommended to install latexmk, and please note latexmk
+  requires a Perl installation (this is important especially for Windows users).
+
+* Always use the graphics package for PDF output
+
+* Fix for the error "cannot change value of locked binding for 'metadata'" when
+  one call of rmarkdown::render() is nested in another one (#248)
+
+* Fix for an issue causing image paths to be rendered incorrectly in Windows
+  when rendering an `html_document` with `self_contained: false` and a path is
+  passed in argument `output_dir`. (#551)
+
+* Add always_allow_html option for preventing errors when html_dependencies are
+  rendered in non-HTML formats (e.g. pdf_document or word_document).
+
+* Fix for an issue causing resources not to be discovered in some documents
+  containing an empty quoted string (`""`) in an R chunk.
+
+
+rmarkdown 0.8.1
+--------------------------------------------------------------------------------
+
+* Support for table of contents in word_document (requires pandoc >= 1.14)
+
+* Support for opts_template in knitr options
+
+* Don't implicitly discover directories when scanning for dependent resources
+
+* Fix for slide numbers not showing up in ioslides when served from
+  the filesystem (don't call pushState for file:// urls)
+
+* Remove inlining of bootstrap CSS (was workaround for bug now fixed in pandoc)
+
+* Allow specifying an R file in calls to find_all_resources
+
+rmarkdown 0.8
+--------------------------------------------------------------------------------
+
+* Add support for keep_md to word_document
+
+* Increase pandoc stack size to 512M (often required for base64 encoding
+  e.g. larger embedded leaflet maps). Stack size can also be controlled
+  by the pandoc.stack.size option.
+
+* Allow YAML front matter to be terminated with ...
+
+* Automatically generate a user-interface (via a Shiny application) for
+  user specification of values in parameterized reports.
+
+* Add tightlist macro for compatibility with pandoc >= 1.14
+
+* Bugfix: Don't merge render params recursively with knit_params
+
+* Bugfix: Handle slashes correctly on Windows for slidy_presentation
+  when self_contained = FALSE
+
+
+rmarkdown 0.7
+--------------------------------------------------------------------------------
+
+* Add latex_engine option to beamer_presentation format
+
+* Ensure that when LANG=en_US pandoc receives en_US.UTF-8 (prevent hang)
+
+* Generate MathJax compatible output when using html_fragment format.
+
+* Use pandoc built-in template for Beamer
+
+* Use pandoc 1.14 compatible LaTeX template when pandoc >= 1.14
+
+* Inline bootstrap.min.css to workaround pandoc 1.14 base64 encoding issue
+
+* Add support for discovering references to external resources when the
+  document output format is PDF
+
+* Fix several issues causing pandoc errors when an intermediates directory is
+  used, including during render for Shiny documents
+
+
+rmarkdown 0.6
+--------------------------------------------------------------------------------
+
+* Support for parameterized reports. Parameter names and default values are
+  defined in YAML and can be specified via the 'params' argument to the
+  render function
+
+* 'md_extensions' option to enable/disable markdown extensions for input files
+
+* Automatically discover and include dependent resources (e.g. images, css,
+  etc.) for interactive documents.
+
+* Added pandoc_version function.
+
+* Use VignetteEncoding directive in html_vignette format
+
+* Fix issues related to use of non-ASCII characters in ioslides_presentation
+
+* Non-ASCII characters in the YAML data are not marked with the UTF-8 encoding
+  when they are read into R, so character strings in `rmarkdown::metadata` may
+  be displayed incorrectly (#420)
+
+* Various improvements to tufte_handout format
+
+
+rmarkdown 0.5.1
+--------------------------------------------------------------------------------
+
+* Add 'dev' option to output formats to specify output device for figures
+
+* Enable use of footnotes in titles of LaTeX documents
+
+* Various improvements related to directory detection/handling on Windows
+
+
+rmarkdown 0.4.2
+--------------------------------------------------------------------------------
+
+* Sync to the latest LaTeX and Beamer templates from pandoc-templates
+
+* Switched from the Bootstrap 2 web framework to Bootstrap 3. This is designed
+  to work with Shiny >= 0.10.3, which has made the same switch
+
+* Add CSS to restore responsive image behavior from Bootstrap 2
+
+* Use a more subtle treatment for inline code in Bootstrap themed documents
+
+* Improved support for multiple authors in ioslides
+
+* Workaround for poor rendering of ioslides multi-columns lists in Safari 8
+
+* Serve index.html as fallback default file for rmarkdown::run
+
+
+rmarkdown 0.3.11
+--------------------------------------------------------------------------------
+
+Initial release to CRAN
+
diff --git a/inst/NOTICE b/inst/NOTICE
new file mode 100644
index 0000000..c2c4e85
--- /dev/null
+++ b/inst/NOTICE
@@ -0,0 +1,565 @@
+The rmarkdown package inludes other open source software components. The
+following is a list of these components (full copies of the license agreements
+used by these components are included below):
+
+- jQuery
+- Bootstrap
+- Bootswatch
+- highlight.js
+- Google Web Fonts
+- Slidy
+- tufte-latex
+
+jQuery License
+----------------------------------------------------------------------
+
+Copyright (c) 2012 jQuery Foundation and other contributors,
+http://jquery.com/
+
+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.
+
+
+Bootstrap 
+----------------------------------------------------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2011-2014 Twitter, Inc
+
+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.
+
+
+Bootswatch 
+----------------------------------------------------------------------
+
+The MIT License (MIT)
+
+Copyright 2014 Thomas Park
+
+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.
+
+
+tufte latex and Open Sans Web Font License
+----------------------------------------------------------------------
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+highlight.js
+----------------------------------------------------------------------
+
+Copyright (c) 2006, Ivan Sagalaev
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of highlight.js nor the names of its contributors
+      may be used to endorse or promote products derived from this software
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Lato, News Cycle, Source Sans Pro, and Raleway Web Fonts
+----------------------------------------------------------------------
+
+SIL OPEN FONT LICENSE
+
+Version 1.1 - 26 February 2007
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting — in part or in whole — any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+
+Ubuntu Web Font
+----------------------------------------------------------------------
+
+-------------------------------
+UBUNTU FONT LICENCE Version 1.0
+-------------------------------
+
+PREAMBLE
+This licence allows the licensed fonts to be used, studied, modified and
+redistributed freely. The fonts, including any derivative works, can be
+bundled, embedded, and redistributed provided the terms of this licence
+are met. The fonts and derivatives, however, cannot be released under
+any other licence. The requirement for fonts to remain under this
+licence does not require any document created using the fonts or their
+derivatives to be published under this licence, as long as the primary
+purpose of the document is not to be a vehicle for the distribution of
+the fonts.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this licence and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Original Version" refers to the collection of Font Software components
+as received under this licence.
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to
+a new environment.
+
+"Copyright Holder(s)" refers to all individuals and companies who have a
+copyright ownership of the Font Software.
+
+"Substantially Changed" refers to Modified Versions which can be easily
+identified as dissimilar to the Font Software by users of the Font
+Software comparing the Original Version with the Modified Version.
+
+To "Propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification and with or without charging
+a redistribution fee), making available to the public, and in some
+countries other activities as well.
+
+PERMISSION & CONDITIONS
+This licence does not grant any rights under trademark law and all such
+rights are reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of the Font Software, to propagate the Font Software, subject to
+the below conditions:
+
+1) Each copy of the Font Software must contain the above copyright
+notice and this licence. These can be included either as stand-alone
+text files, human-readable headers or in the appropriate machine-
+readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+2) The font name complies with the following:
+(a) The Original Version must retain its name, unmodified.
+(b) Modified Versions which are Substantially Changed must be renamed to
+avoid use of the name of the Original Version or similar names entirely.
+(c) Modified Versions which are not Substantially Changed must be
+renamed to both (i) retain the name of the Original Version and (ii) add
+additional naming elements to distinguish the Modified Version from the
+Original Version. The name of such Modified Versions must be the name of
+the Original Version, with "derivative X" where X represents the name of
+the new work, appended to that name.
+
+3) The name(s) of the Copyright Holder(s) and any contributor to the
+Font Software shall not be used to promote, endorse or advertise any
+Modified Version, except (i) as required by this licence, (ii) to
+acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with
+their explicit written permission.
+
+4) The Font Software, modified or unmodified, in part or in whole, must
+be distributed entirely under this licence, and must not be distributed
+under any other licence. The requirement for fonts to remain under this
+licence does not affect any document created using the Font Software,
+except any version of the Font Software extracted from a document
+created using the Font Software may only be distributed under this
+licence.
+
+TERMINATION
+This licence becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
+DEALINGS IN THE FONT SOFTWARE.
+
+
+Slidy
+----------------------------------------------------------------------
+
+Copyright (c) 2005-2013 W3C (r) (MIT, ERCIM, Keio, Beihang)
+
+W3C SOFTWARE NOTICE AND LICENSE
+
+This work (and included software, documentation such as READMEs, or
+other related items) is being provided by the copyright holders under
+the following license.
+
+License
+
+By obtaining, using and/or copying this work, you (the licensee)
+agree that you have read, understood, and will comply with the
+following terms and conditions.
+
+Permission to copy, modify, and distribute this software and its
+documentation, with or without modification, for any purpose and
+without fee or royalty is hereby granted, provided that you include
+the following on ALL copies of the software and documentation or
+portions thereof, including modifications:
+
+- The full text of this NOTICE in a location viewable to users of
+the redistributed or derivative work.
+
+- Any pre-existing intellectual property disclaimers, notices, or
+terms and conditions. If none exist, the W3C Software Short Notice
+should be included (hypertext is preferred, text is permitted)
+within the body of any redistributed or derivative code.
+
+Notice of any changes or modifications to the files, including
+the date changes were made. (We recommend you provide URIs to the
+location from which the code is derived.)
+
+Disclaimers
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT
+HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR
+FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE
+OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS,
+COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.
+
diff --git a/inst/rmarkdown/templates/github_document/resources/default.md b/inst/rmarkdown/templates/github_document/resources/default.md
new file mode 100644
index 0000000..5d6e74b
--- /dev/null
+++ b/inst/rmarkdown/templates/github_document/resources/default.md
@@ -0,0 +1,28 @@
+$if(title)$
+$title$
+================
+$endif$
+$if(author)$
+$author$
+$endif$
+$if(date)$
+$date$
+$endif$
+
+$for(header-includes)$
+$header-includes$
+
+$endfor$
+$for(include-before)$
+$include-before$
+
+$endfor$
+$if(toc)$
+$toc$
+
+$endif$
+$body$
+$for(include-after)$
+
+$include-after$
+$endfor$
diff --git a/inst/rmarkdown/templates/github_document/resources/github.css b/inst/rmarkdown/templates/github_document/resources/github.css
new file mode 100644
index 0000000..44f92a6
--- /dev/null
+++ b/inst/rmarkdown/templates/github_document/resources/github.css
@@ -0,0 +1,692 @@
+
+
+ at font-face {
+  font-family: octicons-link;
+  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAA [...]
+}
+
+body {
+  -webkit-text-size-adjust: 100%;
+  text-size-adjust: 100%;
+  color: #333;
+  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 16px;
+  line-height: 1.6;
+  word-wrap: break-word;
+}
+
+a {
+  background-color: transparent;
+}
+
+a:active,
+a:hover {
+  outline: 0;
+}
+
+strong {
+  font-weight: bold;
+}
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+img {
+  border: 0;
+}
+
+hr {
+  box-sizing: content-box;
+  height: 0;
+}
+
+pre {
+  overflow: auto;
+}
+
+code,
+kbd,
+pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+input {
+  color: inherit;
+  font: inherit;
+  margin: 0;
+}
+
+html input[disabled] {
+  cursor: default;
+}
+
+input {
+  line-height: normal;
+}
+
+input[type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+td,
+th {
+  padding: 0;
+}
+
+* {
+  box-sizing: border-box;
+}
+
+input {
+  font: 13px / 1.4 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+}
+
+a {
+  color: #4078c0;
+  text-decoration: none;
+}
+
+a:hover,
+a:active {
+  text-decoration: underline;
+}
+
+hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #ddd;
+}
+
+hr:before {
+  display: table;
+  content: "";
+}
+
+hr:after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin-top: 15px;
+  margin-bottom: 15px;
+  line-height: 1.1;
+}
+
+h1 {
+  font-size: 30px;
+}
+
+h2 {
+  font-size: 21px;
+}
+
+h3 {
+  font-size: 16px;
+}
+
+h4 {
+  font-size: 14px;
+}
+
+h5 {
+  font-size: 12px;
+}
+
+h6 {
+  font-size: 11px;
+}
+
+blockquote {
+  margin: 0;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+ol ol,
+ul ol {
+  list-style-type: lower-roman;
+}
+
+ul ul ol,
+ul ol ol,
+ol ul ol,
+ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+dd {
+  margin-left: 0;
+}
+
+code {
+  font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
+}
+
+.select::-ms-expand {
+  opacity: 0;
+}
+
+.octicon {
+  font: normal normal normal 16px/1 octicons-link;
+  display: inline-block;
+  text-decoration: none;
+  text-rendering: auto;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+.octicon-link:before {
+  content: '\f05c';
+}
+
+.markdown-body:before {
+  display: table;
+  content: "";
+}
+
+.markdown-body:after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.anchor {
+  display: inline-block;
+  padding-right: 2px;
+  margin-left: -18px;
+}
+
+.anchor:focus {
+  outline: none;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin-top: 1em;
+  margin-bottom: 16px;
+  font-weight: bold;
+  line-height: 1.4;
+}
+
+h1 .octicon-link,
+h2 .octicon-link,
+h3 .octicon-link,
+h4 .octicon-link,
+h5 .octicon-link,
+h6 .octicon-link {
+  color: #000;
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+h1:hover .anchor,
+h2:hover .anchor,
+h3:hover .anchor,
+h4:hover .anchor,
+h5:hover .anchor,
+h6:hover .anchor {
+  text-decoration: none;
+}
+
+h1:hover .anchor .octicon-link,
+h2:hover .anchor .octicon-link,
+h3:hover .anchor .octicon-link,
+h4:hover .anchor .octicon-link,
+h5:hover .anchor .octicon-link,
+h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+h1 {
+  padding-bottom: 0.3em;
+  font-size: 2.25em;
+  line-height: 1.2;
+  border-bottom: 1px solid #eee;
+}
+
+h1 .anchor {
+  line-height: 1;
+}
+
+h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.75em;
+  line-height: 1.225;
+  border-bottom: 1px solid #eee;
+}
+
+h2 .anchor {
+  line-height: 1;
+}
+
+h3 {
+  font-size: 1.5em;
+  line-height: 1.43;
+}
+
+h3 .anchor {
+  line-height: 1.2;
+}
+
+h4 {
+  font-size: 1.25em;
+}
+
+h4 .anchor {
+  line-height: 1.2;
+}
+
+h5 {
+  font-size: 1em;
+}
+
+h5 .anchor {
+  line-height: 1.1;
+}
+
+h6 {
+  font-size: 1em;
+  color: #777;
+}
+
+h6 .anchor {
+  line-height: 1.1;
+}
+
+p,
+blockquote,
+ul,
+ol,
+dl,
+table,
+pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+hr {
+  height: 4px;
+  padding: 0;
+  margin: 16px 0;
+  background-color: #e7e7e7;
+  border: 0 none;
+}
+
+ul,
+ol {
+  padding-left: 2em;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+li>p {
+  margin-top: 16px;
+}
+
+dl {
+  padding: 0;
+}
+
+dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: bold;
+}
+
+dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+blockquote {
+  padding: 0 15px;
+  color: #777;
+  border-left: 4px solid #ddd;
+}
+
+blockquote>:first-child {
+  margin-top: 0;
+}
+
+blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+  word-break: normal;
+  word-break: keep-all;
+}
+
+table th {
+  font-weight: bold;
+}
+
+table th,
+table td {
+  padding: 6px 13px;
+  border: 1px solid #ddd;
+}
+
+table tr {
+  background-color: #fff;
+  border-top: 1px solid #ccc;
+}
+
+table tr:nth-child(2n) {
+  background-color: #f8f8f8;
+}
+
+img {
+  max-width: 100%;
+  box-sizing: content-box;
+  background-color: #fff;
+}
+
+code {
+  padding: 0;
+  padding-top: 0.2em;
+  padding-bottom: 0.2em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(0,0,0,0.04);
+  border-radius: 3px;
+}
+
+code:before,
+code:after {
+  letter-spacing: -0.2em;
+  content: "\00a0";
+}
+
+pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.highlight {
+  margin-bottom: 16px;
+}
+
+.highlight pre,
+pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f7f7f7;
+  border-radius: 3px;
+}
+
+.highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+pre {
+  word-wrap: normal;
+}
+
+pre code {
+  display: inline;
+  max-width: initial;
+  padding: 0;
+  margin: 0;
+  overflow: initial;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+pre code:before,
+pre code:after {
+  content: normal;
+}
+
+kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #555;
+  vertical-align: middle;
+  background-color: #fcfcfc;
+  border: solid 1px #ccc;
+  border-bottom-color: #bbb;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #bbb;
+}
+
+.pl-c {
+  color: #969896;
+}
+
+.pl-c1,
+.pl-s .pl-v {
+  color: #0086b3;
+}
+
+.pl-e,
+.pl-en {
+  color: #795da3;
+}
+
+.pl-s .pl-s1,
+.pl-smi {
+  color: #333;
+}
+
+.pl-ent {
+  color: #63a35c;
+}
+
+.pl-k {
+  color: #a71d5d;
+}
+
+.pl-pds,
+.pl-s,
+.pl-s .pl-pse .pl-s1,
+.pl-sr,
+.pl-sr .pl-cce,
+.pl-sr .pl-sra,
+.pl-sr .pl-sre {
+  color: #183691;
+}
+
+.pl-v {
+  color: #ed6a43;
+}
+
+.pl-id {
+  color: #b52a1d;
+}
+
+.pl-ii {
+  background-color: #b52a1d;
+  color: #f8f8f8;
+}
+
+.pl-sr .pl-cce {
+  color: #63a35c;
+  font-weight: bold;
+}
+
+.pl-ml {
+  color: #693a17;
+}
+
+.pl-mh,
+.pl-mh .pl-en,
+.pl-ms {
+  color: #1d3e81;
+  font-weight: bold;
+}
+
+.pl-mq {
+  color: #008080;
+}
+
+.pl-mi {
+  color: #333;
+  font-style: italic;
+}
+
+.pl-mb {
+  color: #333;
+  font-weight: bold;
+}
+
+.pl-md {
+  background-color: #ffecec;
+  color: #bd2c00;
+}
+
+.pl-mi1 {
+  background-color: #eaffea;
+  color: #55a532;
+}
+
+.pl-mdr {
+  color: #795da3;
+  font-weight: bold;
+}
+
+.pl-mo {
+  color: #1d3e81;
+}
+
+kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #555;
+  vertical-align: middle;
+  background-color: #fcfcfc;
+  border: solid 1px #ccc;
+  border-bottom-color: #bbb;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #bbb;
+}
+
+.task-list-item {
+  list-style-type: none;
+}
+
+.task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.task-list-item input {
+  margin: 0 0.35em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+:checked+.radio-label {
+  z-index: 1;
+  position: relative;
+  border-color: #4078c0;
+}
+
+.sourceLine {
+  display: inline-block;
+}
+
+code .kw { color: #000000; }
+code .dt { color: #ed6a43; }
+code .dv { color: #009999; }
+code .bn { color: #009999; }
+code .fl { color: #009999; }
+code .ch { color: #009999; }
+code .st { color: #183691; }
+code .co { color: #969896; }
+code .ot { color: #0086b3; }
+code .al { color: #a61717; }
+code .fu { color: #63a35c;  }
+code .er { color: #a61717; background-color: #e3d2d2; }
+code .wa { color: #000000; }
+code .cn { color: #008080;  }
+code .sc { color: #008080; }
+code .vs { color: #183691; }
+code .ss { color: #183691; }
+code .im { color: #000000; }
+code .va {color: #008080; }
+code .cf { color: #000000;  }
+code .op { color: #000000; }
+code .bu { color: #000000; }
+code .ex { color: #000000; }
+code .pp { color: #999999; }
+code .at { color: #008080; }
+code .do { color: #969896; }
+code .an { color: #008080; }
+code .cv { color: #008080; }
+code .in { color: #008080; }
diff --git a/inst/rmarkdown/templates/github_document/resources/preview.html b/inst/rmarkdown/templates/github_document/resources/preview.html
new file mode 100644
index 0000000..d16adb5
--- /dev/null
+++ b/inst/rmarkdown/templates/github_document/resources/preview.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<html xmlns="http://www.w3.org/1999/xhtml"$if(lang)$ lang="$lang$" xml:lang="$lang$"$endif$>
+
+<head>
+
+<meta charset="utf-8">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="pandoc" />
+<meta name="viewport" content="width=device-width, initial-scale=1">
+
+<link rel="stylesheet" href="$github-markdown-css$">
+<style>
+body {
+  box-sizing: border-box;
+  min-width: 200px;
+  max-width: 980px;
+  margin: 0 auto;
+  padding: 45px;
+  padding-top: 0px;
+}
+</style>
+
+</head>
+
+<body>
+
+$body$
+
+</body>
+</html>
diff --git a/inst/rmarkdown/templates/github_document/skeleton/skeleton.Rmd b/inst/rmarkdown/templates/github_document/skeleton/skeleton.Rmd
new file mode 100644
index 0000000..2c57bac
--- /dev/null
+++ b/inst/rmarkdown/templates/github_document/skeleton/skeleton.Rmd
@@ -0,0 +1,30 @@
+---
+title: "Untitled"
+output: github_document
+---
+
+```{r setup, include=FALSE}
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+## GitHub Documents
+
+This is an R Markdown format used for publishing markdown documents to GitHub. When you click the **Knit** button all R code chunks are run and a markdown file (.md) suitable for publishing to GitHub is generated.
+
+## Including Code
+
+You can include R code in the document as follows:
+
+```{r cars}
+summary(cars)
+```
+
+## Including Plots
+
+You can also embed plots, for example:
+
+```{r pressure, echo=FALSE}
+plot(pressure)
+```
+
+Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.
diff --git a/inst/rmarkdown/templates/github_document/template.yaml b/inst/rmarkdown/templates/github_document/template.yaml
new file mode 100644
index 0000000..dbc7e33
--- /dev/null
+++ b/inst/rmarkdown/templates/github_document/template.yaml
@@ -0,0 +1,4 @@
+name: GitHub Document (Markdown)
+description: >
+  Template for documents to be published as GitHub Flavored Markdown.
+create_dir: false
diff --git a/inst/rmarkdown/templates/html_vignette/resources/vignette.css b/inst/rmarkdown/templates/html_vignette/resources/vignette.css
new file mode 100644
index 0000000..8e48a47
--- /dev/null
+++ b/inst/rmarkdown/templates/html_vignette/resources/vignette.css
@@ -0,0 +1,206 @@
+body {
+  background-color: #fff;
+  margin: 1em auto;
+  max-width: 700px;
+  overflow: visible;
+  padding-left: 2em;
+  padding-right: 2em;
+  font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.35;
+}
+
+#header {
+  text-align: center;
+}
+
+#TOC {
+  clear: both;
+  margin: 0 0 10px 10px;
+  padding: 4px;
+  width: 400px;
+  border: 1px solid #CCCCCC;
+  border-radius: 5px;
+
+  background-color: #f6f6f6;
+  font-size: 13px;
+  line-height: 1.3;
+}
+  #TOC .toctitle {
+    font-weight: bold;
+    font-size: 15px;
+    margin-left: 5px;
+  }
+
+  #TOC ul {
+    padding-left: 40px;
+    margin-left: -1.5em;
+    margin-top: 5px;
+    margin-bottom: 5px;
+  }
+  #TOC ul ul {
+    margin-left: -2em;
+  }
+  #TOC li {
+    line-height: 16px;
+  }
+
+table {
+  margin: 1em auto;
+  border-width: 1px;
+  border-color: #DDDDDD;
+  border-style: outset;
+  border-collapse: collapse;
+}
+table th {
+  border-width: 2px;
+  padding: 5px;
+  border-style: inset;
+}
+table td {
+  border-width: 1px;
+  border-style: inset;
+  line-height: 18px;
+  padding: 5px 5px;
+}
+table, table th, table td {
+  border-left-style: none;
+  border-right-style: none;
+}
+table thead, table tr.even {
+  background-color: #f7f7f7;
+}
+
+p {
+  margin: 0.5em 0;
+}
+
+blockquote {
+  background-color: #f6f6f6;
+  padding: 0.25em 0.75em;
+}
+
+hr {
+  border-style: solid;
+  border: none;
+  border-top: 1px solid #777;
+  margin: 28px 0;
+}
+
+dl {
+  margin-left: 0;
+}
+  dl dd {
+    margin-bottom: 13px;
+    margin-left: 13px;
+  }
+  dl dt {
+    font-weight: bold;
+  }
+
+ul {
+  margin-top: 0;
+}
+  ul li {
+    list-style: circle outside;
+  }
+  ul ul {
+    margin-bottom: 0;
+  }
+
+pre, code {
+  background-color: #f7f7f7;
+  border-radius: 3px;
+  color: #333;
+  white-space: pre-wrap;    /* Wrap long lines */
+}
+pre {
+  border-radius: 3px;
+  margin: 5px 0px 10px 0px;
+  padding: 10px;
+}
+pre:not([class]) {
+  background-color: #f7f7f7;
+}
+
+code {
+  font-family: Consolas, Monaco, 'Courier New', monospace;
+  font-size: 85%;
+}
+p > code, li > code {
+  padding: 2px 0px;
+}
+
+div.figure {
+  text-align: center;
+}
+img {
+  background-color: #FFFFFF;
+  padding: 2px;
+  border: 1px solid #DDDDDD;
+  border-radius: 3px;
+  border: 1px solid #CCCCCC;
+  margin: 0 5px;
+}
+
+h1 {
+  margin-top: 0;
+  font-size: 35px;
+  line-height: 40px;
+}
+
+h2 {
+  border-bottom: 4px solid #f7f7f7;
+  padding-top: 10px;
+  padding-bottom: 2px;
+  font-size: 145%;
+}
+
+h3 {
+  border-bottom: 2px solid #f7f7f7;
+  padding-top: 10px;
+  font-size: 120%;
+}
+
+h4 {
+  border-bottom: 1px solid #f7f7f7;
+  margin-left: 8px;
+  font-size: 105%;
+}
+
+h5, h6 {
+  border-bottom: 1px solid #ccc;
+  font-size: 105%;
+}
+
+a {
+  color: #0033dd;
+  text-decoration: none;
+}
+  a:hover {
+    color: #6666ff; }
+  a:visited {
+    color: #800080; }
+  a:visited:hover {
+    color: #BB00BB; }
+  a[href^="http:"] {
+    text-decoration: underline; }
+  a[href^="https:"] {
+    text-decoration: underline; }
+
+/* Class described in https://benjeffrey.com/posts/pandoc-syntax-highlighting-css
+   Colours from https://gist.github.com/robsimmons/1172277 */
+
+code > span.kw { color: #555; font-weight: bold; } /* Keyword */
+code > span.dt { color: #902000; } /* DataType */
+code > span.dv { color: #40a070; } /* DecVal (decimal values) */
+code > span.bn { color: #d14; } /* BaseN */
+code > span.fl { color: #d14; } /* Float */
+code > span.ch { color: #d14; } /* Char */
+code > span.st { color: #d14; } /* String */
+code > span.co { color: #888888; font-style: italic; } /* Comment */
+code > span.ot { color: #007020; } /* OtherToken */
+code > span.al { color: #ff0000; font-weight: bold; } /* AlertToken */
+code > span.fu { color: #900; font-weight: bold; } /* Function calls */ 
+code > span.er { color: #a61717; background-color: #e3d2d2; } /* ErrorTok */
+
diff --git a/inst/rmarkdown/templates/html_vignette/skeleton/skeleton.Rmd b/inst/rmarkdown/templates/html_vignette/skeleton/skeleton.Rmd
new file mode 100644
index 0000000..c52071d
--- /dev/null
+++ b/inst/rmarkdown/templates/html_vignette/skeleton/skeleton.Rmd
@@ -0,0 +1,65 @@
+---
+title: "Vignette Title"
+author: "Vignette Author"
+date: "`r Sys.Date()`"
+output: rmarkdown::html_vignette
+vignette: >
+  %\VignetteIndexEntry{Vignette Title}
+  %\VignetteEngine{knitr::rmarkdown}
+  %\VignetteEncoding{UTF-8}
+---
+
+```{r setup, include = FALSE}
+knitr::opts_chunk$set(
+  collapse = TRUE,
+  comment = "#>"
+)
+```
+
+Vignettes are long form documentation commonly included in packages. Because they are part of the distribution of the package, they need to be as compact as possible. The `html_vignette` output type provides a custom style sheet (and tweaks some options) to ensure that the resulting html is as small as possible. The `html_vignette` format:
+
+- Never uses retina figures
+- Has a smaller default figure size
+- Uses a custom CSS stylesheet instead of the default Twitter Bootstrap style
+
+## Vignette Info
+
+Note the various macros within the `vignette` section of the metadata block above. These are required in order to instruct R how to build the vignette. Note that you should change the `title` field and the `\VignetteIndexEntry` to match the title of your vignette.
+
+## Styles
+
+The `html_vignette` template includes a basic CSS theme. To override this theme you can specify your own CSS in the document metadata as follows:
+
+    output: 
+      rmarkdown::html_vignette:
+        css: mystyles.css
+
+## Figures
+
+The figure sizes have been customised so that you can easily put two images side-by-side. 
+
+```{r, fig.show='hold'}
+plot(1:10)
+plot(10:1)
+```
+
+You can enable figure captions by `fig_caption: yes` in YAML:
+
+    output:
+      rmarkdown::html_vignette:
+        fig_caption: yes
+
+Then you can use the chunk option `fig.cap = "Your figure caption."` in **knitr**.
+
+## More Examples
+
+You can write math expressions, e.g. $Y = X\beta + \epsilon$, footnotes^[A footnote here.], and tables, e.g. using `knitr::kable()`.
+
+```{r, echo=FALSE, results='asis'}
+knitr::kable(head(mtcars, 10))
+```
+
+Also a quote using `>`:
+
+> "He who gives up [code] safety for [code] speed deserves neither."
+([via](https://twitter.com/hadleywickham/status/504368538874703872))
diff --git a/inst/rmarkdown/templates/html_vignette/template.yaml b/inst/rmarkdown/templates/html_vignette/template.yaml
new file mode 100644
index 0000000..7f06341
--- /dev/null
+++ b/inst/rmarkdown/templates/html_vignette/template.yaml
@@ -0,0 +1,5 @@
+name: Package Vignette (HTML)
+description: >
+  Template for package vignettes. This customises the basic HTML output
+  to take up as little space as possible.
+create_dir: false
diff --git a/inst/rmd/fragment/default.html b/inst/rmd/fragment/default.html
new file mode 100644
index 0000000..ae5416b
--- /dev/null
+++ b/inst/rmd/fragment/default.html
@@ -0,0 +1,11 @@
+
+
+$for(include-before)$
+$include-before$
+$endfor$
+
+$body$
+
+$for(include-after)$
+$include-after$
+$endfor$
diff --git a/inst/rmd/fragment/default.tex b/inst/rmd/fragment/default.tex
new file mode 100644
index 0000000..36d66c2
--- /dev/null
+++ b/inst/rmd/fragment/default.tex
@@ -0,0 +1 @@
+$body$
diff --git a/inst/rmd/h/_navbar.html b/inst/rmd/h/_navbar.html
new file mode 100644
index 0000000..591b375
--- /dev/null
+++ b/inst/rmd/h/_navbar.html
@@ -0,0 +1,21 @@
+
+<div class="navbar navbar-%s  navbar-fixed-top" role="navigation">
+  <div class="container">
+    <div class="navbar-header">
+      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
+        <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+      </button>
+      <a class="navbar-brand" href="index.html">%s</a>
+    </div>
+    <div id="navbar" class="navbar-collapse collapse">
+      <ul class="nav navbar-nav">
+        %s
+      </ul>
+      <ul class="nav navbar-nav navbar-right">
+        %s
+      </ul>
+    </div><!--/.nav-collapse -->
+  </div><!--/.container -->
+</div><!--/.navbar -->
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css
new file mode 100644
index 0000000..c19cd5c
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css
@@ -0,0 +1,587 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-default.disabled,
+.btn-primary.disabled,
+.btn-success.disabled,
+.btn-info.disabled,
+.btn-warning.disabled,
+.btn-danger.disabled,
+.btn-default[disabled],
+.btn-primary[disabled],
+.btn-success[disabled],
+.btn-info[disabled],
+.btn-warning[disabled],
+.btn-danger[disabled],
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-danger {
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+  text-shadow: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  text-shadow: 0 1px 0 #fff;
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
+  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #245580;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #265a88;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #265a88;
+  border-color: #245580;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #265a88;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-color: #e8e8e8;
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-color: #2e6da4;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
+  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
+  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
+  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
+  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+ at media (max-width: 767px) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+    background-repeat: repeat-x;
+  }
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #286090;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #2b669a;
+}
+.list-group-item.active .badge,
+.list-group-item.active:hover .badge,
+.list-group-item.active:focus .badge {
+  text-shadow: none;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+}
+/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css.map b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css.map
new file mode 100644
index 0000000..7535311
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAA [...]
\ No newline at end of file
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.min.css b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.min.css
new file mode 100644
index 0000000..61358b1
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warnin [...]
\ No newline at end of file
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css
new file mode 100644
index 0000000..592f6f5
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css
@@ -0,0 +1,6799 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+html {
+  font-family: sans-serif;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+audio,
+canvas,
+progress,
+video {
+  display: inline-block;
+  vertical-align: baseline;
+}
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+[hidden],
+template {
+  display: none;
+}
+a {
+  background-color: transparent;
+}
+a:active,
+a:hover {
+  outline: 0;
+}
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+b,
+strong {
+  font-weight: bold;
+}
+dfn {
+  font-style: italic;
+}
+h1 {
+  margin: .67em 0;
+  font-size: 2em;
+}
+mark {
+  color: #000;
+  background: #ff0;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -.5em;
+}
+sub {
+  bottom: -.25em;
+}
+img {
+  border: 0;
+}
+svg:not(:root) {
+  overflow: hidden;
+}
+figure {
+  margin: 1em 40px;
+}
+hr {
+  height: 0;
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+}
+pre {
+  overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+  margin: 0;
+  font: inherit;
+  color: inherit;
+}
+button {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+input {
+  line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+fieldset {
+  padding: .35em .625em .75em;
+  margin: 0 2px;
+  border: 1px solid #c0c0c0;
+}
+legend {
+  padding: 0;
+  border: 0;
+}
+textarea {
+  overflow: auto;
+}
+optgroup {
+  font-weight: bold;
+}
+table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+td,
+th {
+  padding: 0;
+}
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+ at media print {
+  *,
+  *:before,
+  *:after {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    -webkit-box-shadow: none !important;
+            box-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  a[href^="#"]:after,
+  a[href^="javascript:"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  .navbar {
+    display: none;
+  }
+  .btn > .caret,
+  .dropup > .btn > .caret {
+    border-top-color: #000 !important;
+  }
+  .label {
+    border: 1px solid #000;
+  }
+  .table {
+    border-collapse: collapse !important;
+  }
+  .table td,
+  .table th {
+    background-color: #fff !important;
+  }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important;
+  }
+}
+ at font-face {
+  font-family: 'Glyphicons Halflings';
+
+  src: url('../fonts/glyphicons-halflings-regular.eot');
+  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+}
+.glyphicon {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-family: 'Glyphicons Halflings';
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+  content: "\2a";
+}
+.glyphicon-plus:before {
+  content: "\2b";
+}
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+  content: "\20ac";
+}
+.glyphicon-minus:before {
+  content: "\2212";
+}
+.glyphicon-cloud:before {
+  content: "\2601";
+}
+.glyphicon-envelope:before {
+  content: "\2709";
+}
+.glyphicon-pencil:before {
+  content: "\270f";
+}
+.glyphicon-glass:before {
+  content: "\e001";
+}
+.glyphicon-music:before {
+  content: "\e002";
+}
+.glyphicon-search:before {
+  content: "\e003";
+}
+.glyphicon-heart:before {
+  content: "\e005";
+}
+.glyphicon-star:before {
+  content: "\e006";
+}
+.glyphicon-star-empty:before {
+  content: "\e007";
+}
+.glyphicon-user:before {
+  content: "\e008";
+}
+.glyphicon-film:before {
+  content: "\e009";
+}
+.glyphicon-th-large:before {
+  content: "\e010";
+}
+.glyphicon-th:before {
+  content: "\e011";
+}
+.glyphicon-th-list:before {
+  content: "\e012";
+}
+.glyphicon-ok:before {
+  content: "\e013";
+}
+.glyphicon-remove:before {
+  content: "\e014";
+}
+.glyphicon-zoom-in:before {
+  content: "\e015";
+}
+.glyphicon-zoom-out:before {
+  content: "\e016";
+}
+.glyphicon-off:before {
+  content: "\e017";
+}
+.glyphicon-signal:before {
+  content: "\e018";
+}
+.glyphicon-cog:before {
+  content: "\e019";
+}
+.glyphicon-trash:before {
+  content: "\e020";
+}
+.glyphicon-home:before {
+  content: "\e021";
+}
+.glyphicon-file:before {
+  content: "\e022";
+}
+.glyphicon-time:before {
+  content: "\e023";
+}
+.glyphicon-road:before {
+  content: "\e024";
+}
+.glyphicon-download-alt:before {
+  content: "\e025";
+}
+.glyphicon-download:before {
+  content: "\e026";
+}
+.glyphicon-upload:before {
+  content: "\e027";
+}
+.glyphicon-inbox:before {
+  content: "\e028";
+}
+.glyphicon-play-circle:before {
+  content: "\e029";
+}
+.glyphicon-repeat:before {
+  content: "\e030";
+}
+.glyphicon-refresh:before {
+  content: "\e031";
+}
+.glyphicon-list-alt:before {
+  content: "\e032";
+}
+.glyphicon-lock:before {
+  content: "\e033";
+}
+.glyphicon-flag:before {
+  content: "\e034";
+}
+.glyphicon-headphones:before {
+  content: "\e035";
+}
+.glyphicon-volume-off:before {
+  content: "\e036";
+}
+.glyphicon-volume-down:before {
+  content: "\e037";
+}
+.glyphicon-volume-up:before {
+  content: "\e038";
+}
+.glyphicon-qrcode:before {
+  content: "\e039";
+}
+.glyphicon-barcode:before {
+  content: "\e040";
+}
+.glyphicon-tag:before {
+  content: "\e041";
+}
+.glyphicon-tags:before {
+  content: "\e042";
+}
+.glyphicon-book:before {
+  content: "\e043";
+}
+.glyphicon-bookmark:before {
+  content: "\e044";
+}
+.glyphicon-print:before {
+  content: "\e045";
+}
+.glyphicon-camera:before {
+  content: "\e046";
+}
+.glyphicon-font:before {
+  content: "\e047";
+}
+.glyphicon-bold:before {
+  content: "\e048";
+}
+.glyphicon-italic:before {
+  content: "\e049";
+}
+.glyphicon-text-height:before {
+  content: "\e050";
+}
+.glyphicon-text-width:before {
+  content: "\e051";
+}
+.glyphicon-align-left:before {
+  content: "\e052";
+}
+.glyphicon-align-center:before {
+  content: "\e053";
+}
+.glyphicon-align-right:before {
+  content: "\e054";
+}
+.glyphicon-align-justify:before {
+  content: "\e055";
+}
+.glyphicon-list:before {
+  content: "\e056";
+}
+.glyphicon-indent-left:before {
+  content: "\e057";
+}
+.glyphicon-indent-right:before {
+  content: "\e058";
+}
+.glyphicon-facetime-video:before {
+  content: "\e059";
+}
+.glyphicon-picture:before {
+  content: "\e060";
+}
+.glyphicon-map-marker:before {
+  content: "\e062";
+}
+.glyphicon-adjust:before {
+  content: "\e063";
+}
+.glyphicon-tint:before {
+  content: "\e064";
+}
+.glyphicon-edit:before {
+  content: "\e065";
+}
+.glyphicon-share:before {
+  content: "\e066";
+}
+.glyphicon-check:before {
+  content: "\e067";
+}
+.glyphicon-move:before {
+  content: "\e068";
+}
+.glyphicon-step-backward:before {
+  content: "\e069";
+}
+.glyphicon-fast-backward:before {
+  content: "\e070";
+}
+.glyphicon-backward:before {
+  content: "\e071";
+}
+.glyphicon-play:before {
+  content: "\e072";
+}
+.glyphicon-pause:before {
+  content: "\e073";
+}
+.glyphicon-stop:before {
+  content: "\e074";
+}
+.glyphicon-forward:before {
+  content: "\e075";
+}
+.glyphicon-fast-forward:before {
+  content: "\e076";
+}
+.glyphicon-step-forward:before {
+  content: "\e077";
+}
+.glyphicon-eject:before {
+  content: "\e078";
+}
+.glyphicon-chevron-left:before {
+  content: "\e079";
+}
+.glyphicon-chevron-right:before {
+  content: "\e080";
+}
+.glyphicon-plus-sign:before {
+  content: "\e081";
+}
+.glyphicon-minus-sign:before {
+  content: "\e082";
+}
+.glyphicon-remove-sign:before {
+  content: "\e083";
+}
+.glyphicon-ok-sign:before {
+  content: "\e084";
+}
+.glyphicon-question-sign:before {
+  content: "\e085";
+}
+.glyphicon-info-sign:before {
+  content: "\e086";
+}
+.glyphicon-screenshot:before {
+  content: "\e087";
+}
+.glyphicon-remove-circle:before {
+  content: "\e088";
+}
+.glyphicon-ok-circle:before {
+  content: "\e089";
+}
+.glyphicon-ban-circle:before {
+  content: "\e090";
+}
+.glyphicon-arrow-left:before {
+  content: "\e091";
+}
+.glyphicon-arrow-right:before {
+  content: "\e092";
+}
+.glyphicon-arrow-up:before {
+  content: "\e093";
+}
+.glyphicon-arrow-down:before {
+  content: "\e094";
+}
+.glyphicon-share-alt:before {
+  content: "\e095";
+}
+.glyphicon-resize-full:before {
+  content: "\e096";
+}
+.glyphicon-resize-small:before {
+  content: "\e097";
+}
+.glyphicon-exclamation-sign:before {
+  content: "\e101";
+}
+.glyphicon-gift:before {
+  content: "\e102";
+}
+.glyphicon-leaf:before {
+  content: "\e103";
+}
+.glyphicon-fire:before {
+  content: "\e104";
+}
+.glyphicon-eye-open:before {
+  content: "\e105";
+}
+.glyphicon-eye-close:before {
+  content: "\e106";
+}
+.glyphicon-warning-sign:before {
+  content: "\e107";
+}
+.glyphicon-plane:before {
+  content: "\e108";
+}
+.glyphicon-calendar:before {
+  content: "\e109";
+}
+.glyphicon-random:before {
+  content: "\e110";
+}
+.glyphicon-comment:before {
+  content: "\e111";
+}
+.glyphicon-magnet:before {
+  content: "\e112";
+}
+.glyphicon-chevron-up:before {
+  content: "\e113";
+}
+.glyphicon-chevron-down:before {
+  content: "\e114";
+}
+.glyphicon-retweet:before {
+  content: "\e115";
+}
+.glyphicon-shopping-cart:before {
+  content: "\e116";
+}
+.glyphicon-folder-close:before {
+  content: "\e117";
+}
+.glyphicon-folder-open:before {
+  content: "\e118";
+}
+.glyphicon-resize-vertical:before {
+  content: "\e119";
+}
+.glyphicon-resize-horizontal:before {
+  content: "\e120";
+}
+.glyphicon-hdd:before {
+  content: "\e121";
+}
+.glyphicon-bullhorn:before {
+  content: "\e122";
+}
+.glyphicon-bell:before {
+  content: "\e123";
+}
+.glyphicon-certificate:before {
+  content: "\e124";
+}
+.glyphicon-thumbs-up:before {
+  content: "\e125";
+}
+.glyphicon-thumbs-down:before {
+  content: "\e126";
+}
+.glyphicon-hand-right:before {
+  content: "\e127";
+}
+.glyphicon-hand-left:before {
+  content: "\e128";
+}
+.glyphicon-hand-up:before {
+  content: "\e129";
+}
+.glyphicon-hand-down:before {
+  content: "\e130";
+}
+.glyphicon-circle-arrow-right:before {
+  content: "\e131";
+}
+.glyphicon-circle-arrow-left:before {
+  content: "\e132";
+}
+.glyphicon-circle-arrow-up:before {
+  content: "\e133";
+}
+.glyphicon-circle-arrow-down:before {
+  content: "\e134";
+}
+.glyphicon-globe:before {
+  content: "\e135";
+}
+.glyphicon-wrench:before {
+  content: "\e136";
+}
+.glyphicon-tasks:before {
+  content: "\e137";
+}
+.glyphicon-filter:before {
+  content: "\e138";
+}
+.glyphicon-briefcase:before {
+  content: "\e139";
+}
+.glyphicon-fullscreen:before {
+  content: "\e140";
+}
+.glyphicon-dashboard:before {
+  content: "\e141";
+}
+.glyphicon-paperclip:before {
+  content: "\e142";
+}
+.glyphicon-heart-empty:before {
+  content: "\e143";
+}
+.glyphicon-link:before {
+  content: "\e144";
+}
+.glyphicon-phone:before {
+  content: "\e145";
+}
+.glyphicon-pushpin:before {
+  content: "\e146";
+}
+.glyphicon-usd:before {
+  content: "\e148";
+}
+.glyphicon-gbp:before {
+  content: "\e149";
+}
+.glyphicon-sort:before {
+  content: "\e150";
+}
+.glyphicon-sort-by-alphabet:before {
+  content: "\e151";
+}
+.glyphicon-sort-by-alphabet-alt:before {
+  content: "\e152";
+}
+.glyphicon-sort-by-order:before {
+  content: "\e153";
+}
+.glyphicon-sort-by-order-alt:before {
+  content: "\e154";
+}
+.glyphicon-sort-by-attributes:before {
+  content: "\e155";
+}
+.glyphicon-sort-by-attributes-alt:before {
+  content: "\e156";
+}
+.glyphicon-unchecked:before {
+  content: "\e157";
+}
+.glyphicon-expand:before {
+  content: "\e158";
+}
+.glyphicon-collapse-down:before {
+  content: "\e159";
+}
+.glyphicon-collapse-up:before {
+  content: "\e160";
+}
+.glyphicon-log-in:before {
+  content: "\e161";
+}
+.glyphicon-flash:before {
+  content: "\e162";
+}
+.glyphicon-log-out:before {
+  content: "\e163";
+}
+.glyphicon-new-window:before {
+  content: "\e164";
+}
+.glyphicon-record:before {
+  content: "\e165";
+}
+.glyphicon-save:before {
+  content: "\e166";
+}
+.glyphicon-open:before {
+  content: "\e167";
+}
+.glyphicon-saved:before {
+  content: "\e168";
+}
+.glyphicon-import:before {
+  content: "\e169";
+}
+.glyphicon-export:before {
+  content: "\e170";
+}
+.glyphicon-send:before {
+  content: "\e171";
+}
+.glyphicon-floppy-disk:before {
+  content: "\e172";
+}
+.glyphicon-floppy-saved:before {
+  content: "\e173";
+}
+.glyphicon-floppy-remove:before {
+  content: "\e174";
+}
+.glyphicon-floppy-save:before {
+  content: "\e175";
+}
+.glyphicon-floppy-open:before {
+  content: "\e176";
+}
+.glyphicon-credit-card:before {
+  content: "\e177";
+}
+.glyphicon-transfer:before {
+  content: "\e178";
+}
+.glyphicon-cutlery:before {
+  content: "\e179";
+}
+.glyphicon-header:before {
+  content: "\e180";
+}
+.glyphicon-compressed:before {
+  content: "\e181";
+}
+.glyphicon-earphone:before {
+  content: "\e182";
+}
+.glyphicon-phone-alt:before {
+  content: "\e183";
+}
+.glyphicon-tower:before {
+  content: "\e184";
+}
+.glyphicon-stats:before {
+  content: "\e185";
+}
+.glyphicon-sd-video:before {
+  content: "\e186";
+}
+.glyphicon-hd-video:before {
+  content: "\e187";
+}
+.glyphicon-subtitles:before {
+  content: "\e188";
+}
+.glyphicon-sound-stereo:before {
+  content: "\e189";
+}
+.glyphicon-sound-dolby:before {
+  content: "\e190";
+}
+.glyphicon-sound-5-1:before {
+  content: "\e191";
+}
+.glyphicon-sound-6-1:before {
+  content: "\e192";
+}
+.glyphicon-sound-7-1:before {
+  content: "\e193";
+}
+.glyphicon-copyright-mark:before {
+  content: "\e194";
+}
+.glyphicon-registration-mark:before {
+  content: "\e195";
+}
+.glyphicon-cloud-download:before {
+  content: "\e197";
+}
+.glyphicon-cloud-upload:before {
+  content: "\e198";
+}
+.glyphicon-tree-conifer:before {
+  content: "\e199";
+}
+.glyphicon-tree-deciduous:before {
+  content: "\e200";
+}
+.glyphicon-cd:before {
+  content: "\e201";
+}
+.glyphicon-save-file:before {
+  content: "\e202";
+}
+.glyphicon-open-file:before {
+  content: "\e203";
+}
+.glyphicon-level-up:before {
+  content: "\e204";
+}
+.glyphicon-copy:before {
+  content: "\e205";
+}
+.glyphicon-paste:before {
+  content: "\e206";
+}
+.glyphicon-alert:before {
+  content: "\e209";
+}
+.glyphicon-equalizer:before {
+  content: "\e210";
+}
+.glyphicon-king:before {
+  content: "\e211";
+}
+.glyphicon-queen:before {
+  content: "\e212";
+}
+.glyphicon-pawn:before {
+  content: "\e213";
+}
+.glyphicon-bishop:before {
+  content: "\e214";
+}
+.glyphicon-knight:before {
+  content: "\e215";
+}
+.glyphicon-baby-formula:before {
+  content: "\e216";
+}
+.glyphicon-tent:before {
+  content: "\26fa";
+}
+.glyphicon-blackboard:before {
+  content: "\e218";
+}
+.glyphicon-bed:before {
+  content: "\e219";
+}
+.glyphicon-apple:before {
+  content: "\f8ff";
+}
+.glyphicon-erase:before {
+  content: "\e221";
+}
+.glyphicon-hourglass:before {
+  content: "\231b";
+}
+.glyphicon-lamp:before {
+  content: "\e223";
+}
+.glyphicon-duplicate:before {
+  content: "\e224";
+}
+.glyphicon-piggy-bank:before {
+  content: "\e225";
+}
+.glyphicon-scissors:before {
+  content: "\e226";
+}
+.glyphicon-bitcoin:before {
+  content: "\e227";
+}
+.glyphicon-btc:before {
+  content: "\e227";
+}
+.glyphicon-xbt:before {
+  content: "\e227";
+}
+.glyphicon-yen:before {
+  content: "\00a5";
+}
+.glyphicon-jpy:before {
+  content: "\00a5";
+}
+.glyphicon-ruble:before {
+  content: "\20bd";
+}
+.glyphicon-rub:before {
+  content: "\20bd";
+}
+.glyphicon-scale:before {
+  content: "\e230";
+}
+.glyphicon-ice-lolly:before {
+  content: "\e231";
+}
+.glyphicon-ice-lolly-tasted:before {
+  content: "\e232";
+}
+.glyphicon-education:before {
+  content: "\e233";
+}
+.glyphicon-option-horizontal:before {
+  content: "\e234";
+}
+.glyphicon-option-vertical:before {
+  content: "\e235";
+}
+.glyphicon-menu-hamburger:before {
+  content: "\e236";
+}
+.glyphicon-modal-window:before {
+  content: "\e237";
+}
+.glyphicon-oil:before {
+  content: "\e238";
+}
+.glyphicon-grain:before {
+  content: "\e239";
+}
+.glyphicon-sunglasses:before {
+  content: "\e240";
+}
+.glyphicon-text-size:before {
+  content: "\e241";
+}
+.glyphicon-text-color:before {
+  content: "\e242";
+}
+.glyphicon-text-background:before {
+  content: "\e243";
+}
+.glyphicon-object-align-top:before {
+  content: "\e244";
+}
+.glyphicon-object-align-bottom:before {
+  content: "\e245";
+}
+.glyphicon-object-align-horizontal:before {
+  content: "\e246";
+}
+.glyphicon-object-align-left:before {
+  content: "\e247";
+}
+.glyphicon-object-align-vertical:before {
+  content: "\e248";
+}
+.glyphicon-object-align-right:before {
+  content: "\e249";
+}
+.glyphicon-triangle-right:before {
+  content: "\e250";
+}
+.glyphicon-triangle-left:before {
+  content: "\e251";
+}
+.glyphicon-triangle-bottom:before {
+  content: "\e252";
+}
+.glyphicon-triangle-top:before {
+  content: "\e253";
+}
+.glyphicon-console:before {
+  content: "\e254";
+}
+.glyphicon-superscript:before {
+  content: "\e255";
+}
+.glyphicon-subscript:before {
+  content: "\e256";
+}
+.glyphicon-menu-left:before {
+  content: "\e257";
+}
+.glyphicon-menu-right:before {
+  content: "\e258";
+}
+.glyphicon-menu-down:before {
+  content: "\e259";
+}
+.glyphicon-menu-up:before {
+  content: "\e260";
+}
+* {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+html {
+  font-size: 10px;
+
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #333;
+  background-color: #fff;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+a {
+  color: #337ab7;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #23527c;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+figure {
+  margin: 0;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+  padding: 4px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: all .2s ease-in-out;
+       -o-transition: all .2s ease-in-out;
+          transition: all .2s ease-in-out;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+[role="button"] {
+  cursor: pointer;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+  font-weight: normal;
+  line-height: 1;
+  color: #777;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+  margin-top: 20px;
+  margin-bottom: 10px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+  font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+  font-size: 75%;
+}
+h1,
+.h1 {
+  font-size: 36px;
+}
+h2,
+.h2 {
+  font-size: 30px;
+}
+h3,
+.h3 {
+  font-size: 24px;
+}
+h4,
+.h4 {
+  font-size: 18px;
+}
+h5,
+.h5 {
+  font-size: 14px;
+}
+h6,
+.h6 {
+  font-size: 12px;
+}
+p {
+  margin: 0 0 10px;
+}
+.lead {
+  margin-bottom: 20px;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 1.4;
+}
+ at media (min-width: 768px) {
+  .lead {
+    font-size: 21px;
+  }
+}
+small,
+.small {
+  font-size: 85%;
+}
+mark,
+.mark {
+  padding: .2em;
+  background-color: #fcf8e3;
+}
+.text-left {
+  text-align: left;
+}
+.text-right {
+  text-align: right;
+}
+.text-center {
+  text-align: center;
+}
+.text-justify {
+  text-align: justify;
+}
+.text-nowrap {
+  white-space: nowrap;
+}
+.text-lowercase {
+  text-transform: lowercase;
+}
+.text-uppercase {
+  text-transform: uppercase;
+}
+.text-capitalize {
+  text-transform: capitalize;
+}
+.text-muted {
+  color: #777;
+}
+.text-primary {
+  color: #337ab7;
+}
+a.text-primary:hover,
+a.text-primary:focus {
+  color: #286090;
+}
+.text-success {
+  color: #3c763d;
+}
+a.text-success:hover,
+a.text-success:focus {
+  color: #2b542c;
+}
+.text-info {
+  color: #31708f;
+}
+a.text-info:hover,
+a.text-info:focus {
+  color: #245269;
+}
+.text-warning {
+  color: #8a6d3b;
+}
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #66512c;
+}
+.text-danger {
+  color: #a94442;
+}
+a.text-danger:hover,
+a.text-danger:focus {
+  color: #843534;
+}
+.bg-primary {
+  color: #fff;
+  background-color: #337ab7;
+}
+a.bg-primary:hover,
+a.bg-primary:focus {
+  background-color: #286090;
+}
+.bg-success {
+  background-color: #dff0d8;
+}
+a.bg-success:hover,
+a.bg-success:focus {
+  background-color: #c1e2b3;
+}
+.bg-info {
+  background-color: #d9edf7;
+}
+a.bg-info:hover,
+a.bg-info:focus {
+  background-color: #afd9ee;
+}
+.bg-warning {
+  background-color: #fcf8e3;
+}
+a.bg-warning:hover,
+a.bg-warning:focus {
+  background-color: #f7ecb5;
+}
+.bg-danger {
+  background-color: #f2dede;
+}
+a.bg-danger:hover,
+a.bg-danger:focus {
+  background-color: #e4b9b9;
+}
+.page-header {
+  padding-bottom: 9px;
+  margin: 40px 0 20px;
+  border-bottom: 1px solid #eee;
+}
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+  margin-bottom: 0;
+}
+.list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+.list-inline {
+  padding-left: 0;
+  margin-left: -5px;
+  list-style: none;
+}
+.list-inline > li {
+  display: inline-block;
+  padding-right: 5px;
+  padding-left: 5px;
+}
+dl {
+  margin-top: 0;
+  margin-bottom: 20px;
+}
+dt,
+dd {
+  line-height: 1.42857143;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 0;
+}
+ at media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    overflow: hidden;
+    clear: left;
+    text-align: right;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .dl-horizontal dd {
+    margin-left: 180px;
+  }
+}
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #777;
+}
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 10px 20px;
+  margin: 0 0 20px;
+  font-size: 17.5px;
+  border-left: 5px solid #eee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+  margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.42857143;
+  color: #777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+  content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  text-align: right;
+  border-right: 5px solid #eee;
+  border-left: 0;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+  content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+  content: '\00A0 \2014';
+}
+address {
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 1.42857143;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace;
+}
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #c7254e;
+  background-color: #f9f2f4;
+  border-radius: 4px;
+}
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #fff;
+  background-color: #333;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  font-weight: bold;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 1.42857143;
+  color: #333;
+  word-break: break-all;
+  word-wrap: break-word;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+pre code {
+  padding: 0;
+  font-size: inherit;
+  color: inherit;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border-radius: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+.container {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+ at media (min-width: 768px) {
+  .container {
+    width: 750px;
+  }
+}
+ at media (min-width: 992px) {
+  .container {
+    width: 970px;
+  }
+}
+ at media (min-width: 1200px) {
+  .container {
+    width: 1170px;
+  }
+}
+.container-fluid {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+.row {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11,  [...]
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: left;
+}
+.col-xs-12 {
+  width: 100%;
+}
+.col-xs-11 {
+  width: 91.66666667%;
+}
+.col-xs-10 {
+  width: 83.33333333%;
+}
+.col-xs-9 {
+  width: 75%;
+}
+.col-xs-8 {
+  width: 66.66666667%;
+}
+.col-xs-7 {
+  width: 58.33333333%;
+}
+.col-xs-6 {
+  width: 50%;
+}
+.col-xs-5 {
+  width: 41.66666667%;
+}
+.col-xs-4 {
+  width: 33.33333333%;
+}
+.col-xs-3 {
+  width: 25%;
+}
+.col-xs-2 {
+  width: 16.66666667%;
+}
+.col-xs-1 {
+  width: 8.33333333%;
+}
+.col-xs-pull-12 {
+  right: 100%;
+}
+.col-xs-pull-11 {
+  right: 91.66666667%;
+}
+.col-xs-pull-10 {
+  right: 83.33333333%;
+}
+.col-xs-pull-9 {
+  right: 75%;
+}
+.col-xs-pull-8 {
+  right: 66.66666667%;
+}
+.col-xs-pull-7 {
+  right: 58.33333333%;
+}
+.col-xs-pull-6 {
+  right: 50%;
+}
+.col-xs-pull-5 {
+  right: 41.66666667%;
+}
+.col-xs-pull-4 {
+  right: 33.33333333%;
+}
+.col-xs-pull-3 {
+  right: 25%;
+}
+.col-xs-pull-2 {
+  right: 16.66666667%;
+}
+.col-xs-pull-1 {
+  right: 8.33333333%;
+}
+.col-xs-pull-0 {
+  right: auto;
+}
+.col-xs-push-12 {
+  left: 100%;
+}
+.col-xs-push-11 {
+  left: 91.66666667%;
+}
+.col-xs-push-10 {
+  left: 83.33333333%;
+}
+.col-xs-push-9 {
+  left: 75%;
+}
+.col-xs-push-8 {
+  left: 66.66666667%;
+}
+.col-xs-push-7 {
+  left: 58.33333333%;
+}
+.col-xs-push-6 {
+  left: 50%;
+}
+.col-xs-push-5 {
+  left: 41.66666667%;
+}
+.col-xs-push-4 {
+  left: 33.33333333%;
+}
+.col-xs-push-3 {
+  left: 25%;
+}
+.col-xs-push-2 {
+  left: 16.66666667%;
+}
+.col-xs-push-1 {
+  left: 8.33333333%;
+}
+.col-xs-push-0 {
+  left: auto;
+}
+.col-xs-offset-12 {
+  margin-left: 100%;
+}
+.col-xs-offset-11 {
+  margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+  margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+  margin-left: 75%;
+}
+.col-xs-offset-8 {
+  margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+  margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+  margin-left: 50%;
+}
+.col-xs-offset-5 {
+  margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+  margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+  margin-left: 25%;
+}
+.col-xs-offset-2 {
+  margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+  margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+  margin-left: 0;
+}
+ at media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left;
+  }
+  .col-sm-12 {
+    width: 100%;
+  }
+  .col-sm-11 {
+    width: 91.66666667%;
+  }
+  .col-sm-10 {
+    width: 83.33333333%;
+  }
+  .col-sm-9 {
+    width: 75%;
+  }
+  .col-sm-8 {
+    width: 66.66666667%;
+  }
+  .col-sm-7 {
+    width: 58.33333333%;
+  }
+  .col-sm-6 {
+    width: 50%;
+  }
+  .col-sm-5 {
+    width: 41.66666667%;
+  }
+  .col-sm-4 {
+    width: 33.33333333%;
+  }
+  .col-sm-3 {
+    width: 25%;
+  }
+  .col-sm-2 {
+    width: 16.66666667%;
+  }
+  .col-sm-1 {
+    width: 8.33333333%;
+  }
+  .col-sm-pull-12 {
+    right: 100%;
+  }
+  .col-sm-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-sm-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-sm-pull-9 {
+    right: 75%;
+  }
+  .col-sm-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-sm-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-sm-pull-6 {
+    right: 50%;
+  }
+  .col-sm-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-sm-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-sm-pull-3 {
+    right: 25%;
+  }
+  .col-sm-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-sm-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-sm-pull-0 {
+    right: auto;
+  }
+  .col-sm-push-12 {
+    left: 100%;
+  }
+  .col-sm-push-11 {
+    left: 91.66666667%;
+  }
+  .col-sm-push-10 {
+    left: 83.33333333%;
+  }
+  .col-sm-push-9 {
+    left: 75%;
+  }
+  .col-sm-push-8 {
+    left: 66.66666667%;
+  }
+  .col-sm-push-7 {
+    left: 58.33333333%;
+  }
+  .col-sm-push-6 {
+    left: 50%;
+  }
+  .col-sm-push-5 {
+    left: 41.66666667%;
+  }
+  .col-sm-push-4 {
+    left: 33.33333333%;
+  }
+  .col-sm-push-3 {
+    left: 25%;
+  }
+  .col-sm-push-2 {
+    left: 16.66666667%;
+  }
+  .col-sm-push-1 {
+    left: 8.33333333%;
+  }
+  .col-sm-push-0 {
+    left: auto;
+  }
+  .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+  .col-sm-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-sm-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+  .col-sm-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-sm-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+  .col-sm-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-sm-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+  .col-sm-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-sm-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-sm-offset-0 {
+    margin-left: 0;
+  }
+}
+ at media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left;
+  }
+  .col-md-12 {
+    width: 100%;
+  }
+  .col-md-11 {
+    width: 91.66666667%;
+  }
+  .col-md-10 {
+    width: 83.33333333%;
+  }
+  .col-md-9 {
+    width: 75%;
+  }
+  .col-md-8 {
+    width: 66.66666667%;
+  }
+  .col-md-7 {
+    width: 58.33333333%;
+  }
+  .col-md-6 {
+    width: 50%;
+  }
+  .col-md-5 {
+    width: 41.66666667%;
+  }
+  .col-md-4 {
+    width: 33.33333333%;
+  }
+  .col-md-3 {
+    width: 25%;
+  }
+  .col-md-2 {
+    width: 16.66666667%;
+  }
+  .col-md-1 {
+    width: 8.33333333%;
+  }
+  .col-md-pull-12 {
+    right: 100%;
+  }
+  .col-md-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-md-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-md-pull-9 {
+    right: 75%;
+  }
+  .col-md-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-md-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-md-pull-6 {
+    right: 50%;
+  }
+  .col-md-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-md-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-md-pull-3 {
+    right: 25%;
+  }
+  .col-md-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-md-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-md-pull-0 {
+    right: auto;
+  }
+  .col-md-push-12 {
+    left: 100%;
+  }
+  .col-md-push-11 {
+    left: 91.66666667%;
+  }
+  .col-md-push-10 {
+    left: 83.33333333%;
+  }
+  .col-md-push-9 {
+    left: 75%;
+  }
+  .col-md-push-8 {
+    left: 66.66666667%;
+  }
+  .col-md-push-7 {
+    left: 58.33333333%;
+  }
+  .col-md-push-6 {
+    left: 50%;
+  }
+  .col-md-push-5 {
+    left: 41.66666667%;
+  }
+  .col-md-push-4 {
+    left: 33.33333333%;
+  }
+  .col-md-push-3 {
+    left: 25%;
+  }
+  .col-md-push-2 {
+    left: 16.66666667%;
+  }
+  .col-md-push-1 {
+    left: 8.33333333%;
+  }
+  .col-md-push-0 {
+    left: auto;
+  }
+  .col-md-offset-12 {
+    margin-left: 100%;
+  }
+  .col-md-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-md-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-md-offset-9 {
+    margin-left: 75%;
+  }
+  .col-md-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-md-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-md-offset-6 {
+    margin-left: 50%;
+  }
+  .col-md-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-md-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-md-offset-3 {
+    margin-left: 25%;
+  }
+  .col-md-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-md-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-md-offset-0 {
+    margin-left: 0;
+  }
+}
+ at media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left;
+  }
+  .col-lg-12 {
+    width: 100%;
+  }
+  .col-lg-11 {
+    width: 91.66666667%;
+  }
+  .col-lg-10 {
+    width: 83.33333333%;
+  }
+  .col-lg-9 {
+    width: 75%;
+  }
+  .col-lg-8 {
+    width: 66.66666667%;
+  }
+  .col-lg-7 {
+    width: 58.33333333%;
+  }
+  .col-lg-6 {
+    width: 50%;
+  }
+  .col-lg-5 {
+    width: 41.66666667%;
+  }
+  .col-lg-4 {
+    width: 33.33333333%;
+  }
+  .col-lg-3 {
+    width: 25%;
+  }
+  .col-lg-2 {
+    width: 16.66666667%;
+  }
+  .col-lg-1 {
+    width: 8.33333333%;
+  }
+  .col-lg-pull-12 {
+    right: 100%;
+  }
+  .col-lg-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-lg-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-lg-pull-9 {
+    right: 75%;
+  }
+  .col-lg-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-lg-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-lg-pull-6 {
+    right: 50%;
+  }
+  .col-lg-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-lg-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-lg-pull-3 {
+    right: 25%;
+  }
+  .col-lg-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-lg-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-lg-pull-0 {
+    right: auto;
+  }
+  .col-lg-push-12 {
+    left: 100%;
+  }
+  .col-lg-push-11 {
+    left: 91.66666667%;
+  }
+  .col-lg-push-10 {
+    left: 83.33333333%;
+  }
+  .col-lg-push-9 {
+    left: 75%;
+  }
+  .col-lg-push-8 {
+    left: 66.66666667%;
+  }
+  .col-lg-push-7 {
+    left: 58.33333333%;
+  }
+  .col-lg-push-6 {
+    left: 50%;
+  }
+  .col-lg-push-5 {
+    left: 41.66666667%;
+  }
+  .col-lg-push-4 {
+    left: 33.33333333%;
+  }
+  .col-lg-push-3 {
+    left: 25%;
+  }
+  .col-lg-push-2 {
+    left: 16.66666667%;
+  }
+  .col-lg-push-1 {
+    left: 8.33333333%;
+  }
+  .col-lg-push-0 {
+    left: auto;
+  }
+  .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+  .col-lg-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-lg-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+  .col-lg-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-lg-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+  .col-lg-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-lg-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+  .col-lg-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-lg-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-lg-offset-0 {
+    margin-left: 0;
+  }
+}
+table {
+  background-color: transparent;
+}
+caption {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  color: #777;
+  text-align: left;
+}
+th {
+}
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+  padding: 8px;
+  line-height: 1.42857143;
+  vertical-align: top;
+  border-top: 1px solid #ddd;
+}
+.table > thead > tr > th {
+  vertical-align: bottom;
+  border-bottom: 2px solid #ddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+  border-top: 0;
+}
+.table > tbody + tbody {
+  border-top: 2px solid #ddd;
+}
+.table .table {
+  background-color: #fff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+  padding: 5px;
+}
+.table-bordered {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+  border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-of-type(odd) {
+  background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover {
+  background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+  position: static;
+  display: table-column;
+  float: none;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+  position: static;
+  display: table-cell;
+  float: none;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+  background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+  background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+  background-color: #d9edf7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+  background-color: #c4e3f3;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+  background-color: #fcf8e3;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+  background-color: #faf2cc;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+  background-color: #f2dede;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+  background-color: #ebcccc;
+}
+.table-responsive {
+  min-height: .01%;
+  overflow-x: auto;
+}
+ at media screen and (max-width: 767px) {
+  .table-responsive {
+    width: 100%;
+    margin-bottom: 15px;
+    overflow-y: hidden;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    border: 1px solid #ddd;
+  }
+  .table-responsive > .table {
+    margin-bottom: 0;
+  }
+  .table-responsive > .table > thead > tr > th,
+  .table-responsive > .table > tbody > tr > th,
+  .table-responsive > .table > tfoot > tr > th,
+  .table-responsive > .table > thead > tr > td,
+  .table-responsive > .table > tbody > tr > td,
+  .table-responsive > .table > tfoot > tr > td {
+    white-space: nowrap;
+  }
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
+}
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: inherit;
+  color: #333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal;
+}
+input[type="file"] {
+  display: block;
+}
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+}
+.form-control {
+  display: block;
+  width: 100%;
+  height: 34px;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.form-control:focus {
+  border-color: #66afe9;
+  outline: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+}
+.form-control::-moz-placeholder {
+  color: #999;
+  opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+  color: #999;
+}
+.form-control::-webkit-input-placeholder {
+  color: #999;
+}
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+  background-color: #eee;
+  opacity: 1;
+}
+.form-control[disabled],
+fieldset[disabled] .form-control {
+  cursor: not-allowed;
+}
+textarea.form-control {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-appearance: none;
+}
+ at media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"].form-control,
+  input[type="time"].form-control,
+  input[type="datetime-local"].form-control,
+  input[type="month"].form-control {
+    line-height: 34px;
+  }
+  input[type="date"].input-sm,
+  input[type="time"].input-sm,
+  input[type="datetime-local"].input-sm,
+  input[type="month"].input-sm,
+  .input-group-sm input[type="date"],
+  .input-group-sm input[type="time"],
+  .input-group-sm input[type="datetime-local"],
+  .input-group-sm input[type="month"] {
+    line-height: 30px;
+  }
+  input[type="date"].input-lg,
+  input[type="time"].input-lg,
+  input[type="datetime-local"].input-lg,
+  input[type="month"].input-lg,
+  .input-group-lg input[type="date"],
+  .input-group-lg input[type="time"],
+  .input-group-lg input[type="datetime-local"],
+  .input-group-lg input[type="month"] {
+    line-height: 46px;
+  }
+}
+.form-group {
+  margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+  min-height: 20px;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-top: 4px \9;
+  margin-left: -20px;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+  position: relative;
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  vertical-align: middle;
+  cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+  cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+  cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+  cursor: not-allowed;
+}
+.form-control-static {
+  min-height: 34px;
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0;
+}
+.form-control-static.input-lg,
+.form-control-static.input-sm {
+  padding-right: 0;
+  padding-left: 0;
+}
+.input-sm {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-sm {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+  height: auto;
+}
+.form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.form-group-sm select.form-control {
+  height: 30px;
+  line-height: 30px;
+}
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+  height: auto;
+}
+.form-group-sm .form-control-static {
+  height: 30px;
+  min-height: 32px;
+  padding: 6px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.input-lg {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-lg {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+  height: auto;
+}
+.form-group-lg .form-control {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.form-group-lg select.form-control {
+  height: 46px;
+  line-height: 46px;
+}
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+  height: auto;
+}
+.form-group-lg .form-control-static {
+  height: 46px;
+  min-height: 38px;
+  padding: 11px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+.has-feedback {
+  position: relative;
+}
+.has-feedback .form-control {
+  padding-right: 42.5px;
+}
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 34px;
+  height: 34px;
+  line-height: 34px;
+  text-align: center;
+  pointer-events: none;
+}
+.input-lg + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+  width: 46px;
+  height: 46px;
+  line-height: 46px;
+}
+.input-sm + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+  color: #3c763d;
+}
+.has-success .form-control {
+  border-color: #3c763d;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-success .form-control:focus {
+  border-color: #2b542c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #3c763d;
+}
+.has-success .form-control-feedback {
+  color: #3c763d;
+}
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+  color: #8a6d3b;
+}
+.has-warning .form-control {
+  border-color: #8a6d3b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-warning .form-control:focus {
+  border-color: #66512c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+}
+.has-warning .input-group-addon {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #8a6d3b;
+}
+.has-warning .form-control-feedback {
+  color: #8a6d3b;
+}
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+  color: #a94442;
+}
+.has-error .form-control {
+  border-color: #a94442;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-error .form-control:focus {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #a94442;
+}
+.has-error .form-control-feedback {
+  color: #a94442;
+}
+.has-feedback label ~ .form-control-feedback {
+  top: 25px;
+}
+.has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0;
+}
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #737373;
+}
+ at media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .form-control-static {
+    display: inline-block;
+  }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .form-inline .input-group .input-group-addon,
+  .form-inline .input-group .input-group-btn,
+  .form-inline .input-group .form-control {
+    width: auto;
+  }
+  .form-inline .input-group > .form-control {
+    width: 100%;
+  }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio,
+  .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio label,
+  .form-inline .checkbox label {
+    padding-left: 0;
+  }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  padding-top: 7px;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+  min-height: 27px;
+}
+.form-horizontal .form-group {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+ at media (min-width: 768px) {
+  .form-horizontal .control-label {
+    padding-top: 7px;
+    margin-bottom: 0;
+    text-align: right;
+  }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+  right: 15px;
+}
+ at media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 14.333333px;
+    font-size: 18px;
+  }
+}
+ at media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+    font-size: 12px;
+  }
+}
+.btn {
+  display: inline-block;
+  padding: 6px 12px;
+  margin-bottom: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  -ms-touch-action: manipulation;
+      touch-action: manipulation;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus,
+.btn.focus {
+  color: #333;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+          box-shadow: none;
+  opacity: .65;
+}
+a.btn.disabled,
+fieldset[disabled] a.btn {
+  pointer-events: none;
+}
+.btn-default {
+  color: #333;
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default:focus,
+.btn-default.focus {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #8c8c8c;
+}
+.btn-default:hover {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active:hover,
+.btn-default.active:hover,
+.open > .dropdown-toggle.btn-default:hover,
+.btn-default:active:focus,
+.btn-default.active:focus,
+.open > .dropdown-toggle.btn-default:focus,
+.btn-default:active.focus,
+.btn-default.active.focus,
+.open > .dropdown-toggle.btn-default.focus {
+  color: #333;
+  background-color: #d4d4d4;
+  border-color: #8c8c8c;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default .badge {
+  color: #fff;
+  background-color: #333;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.btn-primary:focus,
+.btn-primary.focus {
+  color: #fff;
+  background-color: #286090;
+  border-color: #122b40;
+}
+.btn-primary:hover {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.open > .dropdown-toggle.btn-primary:hover,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.open > .dropdown-toggle.btn-primary:focus,
+.btn-primary:active.focus,
+.btn-primary.active.focus,
+.open > .dropdown-toggle.btn-primary.focus {
+  color: #fff;
+  background-color: #204d74;
+  border-color: #122b40;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.btn-primary .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success:focus,
+.btn-success.focus {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #255625;
+}
+.btn-success:hover {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active:hover,
+.btn-success.active:hover,
+.open > .dropdown-toggle.btn-success:hover,
+.btn-success:active:focus,
+.btn-success.active:focus,
+.open > .dropdown-toggle.btn-success:focus,
+.btn-success:active.focus,
+.btn-success.active.focus,
+.open > .dropdown-toggle.btn-success.focus {
+  color: #fff;
+  background-color: #398439;
+  border-color: #255625;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success .badge {
+  color: #5cb85c;
+  background-color: #fff;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info:focus,
+.btn-info.focus {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #1b6d85;
+}
+.btn-info:hover {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active:hover,
+.btn-info.active:hover,
+.open > .dropdown-toggle.btn-info:hover,
+.btn-info:active:focus,
+.btn-info.active:focus,
+.open > .dropdown-toggle.btn-info:focus,
+.btn-info:active.focus,
+.btn-info.active.focus,
+.open > .dropdown-toggle.btn-info.focus {
+  color: #fff;
+  background-color: #269abc;
+  border-color: #1b6d85;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info .badge {
+  color: #5bc0de;
+  background-color: #fff;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning:focus,
+.btn-warning.focus {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #985f0d;
+}
+.btn-warning:hover {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active:hover,
+.btn-warning.active:hover,
+.open > .dropdown-toggle.btn-warning:hover,
+.btn-warning:active:focus,
+.btn-warning.active:focus,
+.open > .dropdown-toggle.btn-warning:focus,
+.btn-warning:active.focus,
+.btn-warning.active.focus,
+.open > .dropdown-toggle.btn-warning.focus {
+  color: #fff;
+  background-color: #d58512;
+  border-color: #985f0d;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning .badge {
+  color: #f0ad4e;
+  background-color: #fff;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger:focus,
+.btn-danger.focus {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #761c19;
+}
+.btn-danger:hover {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active:hover,
+.btn-danger.active:hover,
+.open > .dropdown-toggle.btn-danger:hover,
+.btn-danger:active:focus,
+.btn-danger.active:focus,
+.open > .dropdown-toggle.btn-danger:focus,
+.btn-danger:active.focus,
+.btn-danger.active.focus,
+.open > .dropdown-toggle.btn-danger.focus {
+  color: #fff;
+  background-color: #ac2925;
+  border-color: #761c19;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger .badge {
+  color: #d9534f;
+  background-color: #fff;
+}
+.btn-link {
+  font-weight: normal;
+  color: #337ab7;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #23527c;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #777;
+  text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+  padding: 1px 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity .15s linear;
+       -o-transition: opacity .15s linear;
+          transition: opacity .15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  display: none;
+}
+.collapse.in {
+  display: block;
+}
+tr.collapse.in {
+  display: table-row;
+}
+tbody.collapse.in {
+  display: table-row-group;
+}
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition-timing-function: ease;
+       -o-transition-timing-function: ease;
+          transition-timing-function: ease;
+  -webkit-transition-duration: .35s;
+       -o-transition-duration: .35s;
+          transition-duration: .35s;
+  -webkit-transition-property: height, visibility;
+       -o-transition-property: height, visibility;
+          transition-property: height, visibility;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px dashed;
+  border-top: 4px solid \9;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+}
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle:focus {
+  outline: 0;
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  font-size: 14px;
+  text-align: left;
+  list-style: none;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .15);
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 1.42857143;
+  color: #333;
+  white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  color: #262626;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #fff;
+  text-decoration: none;
+  background-color: #337ab7;
+  outline: 0;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #777;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.open > .dropdown-menu {
+  display: block;
+}
+.open > a {
+  outline: 0;
+}
+.dropdown-menu-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu-left {
+  right: auto;
+  left: 0;
+}
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #777;
+  white-space: nowrap;
+}
+.dropdown-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 990;
+}
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  content: "";
+  border-top: 0;
+  border-bottom: 4px dashed;
+  border-bottom: 4px solid \9;
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
+}
+ at media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    right: 0;
+    left: auto;
+  }
+  .navbar-right .dropdown-menu-left {
+    right: auto;
+    left: 0;
+  }
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar {
+  margin-left: -5px;
+}
+.btn-toolbar .btn,
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-right: 8px;
+  padding-left: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-right: 12px;
+  padding-left: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  border-bottom-left-radius: 4px;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+  display: table-cell;
+  float: none;
+  width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+  width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+  left: auto;
+}
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+.input-group[class*="col-"] {
+  float: none;
+  padding-right: 0;
+  padding-left: 0;
+}
+.input-group .form-control {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.input-group-addon {
+  padding: 6px 12px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #555;
+  text-align: center;
+  background-color: #eee;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+.input-group-addon.input-sm {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+.input-group-addon.input-lg {
+  padding: 10px 16px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.input-group-addon:first-child {
+  border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.input-group-addon:last-child {
+  border-left: 0;
+}
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-group-btn > .btn {
+  position: relative;
+}
+.input-group-btn > .btn + .btn {
+  margin-left: -1px;
+}
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+  z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  z-index: 2;
+  margin-left: -1px;
+}
+.nav {
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none;
+}
+.nav > li {
+  position: relative;
+  display: block;
+}
+.nav > li > a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.nav > li.disabled > a {
+  color: #777;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+  color: #777;
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+  background-color: #eee;
+  border-color: #337ab7;
+}
+.nav .nav-divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.nav > li > a > img {
+  max-width: none;
+}
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+  float: left;
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  margin-right: 2px;
+  line-height: 1.42857143;
+  border: 1px solid transparent;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eee #eee #ddd;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+  color: #555;
+  cursor: default;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+.nav-tabs.nav-justified {
+  width: 100%;
+  border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+  float: none;
+}
+.nav-tabs.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+ at media (min-width: 768px) {
+  .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-tabs.nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+ at media (min-width: 768px) {
+  .nav-tabs.nav-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs.nav-justified > .active > a,
+  .nav-tabs.nav-justified > .active > a:hover,
+  .nav-tabs.nav-justified > .active > a:focus {
+    border-bottom-color: #fff;
+  }
+}
+.nav-pills > li {
+  float: left;
+}
+.nav-pills > li > a {
+  border-radius: 4px;
+}
+.nav-pills > li + li {
+  margin-left: 2px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+  color: #fff;
+  background-color: #337ab7;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li + li {
+  margin-top: 2px;
+  margin-left: 0;
+}
+.nav-justified {
+  width: 100%;
+}
+.nav-justified > li {
+  float: none;
+}
+.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+ at media (min-width: 768px) {
+  .nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs-justified {
+  border-bottom: 0;
+}
+.nav-tabs-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+ at media (min-width: 768px) {
+  .nav-tabs-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs-justified > .active > a,
+  .nav-tabs-justified > .active > a:hover,
+  .nav-tabs-justified > .active > a:focus {
+    border-bottom-color: #fff;
+  }
+}
+.tab-content > .tab-pane {
+  display: none;
+}
+.tab-content > .active {
+  display: block;
+}
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.navbar {
+  position: relative;
+  min-height: 50px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+}
+ at media (min-width: 768px) {
+  .navbar {
+    border-radius: 4px;
+  }
+}
+ at media (min-width: 768px) {
+  .navbar-header {
+    float: left;
+  }
+}
+.navbar-collapse {
+  padding-right: 15px;
+  padding-left: 15px;
+  overflow-x: visible;
+  -webkit-overflow-scrolling: touch;
+  border-top: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+}
+.navbar-collapse.in {
+  overflow-y: auto;
+}
+ at media (min-width: 768px) {
+  .navbar-collapse {
+    width: auto;
+    border-top: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-collapse.collapse {
+    display: block !important;
+    height: auto !important;
+    padding-bottom: 0;
+    overflow: visible !important;
+  }
+  .navbar-collapse.in {
+    overflow-y: visible;
+  }
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-static-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+ at media (max-device-width: 480px) and (orientation: landscape) {
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+ at media (min-width: 768px) {
+  .container > .navbar-header,
+  .container-fluid > .navbar-header,
+  .container > .navbar-collapse,
+  .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
+}
+.navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px;
+}
+ at media (min-width: 768px) {
+  .navbar-static-top {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+ at media (min-width: 768px) {
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0;
+  border-width: 1px 0 0;
+}
+.navbar-brand {
+  float: left;
+  height: 50px;
+  padding: 15px 15px;
+  font-size: 18px;
+  line-height: 20px;
+}
+.navbar-brand:hover,
+.navbar-brand:focus {
+  text-decoration: none;
+}
+.navbar-brand > img {
+  display: block;
+}
+ at media (min-width: 768px) {
+  .navbar > .container .navbar-brand,
+  .navbar > .container-fluid .navbar-brand {
+    margin-left: -15px;
+  }
+}
+.navbar-toggle {
+  position: relative;
+  float: right;
+  padding: 9px 10px;
+  margin-top: 8px;
+  margin-right: 15px;
+  margin-bottom: 8px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.navbar-toggle:focus {
+  outline: 0;
+}
+.navbar-toggle .icon-bar {
+  display: block;
+  width: 22px;
+  height: 2px;
+  border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+  margin-top: 4px;
+}
+ at media (min-width: 768px) {
+  .navbar-toggle {
+    display: none;
+  }
+}
+.navbar-nav {
+  margin: 7.5px -15px;
+}
+.navbar-nav > li > a {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  line-height: 20px;
+}
+ at media (max-width: 767px) {
+  .navbar-nav .open .dropdown-menu {
+    position: static;
+    float: none;
+    width: auto;
+    margin-top: 0;
+    background-color: transparent;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-nav .open .dropdown-menu > li > a,
+  .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 5px 15px 5px 25px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a {
+    line-height: 20px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-nav .open .dropdown-menu > li > a:focus {
+    background-image: none;
+  }
+}
+ at media (min-width: 768px) {
+  .navbar-nav {
+    float: left;
+    margin: 0;
+  }
+  .navbar-nav > li {
+    float: left;
+  }
+  .navbar-nav > li > a {
+    padding-top: 15px;
+    padding-bottom: 15px;
+  }
+}
+.navbar-form {
+  padding: 10px 15px;
+  margin-top: 8px;
+  margin-right: -15px;
+  margin-bottom: 8px;
+  margin-left: -15px;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+}
+ at media (min-width: 768px) {
+  .navbar-form .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control-static {
+    display: inline-block;
+  }
+  .navbar-form .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .navbar-form .input-group .input-group-addon,
+  .navbar-form .input-group .input-group-btn,
+  .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio,
+  .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio label,
+  .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  .navbar-form .radio input[type="radio"],
+  .navbar-form .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+ at media (max-width: 767px) {
+  .navbar-form .form-group {
+    margin-bottom: 5px;
+  }
+  .navbar-form .form-group:last-child {
+    margin-bottom: 0;
+  }
+}
+ at media (min-width: 768px) {
+  .navbar-form {
+    width: auto;
+    padding-top: 0;
+    padding-bottom: 0;
+    margin-right: 0;
+    margin-left: 0;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+}
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.navbar-btn {
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+.navbar-btn.btn-sm {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.navbar-btn.btn-xs {
+  margin-top: 14px;
+  margin-bottom: 14px;
+}
+.navbar-text {
+  margin-top: 15px;
+  margin-bottom: 15px;
+}
+ at media (min-width: 768px) {
+  .navbar-text {
+    float: left;
+    margin-right: 15px;
+    margin-left: 15px;
+  }
+}
+ at media (min-width: 768px) {
+  .navbar-left {
+    float: left !important;
+  }
+  .navbar-right {
+    float: right !important;
+    margin-right: -15px;
+  }
+  .navbar-right ~ .navbar-right {
+    margin-right: 0;
+  }
+}
+.navbar-default {
+  background-color: #f8f8f8;
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+  color: #777;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+  color: #5e5e5e;
+  background-color: transparent;
+}
+.navbar-default .navbar-text {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+  color: #333;
+  background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+  color: #ccc;
+  background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+  border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+  background-color: #ddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+ at media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #777;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #333;
+    background-color: transparent;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #555;
+    background-color: #e7e7e7;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #ccc;
+    background-color: transparent;
+  }
+}
+.navbar-default .navbar-link {
+  color: #777;
+}
+.navbar-default .navbar-link:hover {
+  color: #333;
+}
+.navbar-default .btn-link {
+  color: #777;
+}
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+  color: #333;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+  color: #ccc;
+}
+.navbar-inverse {
+  background-color: #222;
+  border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+  color: #444;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+  border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+  background-color: #333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+  background-color: #fff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+  border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+ at media (max-width: 767px) {
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+    border-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+    color: #9d9d9d;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #fff;
+    background-color: transparent;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #444;
+    background-color: transparent;
+  }
+}
+.navbar-inverse .navbar-link {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #fff;
+}
+.navbar-inverse .btn-link {
+  color: #9d9d9d;
+}
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+  color: #fff;
+}
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+  color: #444;
+}
+.breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+}
+.breadcrumb > li {
+  display: inline-block;
+}
+.breadcrumb > li + li:before {
+  padding: 0 5px;
+  color: #ccc;
+  content: "/\00a0";
+}
+.breadcrumb > .active {
+  color: #777;
+}
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: 20px 0;
+  border-radius: 4px;
+}
+.pagination > li {
+  display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+  position: relative;
+  float: left;
+  padding: 6px 12px;
+  margin-left: -1px;
+  line-height: 1.42857143;
+  color: #337ab7;
+  text-decoration: none;
+  background-color: #fff;
+  border: 1px solid #ddd;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+  margin-left: 0;
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+  z-index: 3;
+  color: #23527c;
+  background-color: #eee;
+  border-color: #ddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+  z-index: 2;
+  color: #fff;
+  cursor: default;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+  border-color: #ddd;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+}
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+  border-top-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.pager {
+  padding-left: 0;
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+}
+.pager li {
+  display: inline;
+}
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+}
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+}
+a.label:hover,
+a.label:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label:empty {
+  display: none;
+}
+.btn .label {
+  position: relative;
+  top: -1px;
+}
+.label-default {
+  background-color: #777;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+  background-color: #5e5e5e;
+}
+.label-primary {
+  background-color: #337ab7;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+  background-color: #286090;
+}
+.label-success {
+  background-color: #5cb85c;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+  background-color: #449d44;
+}
+.label-info {
+  background-color: #5bc0de;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+  background-color: #31b0d5;
+}
+.label-warning {
+  background-color: #f0ad4e;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+  background-color: #ec971f;
+}
+.label-danger {
+  background-color: #d9534f;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+  background-color: #c9302c;
+}
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  background-color: #777;
+  border-radius: 10px;
+}
+.badge:empty {
+  display: none;
+}
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-xs .badge,
+.btn-group-xs > .btn .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.list-group-item > .badge {
+  float: right;
+}
+.list-group-item > .badge + .badge {
+  margin-right: 5px;
+}
+.nav-pills > li > a > .badge {
+  margin-left: 3px;
+}
+.jumbotron {
+  padding-top: 30px;
+  padding-bottom: 30px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: #eee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+  color: inherit;
+}
+.jumbotron p {
+  margin-bottom: 15px;
+  font-size: 21px;
+  font-weight: 200;
+}
+.jumbotron > hr {
+  border-top-color: #d5d5d5;
+}
+.container .jumbotron,
+.container-fluid .jumbotron {
+  border-radius: 6px;
+}
+.jumbotron .container {
+  max-width: 100%;
+}
+ at media screen and (min-width: 768px) {
+  .jumbotron {
+    padding-top: 48px;
+    padding-bottom: 48px;
+  }
+  .container .jumbotron,
+  .container-fluid .jumbotron {
+    padding-right: 60px;
+    padding-left: 60px;
+  }
+  .jumbotron h1,
+  .jumbotron .h1 {
+    font-size: 63px;
+  }
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  margin-bottom: 20px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: border .2s ease-in-out;
+       -o-transition: border .2s ease-in-out;
+          transition: border .2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+  margin-right: auto;
+  margin-left: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: #337ab7;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #333;
+}
+.alert {
+  padding: 15px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.alert h4 {
+  margin-top: 0;
+  color: inherit;
+}
+.alert .alert-link {
+  font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+  margin-bottom: 0;
+}
+.alert > p + p {
+  margin-top: 5px;
+}
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
+}
+.alert-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.alert-success hr {
+  border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+  color: #2b542c;
+}
+.alert-info {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.alert-info hr {
+  border-top-color: #a6e1ec;
+}
+.alert-info .alert-link {
+  color: #245269;
+}
+.alert-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.alert-warning hr {
+  border-top-color: #f7e1b5;
+}
+.alert-warning .alert-link {
+  color: #66512c;
+}
+.alert-danger {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.alert-danger hr {
+  border-top-color: #e4b9c0;
+}
+.alert-danger .alert-link {
+  color: #843534;
+}
+ at -webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+ at -o-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+ at keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+}
+.progress-bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  line-height: 20px;
+  color: #fff;
+  text-align: center;
+  background-color: #337ab7;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+  -webkit-transition: width .6s ease;
+       -o-transition: width .6s ease;
+          transition: width .6s ease;
+}
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+.progress.active .progress-bar,
+.progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar-success {
+  background-color: #5cb85c;
+}
+.progress-striped .progress-bar-success {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-info {
+  background-color: #5bc0de;
+}
+.progress-striped .progress-bar-info {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-warning {
+  background-color: #f0ad4e;
+}
+.progress-striped .progress-bar-warning {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-danger {
+  background-color: #d9534f;
+}
+.progress-striped .progress-bar-danger {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.media {
+  margin-top: 15px;
+}
+.media:first-child {
+  margin-top: 0;
+}
+.media,
+.media-body {
+  overflow: hidden;
+  zoom: 1;
+}
+.media-body {
+  width: 10000px;
+}
+.media-object {
+  display: block;
+}
+.media-object.img-thumbnail {
+  max-width: none;
+}
+.media-right,
+.media > .pull-right {
+  padding-left: 10px;
+}
+.media-left,
+.media > .pull-left {
+  padding-right: 10px;
+}
+.media-left,
+.media-right,
+.media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+.media-middle {
+  vertical-align: middle;
+}
+.media-bottom {
+  vertical-align: bottom;
+}
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.media-list {
+  padding-left: 0;
+  list-style: none;
+}
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+}
+.list-group-item:first-child {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+}
+.list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+a.list-group-item,
+button.list-group-item {
+  color: #555;
+}
+a.list-group-item .list-group-item-heading,
+button.list-group-item .list-group-item-heading {
+  color: #333;
+}
+a.list-group-item:hover,
+button.list-group-item:hover,
+a.list-group-item:focus,
+button.list-group-item:focus {
+  color: #555;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+button.list-group-item {
+  width: 100%;
+  text-align: left;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #eee;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+  color: #777;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  z-index: 2;
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+  color: #c7ddef;
+}
+.list-group-item-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+}
+a.list-group-item-success,
+button.list-group-item-success {
+  color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading,
+button.list-group-item-success .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-success:hover,
+button.list-group-item-success:hover,
+a.list-group-item-success:focus,
+button.list-group-item-success:focus {
+  color: #3c763d;
+  background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+button.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+button.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus,
+button.list-group-item-success.active:focus {
+  color: #fff;
+  background-color: #3c763d;
+  border-color: #3c763d;
+}
+.list-group-item-info {
+  color: #31708f;
+  background-color: #d9edf7;
+}
+a.list-group-item-info,
+button.list-group-item-info {
+  color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading,
+button.list-group-item-info .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-info:hover,
+button.list-group-item-info:hover,
+a.list-group-item-info:focus,
+button.list-group-item-info:focus {
+  color: #31708f;
+  background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+button.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+button.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus,
+button.list-group-item-info.active:focus {
+  color: #fff;
+  background-color: #31708f;
+  border-color: #31708f;
+}
+.list-group-item-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+}
+a.list-group-item-warning,
+button.list-group-item-warning {
+  color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading,
+button.list-group-item-warning .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-warning:hover,
+button.list-group-item-warning:hover,
+a.list-group-item-warning:focus,
+button.list-group-item-warning:focus {
+  color: #8a6d3b;
+  background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+button.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+button.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus,
+button.list-group-item-warning.active:focus {
+  color: #fff;
+  background-color: #8a6d3b;
+  border-color: #8a6d3b;
+}
+.list-group-item-danger {
+  color: #a94442;
+  background-color: #f2dede;
+}
+a.list-group-item-danger,
+button.list-group-item-danger {
+  color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading,
+button.list-group-item-danger .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-danger:hover,
+button.list-group-item-danger:hover,
+a.list-group-item-danger:focus,
+button.list-group-item-danger:focus {
+  color: #a94442;
+  background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+button.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+button.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus,
+button.list-group-item-danger.active:focus {
+  color: #fff;
+  background-color: #a94442;
+  border-color: #a94442;
+}
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
+.panel {
+  margin-bottom: 20px;
+  background-color: #fff;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+.panel-body {
+  padding: 15px;
+}
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 16px;
+  color: inherit;
+}
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+  color: inherit;
+}
+.panel-footer {
+  padding: 10px 15px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+  margin-bottom: 0;
+}
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+  border-width: 1px 0;
+  border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+  border-top: 0;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+  border-top: 1px solid #ddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+  border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+  border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+.panel > .table-responsive {
+  margin-bottom: 0;
+  border: 0;
+}
+.panel-group {
+  margin-bottom: 20px;
+}
+.panel-group .panel {
+  margin-bottom: 0;
+  border-radius: 4px;
+}
+.panel-group .panel + .panel {
+  margin-top: 5px;
+}
+.panel-group .panel-heading {
+  border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+  border-top: 1px solid #ddd;
+}
+.panel-group .panel-footer {
+  border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+  border-bottom: 1px solid #ddd;
+}
+.panel-default {
+  border-color: #ddd;
+}
+.panel-default > .panel-heading {
+  color: #333;
+  background-color: #f5f5f5;
+  border-color: #ddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ddd;
+}
+.panel-default > .panel-heading .badge {
+  color: #f5f5f5;
+  background-color: #333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ddd;
+}
+.panel-primary {
+  border-color: #337ab7;
+}
+.panel-primary > .panel-heading {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #337ab7;
+}
+.panel-primary > .panel-heading .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #337ab7;
+}
+.panel-success {
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+  color: #dff0d8;
+  background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #d6e9c6;
+}
+.panel-info {
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #bce8f1;
+}
+.panel-info > .panel-heading .badge {
+  color: #d9edf7;
+  background-color: #31708f;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #bce8f1;
+}
+.panel-warning {
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #faebcc;
+}
+.panel-warning > .panel-heading .badge {
+  color: #fcf8e3;
+  background-color: #8a6d3b;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #faebcc;
+}
+.panel-danger {
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ebccd1;
+}
+.panel-danger > .panel-heading .badge {
+  color: #f2dede;
+  background-color: #a94442;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ebccd1;
+}
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border: 0;
+}
+.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, .15);
+}
+.well-lg {
+  padding: 24px;
+  border-radius: 6px;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: 3px;
+}
+.close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  filter: alpha(opacity=20);
+  opacity: .2;
+}
+.close:hover,
+.close:focus {
+  color: #000;
+  text-decoration: none;
+  cursor: pointer;
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+button.close {
+  -webkit-appearance: none;
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+}
+.modal-open {
+  overflow: hidden;
+}
+.modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  overflow: hidden;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.modal.fade .modal-dialog {
+  -webkit-transition: -webkit-transform .3s ease-out;
+       -o-transition:      -o-transform .3s ease-out;
+          transition:         transform .3s ease-out;
+  -webkit-transform: translate(0, -25%);
+      -ms-transform: translate(0, -25%);
+       -o-transform: translate(0, -25%);
+          transform: translate(0, -25%);
+}
+.modal.in .modal-dialog {
+  -webkit-transform: translate(0, 0);
+      -ms-transform: translate(0, 0);
+       -o-transform: translate(0, 0);
+          transform: translate(0, 0);
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+.modal-content {
+  position: relative;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  outline: 0;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000;
+}
+.modal-backdrop.fade {
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+.modal-backdrop.in {
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.modal-header {
+  min-height: 16.42857143px;
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
+}
+.modal-header .close {
+  margin-top: -2px;
+}
+.modal-title {
+  margin: 0;
+  line-height: 1.42857143;
+}
+.modal-body {
+  position: relative;
+  padding: 15px;
+}
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5;
+}
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+ at media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+  }
+  .modal-sm {
+    width: 300px;
+  }
+}
+ at media (min-width: 992px) {
+  .modal-lg {
+    width: 900px;
+  }
+}
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 12px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  filter: alpha(opacity=0);
+  opacity: 0;
+
+  line-break: auto;
+}
+.tooltip.in {
+  filter: alpha(opacity=90);
+  opacity: .9;
+}
+.tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+.tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+.tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+.tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #fff;
+  text-align: center;
+  background-color: #000;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-left .tooltip-arrow {
+  right: 5px;
+  bottom: 0;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+
+  line-break: auto;
+}
+.popover.top {
+  margin-top: -10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-left: -10px;
+}
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: 5px 5px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover > .arrow {
+  border-width: 11px;
+}
+.popover > .arrow:after {
+  content: "";
+  border-width: 10px;
+}
+.popover.top > .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, .25);
+  border-bottom-width: 0;
+}
+.popover.top > .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-color: #fff;
+  border-bottom-width: 0;
+}
+.popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, .25);
+  border-left-width: 0;
+}
+.popover.right > .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  content: " ";
+  border-right-color: #fff;
+  border-left-width: 0;
+}
+.popover.bottom > .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, .25);
+}
+.popover.bottom > .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-width: 0;
+  border-bottom-color: #fff;
+}
+.popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, .25);
+}
+.popover.left > .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  content: " ";
+  border-right-width: 0;
+  border-left-color: #fff;
+}
+.carousel {
+  position: relative;
+}
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+.carousel-inner > .item {
+  position: relative;
+  display: none;
+  -webkit-transition: .6s ease-in-out left;
+       -o-transition: .6s ease-in-out left;
+          transition: .6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  line-height: 1;
+}
+ at media all and (transform-3d), (-webkit-transform-3d) {
+  .carousel-inner > .item {
+    -webkit-transition: -webkit-transform .6s ease-in-out;
+         -o-transition:      -o-transform .6s ease-in-out;
+            transition:         transform .6s ease-in-out;
+
+    -webkit-backface-visibility: hidden;
+            backface-visibility: hidden;
+    -webkit-perspective: 1000px;
+            perspective: 1000px;
+  }
+  .carousel-inner > .item.next,
+  .carousel-inner > .item.active.right {
+    left: 0;
+    -webkit-transform: translate3d(100%, 0, 0);
+            transform: translate3d(100%, 0, 0);
+  }
+  .carousel-inner > .item.prev,
+  .carousel-inner > .item.active.left {
+    left: 0;
+    -webkit-transform: translate3d(-100%, 0, 0);
+            transform: translate3d(-100%, 0, 0);
+  }
+  .carousel-inner > .item.next.left,
+  .carousel-inner > .item.prev.right,
+  .carousel-inner > .item.active {
+    left: 0;
+    -webkit-transform: translate3d(0, 0, 0);
+            transform: translate3d(0, 0, 0);
+  }
+}
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+.carousel-inner > .active {
+  left: 0;
+}
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel-inner > .next {
+  left: 100%;
+}
+.carousel-inner > .prev {
+  left: -100%;
+}
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+.carousel-inner > .active.left {
+  left: -100%;
+}
+.carousel-inner > .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 15%;
+  font-size: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.carousel-control.left {
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control.right {
+  right: 0;
+  left: auto;
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #fff;
+  text-decoration: none;
+  filter: alpha(opacity=90);
+  outline: 0;
+  opacity: .9;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+  position: absolute;
+  top: 50%;
+  z-index: 5;
+  display: inline-block;
+  margin-top: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+  width: 20px;
+  height: 20px;
+  font-family: serif;
+  line-height: 1;
+}
+.carousel-control .icon-prev:before {
+  content: '\2039';
+}
+.carousel-control .icon-next:before {
+  content: '\203a';
+}
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  padding-left: 0;
+  margin-left: -30%;
+  text-align: center;
+  list-style: none;
+}
+.carousel-indicators li {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  margin: 1px;
+  text-indent: -999px;
+  cursor: pointer;
+  background-color: #000 \9;
+  background-color: rgba(0, 0, 0, 0);
+  border: 1px solid #fff;
+  border-radius: 10px;
+}
+.carousel-indicators .active {
+  width: 12px;
+  height: 12px;
+  margin: 0;
+  background-color: #fff;
+}
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+}
+.carousel-caption .btn {
+  text-shadow: none;
+}
+ at media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-prev,
+  .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -15px;
+    font-size: 30px;
+  }
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: -15px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-right: -15px;
+  }
+  .carousel-caption {
+    right: 20%;
+    left: 20%;
+    padding-bottom: 30px;
+  }
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: " ";
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-footer:after {
+  clear: both;
+}
+.center-block {
+  display: block;
+  margin-right: auto;
+  margin-left: auto;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
+.hide {
+  display: none !important;
+}
+.show {
+  display: block !important;
+}
+.invisible {
+  visibility: hidden;
+}
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.hidden {
+  display: none !important;
+}
+.affix {
+  position: fixed;
+}
+ at -ms-viewport {
+  width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+  display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+ at media (max-width: 767px) {
+  .visible-xs {
+    display: block !important;
+  }
+  table.visible-xs {
+    display: table !important;
+  }
+  tr.visible-xs {
+    display: table-row !important;
+  }
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important;
+  }
+}
+ at media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important;
+  }
+}
+ at media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important;
+  }
+}
+ at media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+ at media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important;
+  }
+  table.visible-sm {
+    display: table !important;
+  }
+  tr.visible-sm {
+    display: table-row !important;
+  }
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important;
+  }
+}
+ at media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important;
+  }
+}
+ at media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important;
+  }
+}
+ at media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+ at media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important;
+  }
+  table.visible-md {
+    display: table !important;
+  }
+  tr.visible-md {
+    display: table-row !important;
+  }
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important;
+  }
+}
+ at media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important;
+  }
+}
+ at media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important;
+  }
+}
+ at media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+ at media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important;
+  }
+  table.visible-lg {
+    display: table !important;
+  }
+  tr.visible-lg {
+    display: table-row !important;
+  }
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important;
+  }
+}
+ at media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important;
+  }
+}
+ at media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important;
+  }
+}
+ at media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+ at media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important;
+  }
+}
+ at media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important;
+  }
+}
+ at media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important;
+  }
+}
+ at media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+ at media print {
+  .visible-print {
+    display: block !important;
+  }
+  table.visible-print {
+    display: table !important;
+  }
+  tr.visible-print {
+    display: table-row !important;
+  }
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important;
+  }
+}
+.visible-print-block {
+  display: none !important;
+}
+ at media print {
+  .visible-print-block {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+}
+ at media print {
+  .visible-print-inline {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+}
+ at media print {
+  .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+ at media print {
+  .hidden-print {
+    display: none !important;
+  }
+}
+/*# sourceMappingURL=bootstrap.css.map */
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css.map b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css.map
new file mode 100644
index 0000000..04d086d
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.les [...]
\ No newline at end of file
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.min.css b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.min.css
new file mode 100644
index 0000000..9dc0f97
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/cerulean.min.css b/inst/rmd/h/bootstrap-3.3.5/css/cerulean.min.css
new file mode 100644
index 0000000..3856850
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/cerulean.min.css
@@ -0,0 +1,11 @@
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/cosmo.min.css b/inst/rmd/h/bootstrap-3.3.5/css/cosmo.min.css
new file mode 100644
index 0000000..23aaa5a
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/cosmo.min.css
@@ -0,0 +1,30 @@
+ at font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(fonts/SourceSansProLight.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/SourceSansPro.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/SourceSansProBold.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/flatly.min.css b/inst/rmd/h/bootstrap-3.3.5/css/flatly.min.css
new file mode 100644
index 0000000..e0ee873
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/flatly.min.css
@@ -0,0 +1,30 @@
+ at font-face {
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/Lato.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/LatoBold.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Lato';
+  font-style: italic;
+  font-weight: 400;
+  src: url(fonts/LatoItalic.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/Lato.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/Lato.ttf
new file mode 100644
index 0000000..7608bc3
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/Lato.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoBold.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoBold.ttf
new file mode 100644
index 0000000..e8b9bf6
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoBold.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoItalic.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoItalic.ttf
new file mode 100644
index 0000000..7c83198
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/LatoItalic.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycle.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycle.ttf
new file mode 100644
index 0000000..9ce66cb
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycle.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycleBold.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycleBold.ttf
new file mode 100644
index 0000000..d5b3c6c
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/NewsCycleBold.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSans.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSans.ttf
new file mode 100644
index 0000000..5597cf3
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSans.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansBold.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansBold.ttf
new file mode 100644
index 0000000..b6abcea
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansBold.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansBoldItalic.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansBoldItalic.ttf
new file mode 100644
index 0000000..4653586
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansBoldItalic.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansItalic.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansItalic.ttf
new file mode 100644
index 0000000..7c79aae
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansItalic.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansLight.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansLight.ttf
new file mode 100644
index 0000000..d7d7cd1
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansLight.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansLightItalic.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansLightItalic.ttf
new file mode 100644
index 0000000..716c390
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/OpenSansLightItalic.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/Raleway.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/Raleway.ttf
new file mode 100644
index 0000000..3b354c8
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/Raleway.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/RalewayBold.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/RalewayBold.ttf
new file mode 100644
index 0000000..adc44af
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/RalewayBold.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/Roboto.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/Roboto.ttf
new file mode 100644
index 0000000..7b25f3c
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/Roboto.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoBold.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoBold.ttf
new file mode 100644
index 0000000..19090af
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoBold.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoLight.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoLight.ttf
new file mode 100644
index 0000000..66bc5ab
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoLight.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoMedium.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoMedium.ttf
new file mode 100644
index 0000000..8d6fa92
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/RobotoMedium.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansPro.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansPro.ttf
new file mode 100644
index 0000000..950ff8b
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansPro.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProBold.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProBold.ttf
new file mode 100644
index 0000000..cfe7065
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProBold.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProItalic.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProItalic.ttf
new file mode 100644
index 0000000..0cf2e43
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProItalic.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProLight.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProLight.ttf
new file mode 100644
index 0000000..5d8a996
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/SourceSansProLight.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/fonts/Ubuntu.ttf b/inst/rmd/h/bootstrap-3.3.5/css/fonts/Ubuntu.ttf
new file mode 100644
index 0000000..18fecfa
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/css/fonts/Ubuntu.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/journal.min.css b/inst/rmd/h/bootstrap-3.3.5/css/journal.min.css
new file mode 100644
index 0000000..e59c763
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/journal.min.css
@@ -0,0 +1,24 @@
+ at font-face {
+  font-family: 'News Cycle';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/NewsCycle.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'News Cycle';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/NewsCycleBold.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/lumen.min.css b/inst/rmd/h/bootstrap-3.3.5/css/lumen.min.css
new file mode 100644
index 0000000..2f221d7
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/lumen.min.css
@@ -0,0 +1,37 @@
+ at font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(fonts/SourceSansProLight.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/SourceSansPro.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/SourceSansProBold.ttf) format('truetype');
+}
+
+ at font-face {
+  font-family: 'Source Sans Pro';
+  font-style: italic;
+  font-weight: 400;
+  src: url(fonts/SourceSansProItalic.ttf) format('truetype');
+}
+
+/*
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/paper.min.css b/inst/rmd/h/bootstrap-3.3.5/css/paper.min.css
new file mode 100644
index 0000000..3b06a7b
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/paper.min.css
@@ -0,0 +1,36 @@
+ at font-face {
+  font-family: 'Roboto';
+  font-style: normal;
+  font-weight: 300;
+  src: url(fonts/RobotoLight.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Roboto';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/Roboto.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Roboto';
+  font-style: normal;
+  font-weight: 500;
+  src: url(fonts/RobotoMedium.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Roboto';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/RobotoBold.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/readable.min.css b/inst/rmd/h/bootstrap-3.3.5/css/readable.min.css
new file mode 100644
index 0000000..8c0c7de
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/readable.min.css
@@ -0,0 +1,24 @@
+ at font-face {
+  font-family: 'Raleway';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/Raleway.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Raleway';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/RalewayBold.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/sandstone.min.css b/inst/rmd/h/bootstrap-3.3.5/css/sandstone.min.css
new file mode 100644
index 0000000..e56d3c5
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/sandstone.min.css
@@ -0,0 +1,24 @@
+ at font-face {
+  font-family: 'Roboto';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/Roboto.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Roboto';
+  font-style: normal;
+  font-weight: 500;
+  src: url(fonts/RobotoMedium.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/simplex.min.css b/inst/rmd/h/bootstrap-3.3.5/css/simplex.min.css
new file mode 100644
index 0000000..e2eb449
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/simplex.min.css
@@ -0,0 +1,24 @@
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/OpenSans.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/OpenSansBold.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/spacelab.min.css b/inst/rmd/h/bootstrap-3.3.5/css/spacelab.min.css
new file mode 100644
index 0000000..25ab090
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/spacelab.min.css
@@ -0,0 +1,36 @@
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/OpenSans.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/OpenSansBold.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 400;
+  src: url(fonts/OpenSansItalic.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 700;
+  src: url(fonts/OpenSansBoldItalic.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/united.min.css b/inst/rmd/h/bootstrap-3.3.5/css/united.min.css
new file mode 100644
index 0000000..28c1aab
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/united.min.css
@@ -0,0 +1,18 @@
+ at font-face {
+  font-family: 'Ubuntu';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/Ubuntu.ttf) format('truetype');
+}
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/css/yeti.min.css b/inst/rmd/h/bootstrap-3.3.5/css/yeti.min.css
new file mode 100644
index 0000000..e60830f
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/css/yeti.min.css
@@ -0,0 +1,50 @@
+
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 300;
+  src: url(fonts/OpenSansLight.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 400;
+  src: url(fonts/OpenSans.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 700;
+  src: url(fonts/OpenSansBold.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 300;
+  src: url(fonts/OpenSansLightItalic.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 400;
+  src: url(fonts/OpenSansItalic.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 700;
+  src: url(fonts/OpenSansBoldItalic.ttf) format('truetype');
+}
+
+
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2015 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr [...]
diff --git a/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.eot b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.eot differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.svg b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..94fb549
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 15 [...]
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 1 [...]
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 1 [...]
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-2 [...]
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t- [...]
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21  [...]
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 [...]
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21  [...]
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5  [...]
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17. [...]
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h [...]
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 9 [...]
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5  [...]
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 [...]
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -2 [...]
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 21 [...]
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-4 [...]
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q [...]
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16 [...]
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0 [...]
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5 [...]
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 [...]
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21  [...]
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -2 [...]
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 [...]
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0  [...]
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21  [...]
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5  [...]
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0  [...]
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 [...]
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 - [...]
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5  [...]
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141  [...]
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t [...]
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 [...]
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 [...]
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q [...]
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 - [...]
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 [...]
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 - [...]
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80  [...]
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -7 [...]
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 1 [...]
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100 [...]
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375 [...]
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 - [...]
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 [...]
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 [...]
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-4 [...]
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5  [...]
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70 [...]
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 [...]
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 [...]
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2  [...]
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 - [...]
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5 [...]
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17. [...]
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15 [...]
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14 [...]
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212 [...]
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -2 [...]
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250 [...]
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t [...]
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h [...]
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35 [...]
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 [...]
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h [...]
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 3 [...]
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -1 [...]
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 [...]
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 19 [...]
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.ttf b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff2 b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
Binary files /dev/null and b/inst/rmd/h/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff2 differ
diff --git a/inst/rmd/h/bootstrap-3.3.5/js/bootstrap.js b/inst/rmd/h/bootstrap-3.3.5/js/bootstrap.js
new file mode 100644
index 0000000..5debfd7
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/js/bootstrap.js
@@ -0,0 +1,2363 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+
+if (typeof jQuery === 'undefined') {
+  throw new Error('Bootstrap\'s JavaScript requires jQuery')
+}
+
++function ($) {
+  'use strict';
+  var version = $.fn.jquery.split(' ')[0].split('.')
+  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {
+    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')
+  }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.5
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // http://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.5
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.3.5'
+
+  Alert.TRANSITION_DURATION = 150
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = $(selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.closest('.alert')
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.5
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.3.5'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state += 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      $el[val](data[state] == null ? this.options[state] : data[state])
+
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked')) changed = false
+        $parent.find('.active').removeClass('active')
+        this.$element.addClass('active')
+      } else if ($input.prop('type') == 'checkbox') {
+        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
+        this.$element.toggleClass('active')
+      }
+      $input.prop('checked', this.$element.hasClass('active'))
+      if (changed) $input.trigger('change')
+    } else {
+      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+      this.$element.toggleClass('active')
+    }
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document)
+    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      var $btn = $(e.target)
+      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+      Plugin.call($btn, 'toggle')
+      if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
+    })
+    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+    })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.5
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      = null
+    this.sliding     = null
+    this.interval    = null
+    this.$active     = null
+    this.$items      = null
+
+    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.3.5'
+
+  Carousel.TRANSITION_DURATION = 600
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true,
+    keyboard: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    if (/input|textarea/i.test(e.target.tagName)) return
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.getItemForDirection = function (direction, active) {
+    var activeIndex = this.getItemIndex(active)
+    var willWrap = (direction == 'prev' && activeIndex === 0)
+                || (direction == 'next' && activeIndex == (this.$items.length - 1))
+    if (willWrap && !this.options.wrap) return active
+    var delta = direction == 'prev' ? -1 : 1
+    var itemIndex = (activeIndex + delta) % this.$items.length
+    return this.$items.eq(itemIndex)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || this.getItemForDirection(type, $active)
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var that      = this
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      $next[0].offsetWidth // force reflow
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  var clickHandler = function (e) {
+    var href
+    var $this   = $(this)
+    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+    if (!$target.hasClass('carousel')) return
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  }
+
+  $(document)
+    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.5
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
+                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
+    this.transitioning = null
+
+    if (this.options.parent) {
+      this.$parent = this.getParent()
+    } else {
+      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+    }
+
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.3.5'
+
+  Collapse.TRANSITION_DURATION = 350
+
+  Collapse.DEFAULTS = {
+    toggle: true
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var activesData
+    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    if (actives && actives.length) {
+      Plugin.call(actives, 'hide')
+      activesData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+      .attr('aria-expanded', true)
+
+    this.$trigger
+      .removeClass('collapsed')
+      .attr('aria-expanded', true)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse in')
+      .attr('aria-expanded', false)
+
+    this.$trigger
+      .addClass('collapsed')
+      .attr('aria-expanded', false)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse')
+        .trigger('hidden.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+  Collapse.prototype.getParent = function () {
+    return $(this.options.parent)
+      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+      .each($.proxy(function (i, element) {
+        var $element = $(element)
+        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+      }, this))
+      .end()
+  }
+
+  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+    var isOpen = $element.hasClass('in')
+
+    $element.attr('aria-expanded', isOpen)
+    $trigger
+      .toggleClass('collapsed', !isOpen)
+      .attr('aria-expanded', isOpen)
+  }
+
+  function getTargetFromTrigger($trigger) {
+    var href
+    var target = $trigger.attr('data-target')
+      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+    return $(target)
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var $this   = $(this)
+
+    if (!$this.attr('data-target')) e.preventDefault()
+
+    var $target = getTargetFromTrigger($this)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $this.data()
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.5
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.3.5'
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector && $(selector)
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $this         = $(this)
+      var $parent       = getParent($this)
+      var relatedTarget = { relatedTarget: this }
+
+      if (!$parent.hasClass('open')) return
+
+      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
+
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.attr('aria-expanded', 'false')
+      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
+    })
+  }
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $(document.createElement('div'))
+          .addClass('dropdown-backdrop')
+          .insertAfter($(this))
+          .on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this
+        .trigger('focus')
+        .attr('aria-expanded', 'true')
+
+      $parent
+        .toggleClass('open')
+        .trigger('shown.bs.dropdown', relatedTarget)
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if (!isActive && e.which != 27 || isActive && e.which == 27) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.disabled):visible a'
+    var $items = $parent.find('.dropdown-menu' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index(e.target)
+
+    if (e.which == 38 && index > 0)                 index--         // up
+    if (e.which == 40 && index < $items.length - 1) index++         // down
+    if (!~index)                                    index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.5
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options             = options
+    this.$body               = $(document.body)
+    this.$element            = $(element)
+    this.$dialog             = this.$element.find('.modal-dialog')
+    this.$backdrop           = null
+    this.isShown             = null
+    this.originalBodyPad     = null
+    this.scrollbarWidth      = 0
+    this.ignoreBackdropClick = false
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION  = '3.3.5'
+
+  Modal.TRANSITION_DURATION = 300
+  Modal.BACKDROP_TRANSITION_DURATION = 150
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.setScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.escape()
+    this.resize()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
+      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
+        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
+      })
+    })
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      that.adjustDialog()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element.addClass('in')
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$dialog // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+    this.resize()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .off('click.dismiss.bs.modal')
+      .off('mouseup.dismiss.bs.modal')
+
+    this.$dialog.off('mousedown.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keydown.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.resize = function () {
+    if (this.isShown) {
+      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+    } else {
+      $(window).off('resize.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$body.removeClass('modal-open')
+      that.resetAdjustments()
+      that.resetScrollbar()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $(document.createElement('div'))
+        .addClass('modal-backdrop ' + animate)
+        .appendTo(this.$body)
+
+      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+        if (this.ignoreBackdropClick) {
+          this.ignoreBackdropClick = false
+          return
+        }
+        if (e.target !== e.currentTarget) return
+        this.options.backdrop == 'static'
+          ? this.$element[0].focus()
+          : this.hide()
+      }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  // these following methods are used to handle overflowing modals
+
+  Modal.prototype.handleUpdate = function () {
+    this.adjustDialog()
+  }
+
+  Modal.prototype.adjustDialog = function () {
+    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+    this.$element.css({
+      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+    })
+  }
+
+  Modal.prototype.resetAdjustments = function () {
+    this.$element.css({
+      paddingLeft: '',
+      paddingRight: ''
+    })
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    var fullWindowWidth = window.innerWidth
+    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
+      var documentElementRect = document.documentElement.getBoundingClientRect()
+      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
+    }
+    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
+    this.scrollbarWidth = this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    this.originalBodyPad = document.body.style.paddingRight || ''
+    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', this.originalBodyPad)
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal             = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.5
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       = null
+    this.options    = null
+    this.enabled    = null
+    this.timeout    = null
+    this.hoverState = null
+    this.$element   = null
+    this.inState    = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.3.5'
+
+  Tooltip.TRANSITION_DURATION = 150
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    }
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
+    this.inState   = { click: false, hover: false, focus: false }
+
+    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
+      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
+    }
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
+    }
+
+    if (self.tip().hasClass('in') || self.hoverState == 'in') {
+      self.hoverState = 'in'
+      return
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.isInStateTrue = function () {
+    for (var key in this.inState) {
+      if (this.inState[key]) return true
+    }
+
+    return false
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
+    }
+
+    if (self.isInStateTrue()) return
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+      this.$element.trigger('inserted.bs.' + this.type)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var viewportDim = this.getPosition(this.$viewport)
+
+        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
+                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
+                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
+                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        var prevHoverState = that.hoverState
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+
+        if (prevHoverState == 'out') that.leave(that)
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  += marginTop
+    offset.left += marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var isVertical          = /top|bottom/.test(placement)
+    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
+    this.arrow()
+      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+      .css(isVertical ? 'top' : 'left', '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function (callback) {
+    var that = this
+    var $tip = $(this.$tip)
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      that.$element
+        .removeAttr('aria-describedby')
+        .trigger('hidden.bs.' + that.type)
+      callback && callback()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && $tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+
+    var elRect    = el.getBoundingClientRect()
+    if (elRect.width == null) {
+      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+    }
+    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
+    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+    return $.extend({}, elRect, scroll, outerDims, elOffset)
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    if (!this.$tip) {
+      this.$tip = $(this.options.template)
+      if (this.$tip.length != 1) {
+        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
+      }
+    }
+    return this.$tip
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    if (e) {
+      self.inState.click = !self.inState.click
+      if (self.isInStateTrue()) self.enter(self)
+      else self.leave(self)
+    } else {
+      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+    }
+  }
+
+  Tooltip.prototype.destroy = function () {
+    var that = this
+    clearTimeout(this.timeout)
+    this.hide(function () {
+      that.$element.off('.' + that.type).removeData('bs.' + that.type)
+      if (that.$tip) {
+        that.$tip.detach()
+      }
+      that.$tip = null
+      that.$arrow = null
+      that.$viewport = null
+    })
+  }
+
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.5
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.3.5'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
+      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+    ](content)
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+            o.content.call($e[0]) :
+            o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.5
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    this.$body          = $(document.body)
+    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.3.5'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var that          = this
+    var offsetMethod  = 'offset'
+    var offsetBase    = 0
+
+    this.offsets      = []
+    this.targets      = []
+    this.scrollHeight = this.getScrollHeight()
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        that.offsets.push(this[0])
+        that.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop < offsets[0]) {
+      this.activeTarget = null
+      return this.clear()
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    this.clear()
+
+    var selector = this.selector +
+      '[data-target="' + target + '"],' +
+      this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+  ScrollSpy.prototype.clear = function () {
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.5
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    // jscs:disable requireDollarBeforejQueryAssignment
+    this.element = $(element)
+    // jscs:enable requireDollarBeforejQueryAssignment
+  }
+
+  Tab.VERSION = '3.3.5'
+
+  Tab.TRANSITION_DURATION = 150
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var $previous = $ul.find('.active:last a')
+    var hideEvent = $.Event('hide.bs.tab', {
+      relatedTarget: $this[0]
+    })
+    var showEvent = $.Event('show.bs.tab', {
+      relatedTarget: $previous[0]
+    })
+
+    $previous.trigger(hideEvent)
+    $this.trigger(showEvent)
+
+    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+    var $target = $(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $previous.trigger({
+        type: 'hidden.bs.tab',
+        relatedTarget: $this[0]
+      })
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: $previous[0]
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+          .removeClass('active')
+        .end()
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', false)
+
+      element
+        .addClass('active')
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', true)
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu').length) {
+        element
+          .closest('li.dropdown')
+            .addClass('active')
+          .end()
+          .find('[data-toggle="tab"]')
+            .attr('aria-expanded', true)
+      }
+
+      callback && callback()
+    }
+
+    $active.length && transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  var clickHandler = function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  }
+
+  $(document)
+    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.5
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    this.$target = $(this.options.target)
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      = null
+    this.unpin        = null
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.3.5'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var targetHeight = this.$target.height()
+
+    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+    if (this.affixed == 'bottom') {
+      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+    }
+
+    var initializing   = this.affixed == null
+    var colliderTop    = initializing ? scrollTop : position.top
+    var colliderHeight = initializing ? targetHeight : height
+
+    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+    return false
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var height       = this.$element.height()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+    var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+    if (this.affixed != affix) {
+      if (this.unpin != null) this.$element.css('top', '')
+
+      var affixType = 'affix' + (affix ? '-' + affix : '')
+      var e         = $.Event(affixType + '.bs.affix')
+
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      this.affixed = affix
+      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+      this.$element
+        .removeClass(Affix.RESET)
+        .addClass(affixType)
+        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+    }
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - height - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/inst/rmd/h/bootstrap-3.3.5/js/bootstrap.min.js b/inst/rmd/h/bootstrap-3.3.5/js/bootstrap.min.js
new file mode 100644
index 0000000..133aeec
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",tra [...]
+d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){v [...]
\ No newline at end of file
diff --git a/inst/rmd/h/bootstrap-3.3.5/js/npm.js b/inst/rmd/h/bootstrap-3.3.5/js/npm.js
new file mode 100644
index 0000000..bf6aa80
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/js/npm.js
@@ -0,0 +1,13 @@
+// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
+require('../../js/transition.js')
+require('../../js/alert.js')
+require('../../js/button.js')
+require('../../js/carousel.js')
+require('../../js/collapse.js')
+require('../../js/dropdown.js')
+require('../../js/modal.js')
+require('../../js/tooltip.js')
+require('../../js/popover.js')
+require('../../js/scrollspy.js')
+require('../../js/tab.js')
+require('../../js/affix.js')
\ No newline at end of file
diff --git a/inst/rmd/h/bootstrap-3.3.5/shim/html5shiv.min.js b/inst/rmd/h/bootstrap-3.3.5/shim/html5shiv.min.js
new file mode 100644
index 0000000..3683114
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/shim/html5shiv.min.js
@@ -0,0 +1,7 @@
+/**
+* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+*/
+// Only run this code in IE 8
+if (!!window.navigator.userAgent.match("MSIE 8")) {
+!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l [...]
+};
diff --git a/inst/rmd/h/bootstrap-3.3.5/shim/respond.min.js b/inst/rmd/h/bootstrap-3.3.5/shim/respond.min.js
new file mode 100644
index 0000000..2209469
--- /dev/null
+++ b/inst/rmd/h/bootstrap-3.3.5/shim/respond.min.js
@@ -0,0 +1,8 @@
+/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
+ * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
+ *  */
+
+// Only run this code in IE 8
+if (!!window.navigator.userAgent.match("MSIE 8")) {
+!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),funct [...]
+};
diff --git a/inst/rmd/h/default.html b/inst/rmd/h/default.html
new file mode 100644
index 0000000..cbb743c
--- /dev/null
+++ b/inst/rmd/h/default.html
@@ -0,0 +1,508 @@
+<!DOCTYPE html>
+
+<html xmlns="http://www.w3.org/1999/xhtml"$if(lang)$ lang="$lang$" xml:lang="$lang$"$endif$>
+
+<head>
+
+<meta charset="utf-8" />
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="pandoc" />
+
+$if(theme)$
+$else$
+<meta name="viewport" content="width=device-width, initial-scale=1">
+$endif$
+
+$for(author-meta)$
+<meta name="author" content="$author-meta$" />
+$endfor$
+
+$if(date-meta)$
+<meta name="date" content="$date-meta$" />
+$endif$
+
+<title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>
+
+$for(header-includes)$
+$header-includes$
+$endfor$
+
+$if(highlightjs)$
+<style type="text/css">code{white-space: pre;}</style>
+$if(theme)$
+<style type="text/css">
+  pre:not([class]) {
+    background-color: white;
+  }
+</style>
+$endif$
+<script type="text/javascript">
+if (window.hljs) {
+  hljs.configure({languages: []});
+  hljs.initHighlightingOnLoad();
+  if (document.readyState && document.readyState === "complete") {
+    window.setTimeout(function() { hljs.initHighlighting(); }, 0);
+  }
+}
+</script>
+$endif$
+
+$if(highlighting-css)$
+<style type="text/css">code{white-space: pre;}</style>
+<style type="text/css">
+$highlighting-css$
+$if(code_folding)$
+div.sourceCode {
+  overflow-x: visible;
+}
+$endif$
+</style>
+$if(theme)$
+<style type="text/css">
+  pre:not([class]) {
+    background-color: white;
+  }
+</style>
+$endif$
+$endif$
+
+$if(abstract)$
+<style type="text/css">
+  p.abstract{
+    text-align: center;
+    font-weight: bold;
+  }
+  div.abstract{
+    margin: auto;
+    width: 90%;
+  }
+</style>
+$endif$
+
+$if(theme)$
+<style type="text/css">
+h1 {
+  font-size: 34px;
+}
+h1.title {
+  font-size: 38px;
+}
+h2 {
+  font-size: 30px;
+}
+h3 {
+  font-size: 24px;
+}
+h4 {
+  font-size: 18px;
+}
+h5 {
+  font-size: 16px;
+}
+h6 {
+  font-size: 12px;
+}
+.table th:not([align]) {
+  text-align: left;
+}
+$if(source_embed)$
+#rmd-source-code {
+  display: none;
+}
+$endif$
+</style>
+$endif$
+
+$for(css)$
+<link rel="stylesheet" href="$css$" $if(html5)$$else$type="text/css" $endif$/>
+$endfor$
+
+</head>
+
+<body>
+
+$if(theme)$
+<style type = "text/css">
+.main-container {
+  max-width: 940px;
+  margin-left: auto;
+  margin-right: auto;
+}
+code {
+  color: inherit;
+  background-color: rgba(0, 0, 0, 0.04);
+}
+img {
+  max-width:100%;
+  height: auto;
+}
+.tabbed-pane {
+  padding-top: 12px;
+}
+button.code-folding-btn:focus {
+  outline: none;
+}
+</style>
+
+$if(kable-scroll)$
+<style type="text/css">
+.kable-table {
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  overflow: auto;
+  padding-left: 8px;
+  padding-right: 8px;
+  margin-bottom: 20px;
+  max-height: 350px;
+}
+
+.kable-table table {
+  margin-bottom: 0px;
+}
+
+.kable-table table>thead>tr>th {
+  border: none;
+  border-bottom: 2px solid #dddddd;
+}
+
+.kable-table table>thead {
+  background-color: #fff;
+}
+</style>
+$endif$
+
+$if(navbar)$
+<style type="text/css">
+/* padding for bootstrap navbar */
+body {
+  padding-top: $body_padding$px;
+  padding-bottom: 40px;
+}
+/* offset scroll position for anchor links (for fixed navbar)  */
+.section h1 {
+  padding-top: $header_padding$px;
+  margin-top: -$header_padding$px;
+}
+
+.section h2 {
+  padding-top: $header_padding$px;
+  margin-top: -$header_padding$px;
+}
+.section h3 {
+  padding-top: $header_padding$px;
+  margin-top: -$header_padding$px;
+}
+.section h4 {
+  padding-top: $header_padding$px;
+  margin-top: -$header_padding$px;
+}
+.section h5 {
+  padding-top: $header_padding$px;
+  margin-top: -$header_padding$px;
+}
+.section h6 {
+  padding-top: $header_padding$px;
+  margin-top: -$header_padding$px;
+}
+</style>
+
+<script>
+// manage active state of menu based on current page
+$$(document).ready(function () {
+  // active menu anchor
+  href = window.location.pathname
+  href = href.substr(href.lastIndexOf('/') + 1)
+  if (href === "")
+    href = "index.html";
+  var menuAnchor = $$('a[href="' + href + '"]');
+
+  // mark it active
+  menuAnchor.parent().addClass('active');
+
+  // if it's got a parent navbar menu mark it active as well
+  menuAnchor.closest('li.dropdown').addClass('active');
+});
+</script>
+
+$endif$
+
+<div class="container-fluid main-container">
+
+<!-- tabsets -->
+<script>
+$$(document).ready(function () {
+  window.buildTabsets("$idprefix$TOC");
+});
+</script>
+
+<!-- code folding -->
+$if(code_menu)$
+<style type="text/css">
+.code-folding-btn { margin-bottom: 4px; }
+</style>
+<script>
+$$(document).ready(function () {
+$if(source_embed)$
+  window.initializeSourceEmbed("$source_embed$");
+$endif$
+$if(code_folding)$
+  window.initializeCodeFolding("$code_folding$" === "show");
+$endif$
+});
+</script>
+$endif$
+
+
+
+$if(toc_float)$
+
+<script>
+$$(document).ready(function ()  {
+
+    // move toc-ignore selectors from section div to header
+    $$('div.section.toc-ignore')
+        .removeClass('toc-ignore')
+        .children('h1,h2,h3,h4,h5').addClass('toc-ignore');
+
+    // establish options
+    var options = {
+      selectors: "$toc_selectors$",
+      theme: "bootstrap3",
+      context: '.toc-content',
+      hashGenerator: function (text) {
+        return text.replace(/[.\\/?&!#<>]/g, '').replace(/\s/g, '_').toLowerCase();
+      },
+      ignoreSelector: ".toc-ignore",
+      scrollTo: 0
+    };
+$if(toc_collapsed)$
+    options.showAndHide = true;
+$else$
+    options.showAndHide = false;
+$endif$
+$if(toc_smooth_scroll)$
+    options.smoothScroll = true;
+$else$
+    options.smoothScroll = false;
+$endif$
+
+    // tocify
+    var toc = $$("#$idprefix$TOC").tocify(options).data("toc-tocify");
+});
+</script>
+
+<style type="text/css">
+
+#$idprefix$TOC {
+  margin: 25px 0px 20px 0px;
+}
+ at media (max-width: 768px) {
+#$idprefix$TOC {
+  position: relative;
+  width: 100%;
+}
+}
+
+$if(toc_print)$
+$else$
+ at media print {
+#$idprefix$TOC {
+  display: none !important;
+}
+}
+$endif$
+
+.toc-content {
+  padding-left: 30px;
+  padding-right: 40px;
+}
+
+div.main-container {
+  max-width: 1200px;
+}
+
+div.tocify {
+  width: 20%;
+  max-width: 260px;
+  max-height: 85%;
+}
+
+ at media (min-width: 768px) and (max-width: 991px) {
+  div.tocify {
+    width: 25%;
+  }
+}
+
+ at media (max-width: 767px) {
+  div.tocify {
+    width: 100%;
+    max-width: none;
+  }
+}
+
+.tocify ul, .tocify li {
+  line-height: 20px;
+}
+
+.tocify-subheader .tocify-item {
+  font-size: 0.90em;
+  padding-left: 25px;
+  text-indent: 0;
+}
+
+.tocify .list-group-item {
+  border-radius: 0px;
+}
+
+$if(toc_collapsed)$
+$else$
+.tocify-subheader {
+  display: inline;
+}
+.tocify-subheader .tocify-item {
+  font-size: 0.95em;
+}
+$endif$
+
+</style>
+
+<!-- setup 3col/9col grid for toc_float and main content  -->
+<div class="row-fluid">
+<div class="col-xs-12 col-sm-4 col-md-3">
+<div id="$idprefix$TOC" class="tocify">
+</div>
+</div>
+
+<div class="toc-content col-xs-12 col-sm-8 col-md-9">
+
+$endif$
+
+$endif$
+
+$for(include-before)$
+$include-before$
+$endfor$
+
+$if(theme)$
+<div class="fluid-row" id="$idprefix$header">
+
+$if(code_menu)$
+<div class="btn-group pull-right">
+<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span>Code</span> <span class="caret"></span></button>
+<ul class="dropdown-menu" style="min-width: 50px;">
+$if(code_folding)$
+<li><a id="rmd-show-all-code" href="#">Show All Code</a></li>
+<li><a id="rmd-hide-all-code" href="#">Hide All Code</a></li>
+$if(source_embed)$
+<li role="separator" class="divider"></li>
+$endif$
+$endif$
+$if(source_embed)$
+<li><a id="rmd-download-source" href="#">Download Rmd</a></li>
+$endif$
+</ul>
+</div>
+
+$endif$
+
+$endif$
+
+$if(title)$
+<h1 class="title toc-ignore">$title$</h1>
+$if(subtitle)$
+<h3 class="subtitle"><em>$subtitle$</em></h3>
+$endif$
+$for(author)$
+$if(author.name)$
+<h4 class="author"><em>$author.name$</em></h4>
+$if(author.affiliation)$
+<address class="author_afil">
+$author.affiliation$<br>$endif$
+$if(author.email)$
+<a class="author_email" href="mailto:#">$author.email$</a>
+</address>
+$endif$
+$else$
+<h4 class="author"><em>$author$</em></h4>
+$endif$
+$endfor$
+$if(date)$
+<h4 class="date"><em>$date$</em></h4>
+$endif$
+$if(abstract)$
+<div class="abstract">
+<p class="abstract">Abstract</p>
+$abstract$
+</div>
+$endif$
+$endif$
+
+$if(theme)$
+</div>
+$endif$
+
+$if(toc_float)$
+$else$
+$if(toc)$
+<div id="$idprefix$TOC">
+$toc$
+</div>
+$endif$
+$endif$
+
+$body$
+
+$for(include-after)$
+$include-after$
+$endfor$
+
+$if(theme)$
+
+$if(toc_float)$
+</div>
+</div>
+$endif$
+
+</div>
+
+<script>
+
+// add bootstrap table styles to pandoc tables
+function bootstrapStylePandocTables() {
+  $$('tr.header').parent('thead').parent('table').addClass('table table-condensed');
+}
+$$(document).ready(function () {
+  bootstrapStylePandocTables();
+});
+
+$if(kable-scroll)$
+$$(document).ready(function () {
+  $$('.knitsql-table').addClass('kable-table');
+  var container = $$('.kable-table');
+  container.each(function() {
+
+    // move the caption out of the table
+    var table = $$(this).children('table');
+    var caption = table.children('caption').detach();
+    caption.insertBefore($$(this)).css('display', 'inherit');
+  });
+});
+$endif$
+
+</script>
+$endif$
+
+$if(mathjax-url)$
+<!-- dynamically load mathjax for compatibility with self-contained -->
+<script>
+  (function () {
+    var script = document.createElement("script");
+    script.type = "text/javascript";
+    script.src  = "$mathjax-url$";
+    document.getElementsByTagName("head")[0].appendChild(script);
+  })();
+</script>
+$endif$
+
+</body>
+</html>
diff --git a/inst/rmd/h/font-awesome-4.5.0/css/font-awesome.css b/inst/rmd/h/font-awesome-4.5.0/css/font-awesome.css
new file mode 100644
index 0000000..8d8ed70
--- /dev/null
+++ b/inst/rmd/h/font-awesome-4.5.0/css/font-awesome.css
@@ -0,0 +1,2085 @@
+/*!
+ *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+ at font-face {
+  font-family: 'FontAwesome';
+  src: url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+.fa {
+  display: inline-block;
+  font: normal normal normal 14px/1 FontAwesome;
+  font-size: inherit;
+  text-rendering: auto;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+  font-size: 1.33333333em;
+  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.28571429em;
+  text-align: center;
+}
+.fa-ul {
+  padding-left: 0;
+  margin-left: 2.14285714em;
+  list-style-type: none;
+}
+.fa-ul > li {
+  position: relative;
+}
+.fa-li {
+  position: absolute;
+  left: -2.14285714em;
+  width: 2.14285714em;
+  top: 0.14285714em;
+  text-align: center;
+}
+.fa-li.fa-lg {
+  left: -1.85714286em;
+}
+.fa-border {
+  padding: .2em .25em .15em;
+  border: solid 0.08em #eeeeee;
+  border-radius: .1em;
+}
+.fa-pull-left {
+  float: left;
+}
+.fa-pull-right {
+  float: right;
+}
+.fa.fa-pull-left {
+  margin-right: .3em;
+}
+.fa.fa-pull-right {
+  margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.fa.pull-left {
+  margin-right: .3em;
+}
+.fa.pull-right {
+  margin-left: .3em;
+}
+.fa-spin {
+  -webkit-animation: fa-spin 2s infinite linear;
+  animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+  -webkit-animation: fa-spin 1s infinite steps(8);
+  animation: fa-spin 1s infinite steps(8);
+}
+ at -webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+ at keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+.fa-rotate-90 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.fa-rotate-180 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+  -webkit-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.fa-rotate-270 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+  -webkit-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
+  -webkit-transform: scale(-1, 1);
+  -ms-transform: scale(-1, 1);
+  transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
+  -webkit-transform: scale(1, -1);
+  -ms-transform: scale(1, -1);
+  transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+  filter: none;
+}
+.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: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+.fa-glass:before {
+  content: "\f000";
+}
+.fa-music:before {
+  content: "\f001";
+}
+.fa-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-remove:before,
+.fa-close:before,
+.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 {
+  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 {
+  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-photo:before,
+.fa-image:before,
+.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 {
+  content: "\f057";
+}
+.fa-check-circle: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 {
+  content: "\f06a";
+}
+.fa-gift:before {
+  content: "\f06b";
+}
+.fa-leaf:before {
+  content: "\f06c";
+}
+.fa-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,
+.fa-bar-chart: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-f:before,
+.fa-facebook:before {
+  content: "\f09a";
+}
+.fa-github:before {
+  content: "\f09b";
+}
+.fa-unlock:before {
+  content: "\f09c";
+}
+.fa-credit-card:before {
+  content: "\f09d";
+}
+.fa-feed:before,
+.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 {
+  content: "\f0a8";
+}
+.fa-arrow-circle-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 {
+  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-navicon:before,
+.fa-reorder:before,
+.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 {
+  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-desc:before {
+  content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc: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-mail-reply-all:before,
+.fa-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 {
+  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,
+.fa-gratipay: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-space-shuttle:before {
+  content: "\f197";
+}
+.fa-slack:before {
+  content: "\f198";
+}
+.fa-envelope-square:before {
+  content: "\f199";
+}
+.fa-wordpress:before {
+  content: "\f19a";
+}
+.fa-openid:before {
+  content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+  content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+  content: "\f19d";
+}
+.fa-yahoo:before {
+  content: "\f19e";
+}
+.fa-google:before {
+  content: "\f1a0";
+}
+.fa-reddit:before {
+  content: "\f1a1";
+}
+.fa-reddit-square:before {
+  content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+  content: "\f1a3";
+}
+.fa-stumbleupon:before {
+  content: "\f1a4";
+}
+.fa-delicious:before {
+  content: "\f1a5";
+}
+.fa-digg:before {
+  content: "\f1a6";
+}
+.fa-pied-piper:before {
+  content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+  content: "\f1a8";
+}
+.fa-drupal:before {
+  content: "\f1a9";
+}
+.fa-joomla:before {
+  content: "\f1aa";
+}
+.fa-language:before {
+  content: "\f1ab";
+}
+.fa-fax:before {
+  content: "\f1ac";
+}
+.fa-building:before {
+  content: "\f1ad";
+}
+.fa-child:before {
+  content: "\f1ae";
+}
+.fa-paw:before {
+  content: "\f1b0";
+}
+.fa-spoon:before {
+  content: "\f1b1";
+}
+.fa-cube:before {
+  content: "\f1b2";
+}
+.fa-cubes:before {
+  content: "\f1b3";
+}
+.fa-behance:before {
+  content: "\f1b4";
+}
+.fa-behance-square:before {
+  content: "\f1b5";
+}
+.fa-steam:before {
+  content: "\f1b6";
+}
+.fa-steam-square:before {
+  content: "\f1b7";
+}
+.fa-recycle:before {
+  content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+  content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+  content: "\f1ba";
+}
+.fa-tree:before {
+  content: "\f1bb";
+}
+.fa-spotify:before {
+  content: "\f1bc";
+}
+.fa-deviantart:before {
+  content: "\f1bd";
+}
+.fa-soundcloud:before {
+  content: "\f1be";
+}
+.fa-database:before {
+  content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+  content: "\f1c1";
+}
+.fa-file-word-o:before {
+  content: "\f1c2";
+}
+.fa-file-excel-o:before {
+  content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+  content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+  content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+  content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+  content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+  content: "\f1c8";
+}
+.fa-file-code-o:before {
+  content: "\f1c9";
+}
+.fa-vine:before {
+  content: "\f1ca";
+}
+.fa-codepen:before {
+  content: "\f1cb";
+}
+.fa-jsfiddle:before {
+  content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+  content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+  content: "\f1ce";
+}
+.fa-ra:before,
+.fa-rebel:before {
+  content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+  content: "\f1d1";
+}
+.fa-git-square:before {
+  content: "\f1d2";
+}
+.fa-git:before {
+  content: "\f1d3";
+}
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+  content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+  content: "\f1d5";
+}
+.fa-qq:before {
+  content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+  content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+  content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+  content: "\f1d9";
+}
+.fa-history:before {
+  content: "\f1da";
+}
+.fa-circle-thin:before {
+  content: "\f1db";
+}
+.fa-header:before {
+  content: "\f1dc";
+}
+.fa-paragraph:before {
+  content: "\f1dd";
+}
+.fa-sliders:before {
+  content: "\f1de";
+}
+.fa-share-alt:before {
+  content: "\f1e0";
+}
+.fa-share-alt-square:before {
+  content: "\f1e1";
+}
+.fa-bomb:before {
+  content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+  content: "\f1e3";
+}
+.fa-tty:before {
+  content: "\f1e4";
+}
+.fa-binoculars:before {
+  content: "\f1e5";
+}
+.fa-plug:before {
+  content: "\f1e6";
+}
+.fa-slideshare:before {
+  content: "\f1e7";
+}
+.fa-twitch:before {
+  content: "\f1e8";
+}
+.fa-yelp:before {
+  content: "\f1e9";
+}
+.fa-newspaper-o:before {
+  content: "\f1ea";
+}
+.fa-wifi:before {
+  content: "\f1eb";
+}
+.fa-calculator:before {
+  content: "\f1ec";
+}
+.fa-paypal:before {
+  content: "\f1ed";
+}
+.fa-google-wallet:before {
+  content: "\f1ee";
+}
+.fa-cc-visa:before {
+  content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+  content: "\f1f1";
+}
+.fa-cc-discover:before {
+  content: "\f1f2";
+}
+.fa-cc-amex:before {
+  content: "\f1f3";
+}
+.fa-cc-paypal:before {
+  content: "\f1f4";
+}
+.fa-cc-stripe:before {
+  content: "\f1f5";
+}
+.fa-bell-slash:before {
+  content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+  content: "\f1f7";
+}
+.fa-trash:before {
+  content: "\f1f8";
+}
+.fa-copyright:before {
+  content: "\f1f9";
+}
+.fa-at:before {
+  content: "\f1fa";
+}
+.fa-eyedropper:before {
+  content: "\f1fb";
+}
+.fa-paint-brush:before {
+  content: "\f1fc";
+}
+.fa-birthday-cake:before {
+  content: "\f1fd";
+}
+.fa-area-chart:before {
+  content: "\f1fe";
+}
+.fa-pie-chart:before {
+  content: "\f200";
+}
+.fa-line-chart:before {
+  content: "\f201";
+}
+.fa-lastfm:before {
+  content: "\f202";
+}
+.fa-lastfm-square:before {
+  content: "\f203";
+}
+.fa-toggle-off:before {
+  content: "\f204";
+}
+.fa-toggle-on:before {
+  content: "\f205";
+}
+.fa-bicycle:before {
+  content: "\f206";
+}
+.fa-bus:before {
+  content: "\f207";
+}
+.fa-ioxhost:before {
+  content: "\f208";
+}
+.fa-angellist:before {
+  content: "\f209";
+}
+.fa-cc:before {
+  content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+  content: "\f20b";
+}
+.fa-meanpath:before {
+  content: "\f20c";
+}
+.fa-buysellads:before {
+  content: "\f20d";
+}
+.fa-connectdevelop:before {
+  content: "\f20e";
+}
+.fa-dashcube:before {
+  content: "\f210";
+}
+.fa-forumbee:before {
+  content: "\f211";
+}
+.fa-leanpub:before {
+  content: "\f212";
+}
+.fa-sellsy:before {
+  content: "\f213";
+}
+.fa-shirtsinbulk:before {
+  content: "\f214";
+}
+.fa-simplybuilt:before {
+  content: "\f215";
+}
+.fa-skyatlas:before {
+  content: "\f216";
+}
+.fa-cart-plus:before {
+  content: "\f217";
+}
+.fa-cart-arrow-down:before {
+  content: "\f218";
+}
+.fa-diamond:before {
+  content: "\f219";
+}
+.fa-ship:before {
+  content: "\f21a";
+}
+.fa-user-secret:before {
+  content: "\f21b";
+}
+.fa-motorcycle:before {
+  content: "\f21c";
+}
+.fa-street-view:before {
+  content: "\f21d";
+}
+.fa-heartbeat:before {
+  content: "\f21e";
+}
+.fa-venus:before {
+  content: "\f221";
+}
+.fa-mars:before {
+  content: "\f222";
+}
+.fa-mercury:before {
+  content: "\f223";
+}
+.fa-intersex:before,
+.fa-transgender:before {
+  content: "\f224";
+}
+.fa-transgender-alt:before {
+  content: "\f225";
+}
+.fa-venus-double:before {
+  content: "\f226";
+}
+.fa-mars-double:before {
+  content: "\f227";
+}
+.fa-venus-mars:before {
+  content: "\f228";
+}
+.fa-mars-stroke:before {
+  content: "\f229";
+}
+.fa-mars-stroke-v:before {
+  content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+  content: "\f22b";
+}
+.fa-neuter:before {
+  content: "\f22c";
+}
+.fa-genderless:before {
+  content: "\f22d";
+}
+.fa-facebook-official:before {
+  content: "\f230";
+}
+.fa-pinterest-p:before {
+  content: "\f231";
+}
+.fa-whatsapp:before {
+  content: "\f232";
+}
+.fa-server:before {
+  content: "\f233";
+}
+.fa-user-plus:before {
+  content: "\f234";
+}
+.fa-user-times:before {
+  content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+  content: "\f236";
+}
+.fa-viacoin:before {
+  content: "\f237";
+}
+.fa-train:before {
+  content: "\f238";
+}
+.fa-subway:before {
+  content: "\f239";
+}
+.fa-medium:before {
+  content: "\f23a";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+  content: "\f23b";
+}
+.fa-optin-monster:before {
+  content: "\f23c";
+}
+.fa-opencart:before {
+  content: "\f23d";
+}
+.fa-expeditedssl:before {
+  content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery-full:before {
+  content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+  content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+  content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+  content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+  content: "\f244";
+}
+.fa-mouse-pointer:before {
+  content: "\f245";
+}
+.fa-i-cursor:before {
+  content: "\f246";
+}
+.fa-object-group:before {
+  content: "\f247";
+}
+.fa-object-ungroup:before {
+  content: "\f248";
+}
+.fa-sticky-note:before {
+  content: "\f249";
+}
+.fa-sticky-note-o:before {
+  content: "\f24a";
+}
+.fa-cc-jcb:before {
+  content: "\f24b";
+}
+.fa-cc-diners-club:before {
+  content: "\f24c";
+}
+.fa-clone:before {
+  content: "\f24d";
+}
+.fa-balance-scale:before {
+  content: "\f24e";
+}
+.fa-hourglass-o:before {
+  content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+  content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+  content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+  content: "\f253";
+}
+.fa-hourglass:before {
+  content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+  content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+  content: "\f256";
+}
+.fa-hand-scissors-o:before {
+  content: "\f257";
+}
+.fa-hand-lizard-o:before {
+  content: "\f258";
+}
+.fa-hand-spock-o:before {
+  content: "\f259";
+}
+.fa-hand-pointer-o:before {
+  content: "\f25a";
+}
+.fa-hand-peace-o:before {
+  content: "\f25b";
+}
+.fa-trademark:before {
+  content: "\f25c";
+}
+.fa-registered:before {
+  content: "\f25d";
+}
+.fa-creative-commons:before {
+  content: "\f25e";
+}
+.fa-gg:before {
+  content: "\f260";
+}
+.fa-gg-circle:before {
+  content: "\f261";
+}
+.fa-tripadvisor:before {
+  content: "\f262";
+}
+.fa-odnoklassniki:before {
+  content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+  content: "\f264";
+}
+.fa-get-pocket:before {
+  content: "\f265";
+}
+.fa-wikipedia-w:before {
+  content: "\f266";
+}
+.fa-safari:before {
+  content: "\f267";
+}
+.fa-chrome:before {
+  content: "\f268";
+}
+.fa-firefox:before {
+  content: "\f269";
+}
+.fa-opera:before {
+  content: "\f26a";
+}
+.fa-internet-explorer:before {
+  content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+  content: "\f26c";
+}
+.fa-contao:before {
+  content: "\f26d";
+}
+.fa-500px:before {
+  content: "\f26e";
+}
+.fa-amazon:before {
+  content: "\f270";
+}
+.fa-calendar-plus-o:before {
+  content: "\f271";
+}
+.fa-calendar-minus-o:before {
+  content: "\f272";
+}
+.fa-calendar-times-o:before {
+  content: "\f273";
+}
+.fa-calendar-check-o:before {
+  content: "\f274";
+}
+.fa-industry:before {
+  content: "\f275";
+}
+.fa-map-pin:before {
+  content: "\f276";
+}
+.fa-map-signs:before {
+  content: "\f277";
+}
+.fa-map-o:before {
+  content: "\f278";
+}
+.fa-map:before {
+  content: "\f279";
+}
+.fa-commenting:before {
+  content: "\f27a";
+}
+.fa-commenting-o:before {
+  content: "\f27b";
+}
+.fa-houzz:before {
+  content: "\f27c";
+}
+.fa-vimeo:before {
+  content: "\f27d";
+}
+.fa-black-tie:before {
+  content: "\f27e";
+}
+.fa-fonticons:before {
+  content: "\f280";
+}
+.fa-reddit-alien:before {
+  content: "\f281";
+}
+.fa-edge:before {
+  content: "\f282";
+}
+.fa-credit-card-alt:before {
+  content: "\f283";
+}
+.fa-codiepie:before {
+  content: "\f284";
+}
+.fa-modx:before {
+  content: "\f285";
+}
+.fa-fort-awesome:before {
+  content: "\f286";
+}
+.fa-usb:before {
+  content: "\f287";
+}
+.fa-product-hunt:before {
+  content: "\f288";
+}
+.fa-mixcloud:before {
+  content: "\f289";
+}
+.fa-scribd:before {
+  content: "\f28a";
+}
+.fa-pause-circle:before {
+  content: "\f28b";
+}
+.fa-pause-circle-o:before {
+  content: "\f28c";
+}
+.fa-stop-circle:before {
+  content: "\f28d";
+}
+.fa-stop-circle-o:before {
+  content: "\f28e";
+}
+.fa-shopping-bag:before {
+  content: "\f290";
+}
+.fa-shopping-basket:before {
+  content: "\f291";
+}
+.fa-hashtag:before {
+  content: "\f292";
+}
+.fa-bluetooth:before {
+  content: "\f293";
+}
+.fa-bluetooth-b:before {
+  content: "\f294";
+}
+.fa-percent:before {
+  content: "\f295";
+}
diff --git a/inst/rmd/h/font-awesome-4.5.0/css/font-awesome.min.css b/inst/rmd/h/font-awesome-4.5.0/css/font-awesome.min.css
new file mode 100644
index 0000000..c9e9634
--- /dev/null
+++ b/inst/rmd/h/font-awesome-4.5.0/css/font-awesome.min.css
@@ -0,0 +1,11 @@
+/*!
+ *  Font Awesome 4.5.0 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.ttf?v=4.5.0') format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+ .fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.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.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolu [...]
diff --git a/inst/rmd/h/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf b/inst/rmd/h/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..26dea79
Binary files /dev/null and b/inst/rmd/h/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf differ
diff --git a/inst/rmd/h/highlightjs/default.css b/inst/rmd/h/highlightjs/default.css
new file mode 100644
index 0000000..6e7234a
--- /dev/null
+++ b/inst/rmd/h/highlightjs/default.css
@@ -0,0 +1,21 @@
+.hljs-literal {
+  color: #990073;
+}
+
+.hljs-number {
+  color: #099;
+}
+
+.hljs-comment {
+  color: #998;
+  font-style: italic;
+}
+
+.hljs-keyword {
+  color: #900;
+  font-weight: bold;
+}
+
+.hljs-string {
+  color: #d14;
+}
diff --git a/inst/rmd/h/highlightjs/highlight.js b/inst/rmd/h/highlightjs/highlight.js
new file mode 100644
index 0000000..c1a8f62
--- /dev/null
+++ b/inst/rmd/h/highlightjs/highlight.js
@@ -0,0 +1,2 @@
+/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */
+!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";i [...]
\ No newline at end of file
diff --git a/inst/rmd/h/highlightjs/textmate.css b/inst/rmd/h/highlightjs/textmate.css
new file mode 100644
index 0000000..6efd435
--- /dev/null
+++ b/inst/rmd/h/highlightjs/textmate.css
@@ -0,0 +1,19 @@
+.hljs-literal {
+  color: rgb(88, 72, 246);
+}
+
+.hljs-number {
+  color: rgb(0, 0, 205);
+}
+
+.hljs-comment {
+  color: rgb(76, 136, 107);
+}
+
+.hljs-keyword {
+  color: rgb(0, 0, 255);
+}
+
+.hljs-string {
+  color: rgb(3, 106, 7);
+}
diff --git a/inst/rmd/h/ionicons-2.0.1/LICENSE b/inst/rmd/h/ionicons-2.0.1/LICENSE
new file mode 100755
index 0000000..18ab118
--- /dev/null
+++ b/inst/rmd/h/ionicons-2.0.1/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Drifty (http://drifty.com/)
+
+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.
diff --git a/inst/rmd/h/ionicons-2.0.1/css/ionicons.css b/inst/rmd/h/ionicons-2.0.1/css/ionicons.css
new file mode 100755
index 0000000..2bba66e
--- /dev/null
+++ b/inst/rmd/h/ionicons-2.0.1/css/ionicons.css
@@ -0,0 +1,1480 @@
+ at charset "UTF-8";
+/*!
+  Ionicons, v2.0.0
+  Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
+  https://twitter.com/benjsperry  https://twitter.com/ionicframework
+  MIT License: https://github.com/driftyco/ionicons
+
+  Android-style icons originally built by Google’s
+  Material Design Icons: https://github.com/google/material-design-icons
+  used under CC BY http://creativecommons.org/licenses/by/4.0/
+  Modified icons to fit ionicon’s grid from original.
+*/
+ at font-face { font-family: "Ionicons"; src: url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"); font-weight: normal; font-style: normal; }
+.ion, .ionicons, .ion-alert:before, .ion-alert-circled:before, .ion-android-add:before, .ion-android-add-circle:before, .ion-android-alarm-clock:before, .ion-android-alert:before, .ion-android-apps:before, .ion-android-archive:before, .ion-android-arrow-back:before, .ion-android-arrow-down:before, .ion-android-arrow-dropdown:before, .ion-android-arrow-dropdown-circle:before, .ion-android-arrow-dropleft:before, .ion-android-arrow-dropleft-circle:before, .ion-android-arrow-dropright:before [...]
+
+.ion-alert:before { content: "\f101"; }
+
+.ion-alert-circled:before { content: "\f100"; }
+
+.ion-android-add:before { content: "\f2c7"; }
+
+.ion-android-add-circle:before { content: "\f359"; }
+
+.ion-android-alarm-clock:before { content: "\f35a"; }
+
+.ion-android-alert:before { content: "\f35b"; }
+
+.ion-android-apps:before { content: "\f35c"; }
+
+.ion-android-archive:before { content: "\f2c9"; }
+
+.ion-android-arrow-back:before { content: "\f2ca"; }
+
+.ion-android-arrow-down:before { content: "\f35d"; }
+
+.ion-android-arrow-dropdown:before { content: "\f35f"; }
+
+.ion-android-arrow-dropdown-circle:before { content: "\f35e"; }
+
+.ion-android-arrow-dropleft:before { content: "\f361"; }
+
+.ion-android-arrow-dropleft-circle:before { content: "\f360"; }
+
+.ion-android-arrow-dropright:before { content: "\f363"; }
+
+.ion-android-arrow-dropright-circle:before { content: "\f362"; }
+
+.ion-android-arrow-dropup:before { content: "\f365"; }
+
+.ion-android-arrow-dropup-circle:before { content: "\f364"; }
+
+.ion-android-arrow-forward:before { content: "\f30f"; }
+
+.ion-android-arrow-up:before { content: "\f366"; }
+
+.ion-android-attach:before { content: "\f367"; }
+
+.ion-android-bar:before { content: "\f368"; }
+
+.ion-android-bicycle:before { content: "\f369"; }
+
+.ion-android-boat:before { content: "\f36a"; }
+
+.ion-android-bookmark:before { content: "\f36b"; }
+
+.ion-android-bulb:before { content: "\f36c"; }
+
+.ion-android-bus:before { content: "\f36d"; }
+
+.ion-android-calendar:before { content: "\f2d1"; }
+
+.ion-android-call:before { content: "\f2d2"; }
+
+.ion-android-camera:before { content: "\f2d3"; }
+
+.ion-android-cancel:before { content: "\f36e"; }
+
+.ion-android-car:before { content: "\f36f"; }
+
+.ion-android-cart:before { content: "\f370"; }
+
+.ion-android-chat:before { content: "\f2d4"; }
+
+.ion-android-checkbox:before { content: "\f374"; }
+
+.ion-android-checkbox-blank:before { content: "\f371"; }
+
+.ion-android-checkbox-outline:before { content: "\f373"; }
+
+.ion-android-checkbox-outline-blank:before { content: "\f372"; }
+
+.ion-android-checkmark-circle:before { content: "\f375"; }
+
+.ion-android-clipboard:before { content: "\f376"; }
+
+.ion-android-close:before { content: "\f2d7"; }
+
+.ion-android-cloud:before { content: "\f37a"; }
+
+.ion-android-cloud-circle:before { content: "\f377"; }
+
+.ion-android-cloud-done:before { content: "\f378"; }
+
+.ion-android-cloud-outline:before { content: "\f379"; }
+
+.ion-android-color-palette:before { content: "\f37b"; }
+
+.ion-android-compass:before { content: "\f37c"; }
+
+.ion-android-contact:before { content: "\f2d8"; }
+
+.ion-android-contacts:before { content: "\f2d9"; }
+
+.ion-android-contract:before { content: "\f37d"; }
+
+.ion-android-create:before { content: "\f37e"; }
+
+.ion-android-delete:before { content: "\f37f"; }
+
+.ion-android-desktop:before { content: "\f380"; }
+
+.ion-android-document:before { content: "\f381"; }
+
+.ion-android-done:before { content: "\f383"; }
+
+.ion-android-done-all:before { content: "\f382"; }
+
+.ion-android-download:before { content: "\f2dd"; }
+
+.ion-android-drafts:before { content: "\f384"; }
+
+.ion-android-exit:before { content: "\f385"; }
+
+.ion-android-expand:before { content: "\f386"; }
+
+.ion-android-favorite:before { content: "\f388"; }
+
+.ion-android-favorite-outline:before { content: "\f387"; }
+
+.ion-android-film:before { content: "\f389"; }
+
+.ion-android-folder:before { content: "\f2e0"; }
+
+.ion-android-folder-open:before { content: "\f38a"; }
+
+.ion-android-funnel:before { content: "\f38b"; }
+
+.ion-android-globe:before { content: "\f38c"; }
+
+.ion-android-hand:before { content: "\f2e3"; }
+
+.ion-android-hangout:before { content: "\f38d"; }
+
+.ion-android-happy:before { content: "\f38e"; }
+
+.ion-android-home:before { content: "\f38f"; }
+
+.ion-android-image:before { content: "\f2e4"; }
+
+.ion-android-laptop:before { content: "\f390"; }
+
+.ion-android-list:before { content: "\f391"; }
+
+.ion-android-locate:before { content: "\f2e9"; }
+
+.ion-android-lock:before { content: "\f392"; }
+
+.ion-android-mail:before { content: "\f2eb"; }
+
+.ion-android-map:before { content: "\f393"; }
+
+.ion-android-menu:before { content: "\f394"; }
+
+.ion-android-microphone:before { content: "\f2ec"; }
+
+.ion-android-microphone-off:before { content: "\f395"; }
+
+.ion-android-more-horizontal:before { content: "\f396"; }
+
+.ion-android-more-vertical:before { content: "\f397"; }
+
+.ion-android-navigate:before { content: "\f398"; }
+
+.ion-android-notifications:before { content: "\f39b"; }
+
+.ion-android-notifications-none:before { content: "\f399"; }
+
+.ion-android-notifications-off:before { content: "\f39a"; }
+
+.ion-android-open:before { content: "\f39c"; }
+
+.ion-android-options:before { content: "\f39d"; }
+
+.ion-android-people:before { content: "\f39e"; }
+
+.ion-android-person:before { content: "\f3a0"; }
+
+.ion-android-person-add:before { content: "\f39f"; }
+
+.ion-android-phone-landscape:before { content: "\f3a1"; }
+
+.ion-android-phone-portrait:before { content: "\f3a2"; }
+
+.ion-android-pin:before { content: "\f3a3"; }
+
+.ion-android-plane:before { content: "\f3a4"; }
+
+.ion-android-playstore:before { content: "\f2f0"; }
+
+.ion-android-print:before { content: "\f3a5"; }
+
+.ion-android-radio-button-off:before { content: "\f3a6"; }
+
+.ion-android-radio-button-on:before { content: "\f3a7"; }
+
+.ion-android-refresh:before { content: "\f3a8"; }
+
+.ion-android-remove:before { content: "\f2f4"; }
+
+.ion-android-remove-circle:before { content: "\f3a9"; }
+
+.ion-android-restaurant:before { content: "\f3aa"; }
+
+.ion-android-sad:before { content: "\f3ab"; }
+
+.ion-android-search:before { content: "\f2f5"; }
+
+.ion-android-send:before { content: "\f2f6"; }
+
+.ion-android-settings:before { content: "\f2f7"; }
+
+.ion-android-share:before { content: "\f2f8"; }
+
+.ion-android-share-alt:before { content: "\f3ac"; }
+
+.ion-android-star:before { content: "\f2fc"; }
+
+.ion-android-star-half:before { content: "\f3ad"; }
+
+.ion-android-star-outline:before { content: "\f3ae"; }
+
+.ion-android-stopwatch:before { content: "\f2fd"; }
+
+.ion-android-subway:before { content: "\f3af"; }
+
+.ion-android-sunny:before { content: "\f3b0"; }
+
+.ion-android-sync:before { content: "\f3b1"; }
+
+.ion-android-textsms:before { content: "\f3b2"; }
+
+.ion-android-time:before { content: "\f3b3"; }
+
+.ion-android-train:before { content: "\f3b4"; }
+
+.ion-android-unlock:before { content: "\f3b5"; }
+
+.ion-android-upload:before { content: "\f3b6"; }
+
+.ion-android-volume-down:before { content: "\f3b7"; }
+
+.ion-android-volume-mute:before { content: "\f3b8"; }
+
+.ion-android-volume-off:before { content: "\f3b9"; }
+
+.ion-android-volume-up:before { content: "\f3ba"; }
+
+.ion-android-walk:before { content: "\f3bb"; }
+
+.ion-android-warning:before { content: "\f3bc"; }
+
+.ion-android-watch:before { content: "\f3bd"; }
+
+.ion-android-wifi:before { content: "\f305"; }
+
+.ion-aperture:before { content: "\f313"; }
+
+.ion-archive:before { content: "\f102"; }
+
+.ion-arrow-down-a:before { content: "\f103"; }
+
+.ion-arrow-down-b:before { content: "\f104"; }
+
+.ion-arrow-down-c:before { content: "\f105"; }
+
+.ion-arrow-expand:before { content: "\f25e"; }
+
+.ion-arrow-graph-down-left:before { content: "\f25f"; }
+
+.ion-arrow-graph-down-right:before { content: "\f260"; }
+
+.ion-arrow-graph-up-left:before { content: "\f261"; }
+
+.ion-arrow-graph-up-right:before { content: "\f262"; }
+
+.ion-arrow-left-a:before { content: "\f106"; }
+
+.ion-arrow-left-b:before { content: "\f107"; }
+
+.ion-arrow-left-c:before { content: "\f108"; }
+
+.ion-arrow-move:before { content: "\f263"; }
+
+.ion-arrow-resize:before { content: "\f264"; }
+
+.ion-arrow-return-left:before { content: "\f265"; }
+
+.ion-arrow-return-right:before { content: "\f266"; }
+
+.ion-arrow-right-a:before { content: "\f109"; }
+
+.ion-arrow-right-b:before { content: "\f10a"; }
+
+.ion-arrow-right-c:before { content: "\f10b"; }
+
+.ion-arrow-shrink:before { content: "\f267"; }
+
+.ion-arrow-swap:before { content: "\f268"; }
+
+.ion-arrow-up-a:before { content: "\f10c"; }
+
+.ion-arrow-up-b:before { content: "\f10d"; }
+
+.ion-arrow-up-c:before { content: "\f10e"; }
+
+.ion-asterisk:before { content: "\f314"; }
+
+.ion-at:before { content: "\f10f"; }
+
+.ion-backspace:before { content: "\f3bf"; }
+
+.ion-backspace-outline:before { content: "\f3be"; }
+
+.ion-bag:before { content: "\f110"; }
+
+.ion-battery-charging:before { content: "\f111"; }
+
+.ion-battery-empty:before { content: "\f112"; }
+
+.ion-battery-full:before { content: "\f113"; }
+
+.ion-battery-half:before { content: "\f114"; }
+
+.ion-battery-low:before { content: "\f115"; }
+
+.ion-beaker:before { content: "\f269"; }
+
+.ion-beer:before { content: "\f26a"; }
+
+.ion-bluetooth:before { content: "\f116"; }
+
+.ion-bonfire:before { content: "\f315"; }
+
+.ion-bookmark:before { content: "\f26b"; }
+
+.ion-bowtie:before { content: "\f3c0"; }
+
+.ion-briefcase:before { content: "\f26c"; }
+
+.ion-bug:before { content: "\f2be"; }
+
+.ion-calculator:before { content: "\f26d"; }
+
+.ion-calendar:before { content: "\f117"; }
+
+.ion-camera:before { content: "\f118"; }
+
+.ion-card:before { content: "\f119"; }
+
+.ion-cash:before { content: "\f316"; }
+
+.ion-chatbox:before { content: "\f11b"; }
+
+.ion-chatbox-working:before { content: "\f11a"; }
+
+.ion-chatboxes:before { content: "\f11c"; }
+
+.ion-chatbubble:before { content: "\f11e"; }
+
+.ion-chatbubble-working:before { content: "\f11d"; }
+
+.ion-chatbubbles:before { content: "\f11f"; }
+
+.ion-checkmark:before { content: "\f122"; }
+
+.ion-checkmark-circled:before { content: "\f120"; }
+
+.ion-checkmark-round:before { content: "\f121"; }
+
+.ion-chevron-down:before { content: "\f123"; }
+
+.ion-chevron-left:before { content: "\f124"; }
+
+.ion-chevron-right:before { content: "\f125"; }
+
+.ion-chevron-up:before { content: "\f126"; }
+
+.ion-clipboard:before { content: "\f127"; }
+
+.ion-clock:before { content: "\f26e"; }
+
+.ion-close:before { content: "\f12a"; }
+
+.ion-close-circled:before { content: "\f128"; }
+
+.ion-close-round:before { content: "\f129"; }
+
+.ion-closed-captioning:before { content: "\f317"; }
+
+.ion-cloud:before { content: "\f12b"; }
+
+.ion-code:before { content: "\f271"; }
+
+.ion-code-download:before { content: "\f26f"; }
+
+.ion-code-working:before { content: "\f270"; }
+
+.ion-coffee:before { content: "\f272"; }
+
+.ion-compass:before { content: "\f273"; }
+
+.ion-compose:before { content: "\f12c"; }
+
+.ion-connection-bars:before { content: "\f274"; }
+
+.ion-contrast:before { content: "\f275"; }
+
+.ion-crop:before { content: "\f3c1"; }
+
+.ion-cube:before { content: "\f318"; }
+
+.ion-disc:before { content: "\f12d"; }
+
+.ion-document:before { content: "\f12f"; }
+
+.ion-document-text:before { content: "\f12e"; }
+
+.ion-drag:before { content: "\f130"; }
+
+.ion-earth:before { content: "\f276"; }
+
+.ion-easel:before { content: "\f3c2"; }
+
+.ion-edit:before { content: "\f2bf"; }
+
+.ion-egg:before { content: "\f277"; }
+
+.ion-eject:before { content: "\f131"; }
+
+.ion-email:before { content: "\f132"; }
+
+.ion-email-unread:before { content: "\f3c3"; }
+
+.ion-erlenmeyer-flask:before { content: "\f3c5"; }
+
+.ion-erlenmeyer-flask-bubbles:before { content: "\f3c4"; }
+
+.ion-eye:before { content: "\f133"; }
+
+.ion-eye-disabled:before { content: "\f306"; }
+
+.ion-female:before { content: "\f278"; }
+
+.ion-filing:before { content: "\f134"; }
+
+.ion-film-marker:before { content: "\f135"; }
+
+.ion-fireball:before { content: "\f319"; }
+
+.ion-flag:before { content: "\f279"; }
+
+.ion-flame:before { content: "\f31a"; }
+
+.ion-flash:before { content: "\f137"; }
+
+.ion-flash-off:before { content: "\f136"; }
+
+.ion-folder:before { content: "\f139"; }
+
+.ion-fork:before { content: "\f27a"; }
+
+.ion-fork-repo:before { content: "\f2c0"; }
+
+.ion-forward:before { content: "\f13a"; }
+
+.ion-funnel:before { content: "\f31b"; }
+
+.ion-gear-a:before { content: "\f13d"; }
+
+.ion-gear-b:before { content: "\f13e"; }
+
+.ion-grid:before { content: "\f13f"; }
+
+.ion-hammer:before { content: "\f27b"; }
+
+.ion-happy:before { content: "\f31c"; }
+
+.ion-happy-outline:before { content: "\f3c6"; }
+
+.ion-headphone:before { content: "\f140"; }
+
+.ion-heart:before { content: "\f141"; }
+
+.ion-heart-broken:before { content: "\f31d"; }
+
+.ion-help:before { content: "\f143"; }
+
+.ion-help-buoy:before { content: "\f27c"; }
+
+.ion-help-circled:before { content: "\f142"; }
+
+.ion-home:before { content: "\f144"; }
+
+.ion-icecream:before { content: "\f27d"; }
+
+.ion-image:before { content: "\f147"; }
+
+.ion-images:before { content: "\f148"; }
+
+.ion-information:before { content: "\f14a"; }
+
+.ion-information-circled:before { content: "\f149"; }
+
+.ion-ionic:before { content: "\f14b"; }
+
+.ion-ios-alarm:before { content: "\f3c8"; }
+
+.ion-ios-alarm-outline:before { content: "\f3c7"; }
+
+.ion-ios-albums:before { content: "\f3ca"; }
+
+.ion-ios-albums-outline:before { content: "\f3c9"; }
+
+.ion-ios-americanfootball:before { content: "\f3cc"; }
+
+.ion-ios-americanfootball-outline:before { content: "\f3cb"; }
+
+.ion-ios-analytics:before { content: "\f3ce"; }
+
+.ion-ios-analytics-outline:before { content: "\f3cd"; }
+
+.ion-ios-arrow-back:before { content: "\f3cf"; }
+
+.ion-ios-arrow-down:before { content: "\f3d0"; }
+
+.ion-ios-arrow-forward:before { content: "\f3d1"; }
+
+.ion-ios-arrow-left:before { content: "\f3d2"; }
+
+.ion-ios-arrow-right:before { content: "\f3d3"; }
+
+.ion-ios-arrow-thin-down:before { content: "\f3d4"; }
+
+.ion-ios-arrow-thin-left:before { content: "\f3d5"; }
+
+.ion-ios-arrow-thin-right:before { content: "\f3d6"; }
+
+.ion-ios-arrow-thin-up:before { content: "\f3d7"; }
+
+.ion-ios-arrow-up:before { content: "\f3d8"; }
+
+.ion-ios-at:before { content: "\f3da"; }
+
+.ion-ios-at-outline:before { content: "\f3d9"; }
+
+.ion-ios-barcode:before { content: "\f3dc"; }
+
+.ion-ios-barcode-outline:before { content: "\f3db"; }
+
+.ion-ios-baseball:before { content: "\f3de"; }
+
+.ion-ios-baseball-outline:before { content: "\f3dd"; }
+
+.ion-ios-basketball:before { content: "\f3e0"; }
+
+.ion-ios-basketball-outline:before { content: "\f3df"; }
+
+.ion-ios-bell:before { content: "\f3e2"; }
+
+.ion-ios-bell-outline:before { content: "\f3e1"; }
+
+.ion-ios-body:before { content: "\f3e4"; }
+
+.ion-ios-body-outline:before { content: "\f3e3"; }
+
+.ion-ios-bolt:before { content: "\f3e6"; }
+
+.ion-ios-bolt-outline:before { content: "\f3e5"; }
+
+.ion-ios-book:before { content: "\f3e8"; }
+
+.ion-ios-book-outline:before { content: "\f3e7"; }
+
+.ion-ios-bookmarks:before { content: "\f3ea"; }
+
+.ion-ios-bookmarks-outline:before { content: "\f3e9"; }
+
+.ion-ios-box:before { content: "\f3ec"; }
+
+.ion-ios-box-outline:before { content: "\f3eb"; }
+
+.ion-ios-briefcase:before { content: "\f3ee"; }
+
+.ion-ios-briefcase-outline:before { content: "\f3ed"; }
+
+.ion-ios-browsers:before { content: "\f3f0"; }
+
+.ion-ios-browsers-outline:before { content: "\f3ef"; }
+
+.ion-ios-calculator:before { content: "\f3f2"; }
+
+.ion-ios-calculator-outline:before { content: "\f3f1"; }
+
+.ion-ios-calendar:before { content: "\f3f4"; }
+
+.ion-ios-calendar-outline:before { content: "\f3f3"; }
+
+.ion-ios-camera:before { content: "\f3f6"; }
+
+.ion-ios-camera-outline:before { content: "\f3f5"; }
+
+.ion-ios-cart:before { content: "\f3f8"; }
+
+.ion-ios-cart-outline:before { content: "\f3f7"; }
+
+.ion-ios-chatboxes:before { content: "\f3fa"; }
+
+.ion-ios-chatboxes-outline:before { content: "\f3f9"; }
+
+.ion-ios-chatbubble:before { content: "\f3fc"; }
+
+.ion-ios-chatbubble-outline:before { content: "\f3fb"; }
+
+.ion-ios-checkmark:before { content: "\f3ff"; }
+
+.ion-ios-checkmark-empty:before { content: "\f3fd"; }
+
+.ion-ios-checkmark-outline:before { content: "\f3fe"; }
+
+.ion-ios-circle-filled:before { content: "\f400"; }
+
+.ion-ios-circle-outline:before { content: "\f401"; }
+
+.ion-ios-clock:before { content: "\f403"; }
+
+.ion-ios-clock-outline:before { content: "\f402"; }
+
+.ion-ios-close:before { content: "\f406"; }
+
+.ion-ios-close-empty:before { content: "\f404"; }
+
+.ion-ios-close-outline:before { content: "\f405"; }
+
+.ion-ios-cloud:before { content: "\f40c"; }
+
+.ion-ios-cloud-download:before { content: "\f408"; }
+
+.ion-ios-cloud-download-outline:before { content: "\f407"; }
+
+.ion-ios-cloud-outline:before { content: "\f409"; }
+
+.ion-ios-cloud-upload:before { content: "\f40b"; }
+
+.ion-ios-cloud-upload-outline:before { content: "\f40a"; }
+
+.ion-ios-cloudy:before { content: "\f410"; }
+
+.ion-ios-cloudy-night:before { content: "\f40e"; }
+
+.ion-ios-cloudy-night-outline:before { content: "\f40d"; }
+
+.ion-ios-cloudy-outline:before { content: "\f40f"; }
+
+.ion-ios-cog:before { content: "\f412"; }
+
+.ion-ios-cog-outline:before { content: "\f411"; }
+
+.ion-ios-color-filter:before { content: "\f414"; }
+
+.ion-ios-color-filter-outline:before { content: "\f413"; }
+
+.ion-ios-color-wand:before { content: "\f416"; }
+
+.ion-ios-color-wand-outline:before { content: "\f415"; }
+
+.ion-ios-compose:before { content: "\f418"; }
+
+.ion-ios-compose-outline:before { content: "\f417"; }
+
+.ion-ios-contact:before { content: "\f41a"; }
+
+.ion-ios-contact-outline:before { content: "\f419"; }
+
+.ion-ios-copy:before { content: "\f41c"; }
+
+.ion-ios-copy-outline:before { content: "\f41b"; }
+
+.ion-ios-crop:before { content: "\f41e"; }
+
+.ion-ios-crop-strong:before { content: "\f41d"; }
+
+.ion-ios-download:before { content: "\f420"; }
+
+.ion-ios-download-outline:before { content: "\f41f"; }
+
+.ion-ios-drag:before { content: "\f421"; }
+
+.ion-ios-email:before { content: "\f423"; }
+
+.ion-ios-email-outline:before { content: "\f422"; }
+
+.ion-ios-eye:before { content: "\f425"; }
+
+.ion-ios-eye-outline:before { content: "\f424"; }
+
+.ion-ios-fastforward:before { content: "\f427"; }
+
+.ion-ios-fastforward-outline:before { content: "\f426"; }
+
+.ion-ios-filing:before { content: "\f429"; }
+
+.ion-ios-filing-outline:before { content: "\f428"; }
+
+.ion-ios-film:before { content: "\f42b"; }
+
+.ion-ios-film-outline:before { content: "\f42a"; }
+
+.ion-ios-flag:before { content: "\f42d"; }
+
+.ion-ios-flag-outline:before { content: "\f42c"; }
+
+.ion-ios-flame:before { content: "\f42f"; }
+
+.ion-ios-flame-outline:before { content: "\f42e"; }
+
+.ion-ios-flask:before { content: "\f431"; }
+
+.ion-ios-flask-outline:before { content: "\f430"; }
+
+.ion-ios-flower:before { content: "\f433"; }
+
+.ion-ios-flower-outline:before { content: "\f432"; }
+
+.ion-ios-folder:before { content: "\f435"; }
+
+.ion-ios-folder-outline:before { content: "\f434"; }
+
+.ion-ios-football:before { content: "\f437"; }
+
+.ion-ios-football-outline:before { content: "\f436"; }
+
+.ion-ios-game-controller-a:before { content: "\f439"; }
+
+.ion-ios-game-controller-a-outline:before { content: "\f438"; }
+
+.ion-ios-game-controller-b:before { content: "\f43b"; }
+
+.ion-ios-game-controller-b-outline:before { content: "\f43a"; }
+
+.ion-ios-gear:before { content: "\f43d"; }
+
+.ion-ios-gear-outline:before { content: "\f43c"; }
+
+.ion-ios-glasses:before { content: "\f43f"; }
+
+.ion-ios-glasses-outline:before { content: "\f43e"; }
+
+.ion-ios-grid-view:before { content: "\f441"; }
+
+.ion-ios-grid-view-outline:before { content: "\f440"; }
+
+.ion-ios-heart:before { content: "\f443"; }
+
+.ion-ios-heart-outline:before { content: "\f442"; }
+
+.ion-ios-help:before { content: "\f446"; }
+
+.ion-ios-help-empty:before { content: "\f444"; }
+
+.ion-ios-help-outline:before { content: "\f445"; }
+
+.ion-ios-home:before { content: "\f448"; }
+
+.ion-ios-home-outline:before { content: "\f447"; }
+
+.ion-ios-infinite:before { content: "\f44a"; }
+
+.ion-ios-infinite-outline:before { content: "\f449"; }
+
+.ion-ios-information:before { content: "\f44d"; }
+
+.ion-ios-information-empty:before { content: "\f44b"; }
+
+.ion-ios-information-outline:before { content: "\f44c"; }
+
+.ion-ios-ionic-outline:before { content: "\f44e"; }
+
+.ion-ios-keypad:before { content: "\f450"; }
+
+.ion-ios-keypad-outline:before { content: "\f44f"; }
+
+.ion-ios-lightbulb:before { content: "\f452"; }
+
+.ion-ios-lightbulb-outline:before { content: "\f451"; }
+
+.ion-ios-list:before { content: "\f454"; }
+
+.ion-ios-list-outline:before { content: "\f453"; }
+
+.ion-ios-location:before { content: "\f456"; }
+
+.ion-ios-location-outline:before { content: "\f455"; }
+
+.ion-ios-locked:before { content: "\f458"; }
+
+.ion-ios-locked-outline:before { content: "\f457"; }
+
+.ion-ios-loop:before { content: "\f45a"; }
+
+.ion-ios-loop-strong:before { content: "\f459"; }
+
+.ion-ios-medical:before { content: "\f45c"; }
+
+.ion-ios-medical-outline:before { content: "\f45b"; }
+
+.ion-ios-medkit:before { content: "\f45e"; }
+
+.ion-ios-medkit-outline:before { content: "\f45d"; }
+
+.ion-ios-mic:before { content: "\f461"; }
+
+.ion-ios-mic-off:before { content: "\f45f"; }
+
+.ion-ios-mic-outline:before { content: "\f460"; }
+
+.ion-ios-minus:before { content: "\f464"; }
+
+.ion-ios-minus-empty:before { content: "\f462"; }
+
+.ion-ios-minus-outline:before { content: "\f463"; }
+
+.ion-ios-monitor:before { content: "\f466"; }
+
+.ion-ios-monitor-outline:before { content: "\f465"; }
+
+.ion-ios-moon:before { content: "\f468"; }
+
+.ion-ios-moon-outline:before { content: "\f467"; }
+
+.ion-ios-more:before { content: "\f46a"; }
+
+.ion-ios-more-outline:before { content: "\f469"; }
+
+.ion-ios-musical-note:before { content: "\f46b"; }
+
+.ion-ios-musical-notes:before { content: "\f46c"; }
+
+.ion-ios-navigate:before { content: "\f46e"; }
+
+.ion-ios-navigate-outline:before { content: "\f46d"; }
+
+.ion-ios-nutrition:before { content: "\f470"; }
+
+.ion-ios-nutrition-outline:before { content: "\f46f"; }
+
+.ion-ios-paper:before { content: "\f472"; }
+
+.ion-ios-paper-outline:before { content: "\f471"; }
+
+.ion-ios-paperplane:before { content: "\f474"; }
+
+.ion-ios-paperplane-outline:before { content: "\f473"; }
+
+.ion-ios-partlysunny:before { content: "\f476"; }
+
+.ion-ios-partlysunny-outline:before { content: "\f475"; }
+
+.ion-ios-pause:before { content: "\f478"; }
+
+.ion-ios-pause-outline:before { content: "\f477"; }
+
+.ion-ios-paw:before { content: "\f47a"; }
+
+.ion-ios-paw-outline:before { content: "\f479"; }
+
+.ion-ios-people:before { content: "\f47c"; }
+
+.ion-ios-people-outline:before { content: "\f47b"; }
+
+.ion-ios-person:before { content: "\f47e"; }
+
+.ion-ios-person-outline:before { content: "\f47d"; }
+
+.ion-ios-personadd:before { content: "\f480"; }
+
+.ion-ios-personadd-outline:before { content: "\f47f"; }
+
+.ion-ios-photos:before { content: "\f482"; }
+
+.ion-ios-photos-outline:before { content: "\f481"; }
+
+.ion-ios-pie:before { content: "\f484"; }
+
+.ion-ios-pie-outline:before { content: "\f483"; }
+
+.ion-ios-pint:before { content: "\f486"; }
+
+.ion-ios-pint-outline:before { content: "\f485"; }
+
+.ion-ios-play:before { content: "\f488"; }
+
+.ion-ios-play-outline:before { content: "\f487"; }
+
+.ion-ios-plus:before { content: "\f48b"; }
+
+.ion-ios-plus-empty:before { content: "\f489"; }
+
+.ion-ios-plus-outline:before { content: "\f48a"; }
+
+.ion-ios-pricetag:before { content: "\f48d"; }
+
+.ion-ios-pricetag-outline:before { content: "\f48c"; }
+
+.ion-ios-pricetags:before { content: "\f48f"; }
+
+.ion-ios-pricetags-outline:before { content: "\f48e"; }
+
+.ion-ios-printer:before { content: "\f491"; }
+
+.ion-ios-printer-outline:before { content: "\f490"; }
+
+.ion-ios-pulse:before { content: "\f493"; }
+
+.ion-ios-pulse-strong:before { content: "\f492"; }
+
+.ion-ios-rainy:before { content: "\f495"; }
+
+.ion-ios-rainy-outline:before { content: "\f494"; }
+
+.ion-ios-recording:before { content: "\f497"; }
+
+.ion-ios-recording-outline:before { content: "\f496"; }
+
+.ion-ios-redo:before { content: "\f499"; }
+
+.ion-ios-redo-outline:before { content: "\f498"; }
+
+.ion-ios-refresh:before { content: "\f49c"; }
+
+.ion-ios-refresh-empty:before { content: "\f49a"; }
+
+.ion-ios-refresh-outline:before { content: "\f49b"; }
+
+.ion-ios-reload:before { content: "\f49d"; }
+
+.ion-ios-reverse-camera:before { content: "\f49f"; }
+
+.ion-ios-reverse-camera-outline:before { content: "\f49e"; }
+
+.ion-ios-rewind:before { content: "\f4a1"; }
+
+.ion-ios-rewind-outline:before { content: "\f4a0"; }
+
+.ion-ios-rose:before { content: "\f4a3"; }
+
+.ion-ios-rose-outline:before { content: "\f4a2"; }
+
+.ion-ios-search:before { content: "\f4a5"; }
+
+.ion-ios-search-strong:before { content: "\f4a4"; }
+
+.ion-ios-settings:before { content: "\f4a7"; }
+
+.ion-ios-settings-strong:before { content: "\f4a6"; }
+
+.ion-ios-shuffle:before { content: "\f4a9"; }
+
+.ion-ios-shuffle-strong:before { content: "\f4a8"; }
+
+.ion-ios-skipbackward:before { content: "\f4ab"; }
+
+.ion-ios-skipbackward-outline:before { content: "\f4aa"; }
+
+.ion-ios-skipforward:before { content: "\f4ad"; }
+
+.ion-ios-skipforward-outline:before { content: "\f4ac"; }
+
+.ion-ios-snowy:before { content: "\f4ae"; }
+
+.ion-ios-speedometer:before { content: "\f4b0"; }
+
+.ion-ios-speedometer-outline:before { content: "\f4af"; }
+
+.ion-ios-star:before { content: "\f4b3"; }
+
+.ion-ios-star-half:before { content: "\f4b1"; }
+
+.ion-ios-star-outline:before { content: "\f4b2"; }
+
+.ion-ios-stopwatch:before { content: "\f4b5"; }
+
+.ion-ios-stopwatch-outline:before { content: "\f4b4"; }
+
+.ion-ios-sunny:before { content: "\f4b7"; }
+
+.ion-ios-sunny-outline:before { content: "\f4b6"; }
+
+.ion-ios-telephone:before { content: "\f4b9"; }
+
+.ion-ios-telephone-outline:before { content: "\f4b8"; }
+
+.ion-ios-tennisball:before { content: "\f4bb"; }
+
+.ion-ios-tennisball-outline:before { content: "\f4ba"; }
+
+.ion-ios-thunderstorm:before { content: "\f4bd"; }
+
+.ion-ios-thunderstorm-outline:before { content: "\f4bc"; }
+
+.ion-ios-time:before { content: "\f4bf"; }
+
+.ion-ios-time-outline:before { content: "\f4be"; }
+
+.ion-ios-timer:before { content: "\f4c1"; }
+
+.ion-ios-timer-outline:before { content: "\f4c0"; }
+
+.ion-ios-toggle:before { content: "\f4c3"; }
+
+.ion-ios-toggle-outline:before { content: "\f4c2"; }
+
+.ion-ios-trash:before { content: "\f4c5"; }
+
+.ion-ios-trash-outline:before { content: "\f4c4"; }
+
+.ion-ios-undo:before { content: "\f4c7"; }
+
+.ion-ios-undo-outline:before { content: "\f4c6"; }
+
+.ion-ios-unlocked:before { content: "\f4c9"; }
+
+.ion-ios-unlocked-outline:before { content: "\f4c8"; }
+
+.ion-ios-upload:before { content: "\f4cb"; }
+
+.ion-ios-upload-outline:before { content: "\f4ca"; }
+
+.ion-ios-videocam:before { content: "\f4cd"; }
+
+.ion-ios-videocam-outline:before { content: "\f4cc"; }
+
+.ion-ios-volume-high:before { content: "\f4ce"; }
+
+.ion-ios-volume-low:before { content: "\f4cf"; }
+
+.ion-ios-wineglass:before { content: "\f4d1"; }
+
+.ion-ios-wineglass-outline:before { content: "\f4d0"; }
+
+.ion-ios-world:before { content: "\f4d3"; }
+
+.ion-ios-world-outline:before { content: "\f4d2"; }
+
+.ion-ipad:before { content: "\f1f9"; }
+
+.ion-iphone:before { content: "\f1fa"; }
+
+.ion-ipod:before { content: "\f1fb"; }
+
+.ion-jet:before { content: "\f295"; }
+
+.ion-key:before { content: "\f296"; }
+
+.ion-knife:before { content: "\f297"; }
+
+.ion-laptop:before { content: "\f1fc"; }
+
+.ion-leaf:before { content: "\f1fd"; }
+
+.ion-levels:before { content: "\f298"; }
+
+.ion-lightbulb:before { content: "\f299"; }
+
+.ion-link:before { content: "\f1fe"; }
+
+.ion-load-a:before { content: "\f29a"; }
+
+.ion-load-b:before { content: "\f29b"; }
+
+.ion-load-c:before { content: "\f29c"; }
+
+.ion-load-d:before { content: "\f29d"; }
+
+.ion-location:before { content: "\f1ff"; }
+
+.ion-lock-combination:before { content: "\f4d4"; }
+
+.ion-locked:before { content: "\f200"; }
+
+.ion-log-in:before { content: "\f29e"; }
+
+.ion-log-out:before { content: "\f29f"; }
+
+.ion-loop:before { content: "\f201"; }
+
+.ion-magnet:before { content: "\f2a0"; }
+
+.ion-male:before { content: "\f2a1"; }
+
+.ion-man:before { content: "\f202"; }
+
+.ion-map:before { content: "\f203"; }
+
+.ion-medkit:before { content: "\f2a2"; }
+
+.ion-merge:before { content: "\f33f"; }
+
+.ion-mic-a:before { content: "\f204"; }
+
+.ion-mic-b:before { content: "\f205"; }
+
+.ion-mic-c:before { content: "\f206"; }
+
+.ion-minus:before { content: "\f209"; }
+
+.ion-minus-circled:before { content: "\f207"; }
+
+.ion-minus-round:before { content: "\f208"; }
+
+.ion-model-s:before { content: "\f2c1"; }
+
+.ion-monitor:before { content: "\f20a"; }
+
+.ion-more:before { content: "\f20b"; }
+
+.ion-mouse:before { content: "\f340"; }
+
+.ion-music-note:before { content: "\f20c"; }
+
+.ion-navicon:before { content: "\f20e"; }
+
+.ion-navicon-round:before { content: "\f20d"; }
+
+.ion-navigate:before { content: "\f2a3"; }
+
+.ion-network:before { content: "\f341"; }
+
+.ion-no-smoking:before { content: "\f2c2"; }
+
+.ion-nuclear:before { content: "\f2a4"; }
+
+.ion-outlet:before { content: "\f342"; }
+
+.ion-paintbrush:before { content: "\f4d5"; }
+
+.ion-paintbucket:before { content: "\f4d6"; }
+
+.ion-paper-airplane:before { content: "\f2c3"; }
+
+.ion-paperclip:before { content: "\f20f"; }
+
+.ion-pause:before { content: "\f210"; }
+
+.ion-person:before { content: "\f213"; }
+
+.ion-person-add:before { content: "\f211"; }
+
+.ion-person-stalker:before { content: "\f212"; }
+
+.ion-pie-graph:before { content: "\f2a5"; }
+
+.ion-pin:before { content: "\f2a6"; }
+
+.ion-pinpoint:before { content: "\f2a7"; }
+
+.ion-pizza:before { content: "\f2a8"; }
+
+.ion-plane:before { content: "\f214"; }
+
+.ion-planet:before { content: "\f343"; }
+
+.ion-play:before { content: "\f215"; }
+
+.ion-playstation:before { content: "\f30a"; }
+
+.ion-plus:before { content: "\f218"; }
+
+.ion-plus-circled:before { content: "\f216"; }
+
+.ion-plus-round:before { content: "\f217"; }
+
+.ion-podium:before { content: "\f344"; }
+
+.ion-pound:before { content: "\f219"; }
+
+.ion-power:before { content: "\f2a9"; }
+
+.ion-pricetag:before { content: "\f2aa"; }
+
+.ion-pricetags:before { content: "\f2ab"; }
+
+.ion-printer:before { content: "\f21a"; }
+
+.ion-pull-request:before { content: "\f345"; }
+
+.ion-qr-scanner:before { content: "\f346"; }
+
+.ion-quote:before { content: "\f347"; }
+
+.ion-radio-waves:before { content: "\f2ac"; }
+
+.ion-record:before { content: "\f21b"; }
+
+.ion-refresh:before { content: "\f21c"; }
+
+.ion-reply:before { content: "\f21e"; }
+
+.ion-reply-all:before { content: "\f21d"; }
+
+.ion-ribbon-a:before { content: "\f348"; }
+
+.ion-ribbon-b:before { content: "\f349"; }
+
+.ion-sad:before { content: "\f34a"; }
+
+.ion-sad-outline:before { content: "\f4d7"; }
+
+.ion-scissors:before { content: "\f34b"; }
+
+.ion-search:before { content: "\f21f"; }
+
+.ion-settings:before { content: "\f2ad"; }
+
+.ion-share:before { content: "\f220"; }
+
+.ion-shuffle:before { content: "\f221"; }
+
+.ion-skip-backward:before { content: "\f222"; }
+
+.ion-skip-forward:before { content: "\f223"; }
+
+.ion-social-android:before { content: "\f225"; }
+
+.ion-social-android-outline:before { content: "\f224"; }
+
+.ion-social-angular:before { content: "\f4d9"; }
+
+.ion-social-angular-outline:before { content: "\f4d8"; }
+
+.ion-social-apple:before { content: "\f227"; }
+
+.ion-social-apple-outline:before { content: "\f226"; }
+
+.ion-social-bitcoin:before { content: "\f2af"; }
+
+.ion-social-bitcoin-outline:before { content: "\f2ae"; }
+
+.ion-social-buffer:before { content: "\f229"; }
+
+.ion-social-buffer-outline:before { content: "\f228"; }
+
+.ion-social-chrome:before { content: "\f4db"; }
+
+.ion-social-chrome-outline:before { content: "\f4da"; }
+
+.ion-social-codepen:before { content: "\f4dd"; }
+
+.ion-social-codepen-outline:before { content: "\f4dc"; }
+
+.ion-social-css3:before { content: "\f4df"; }
+
+.ion-social-css3-outline:before { content: "\f4de"; }
+
+.ion-social-designernews:before { content: "\f22b"; }
+
+.ion-social-designernews-outline:before { content: "\f22a"; }
+
+.ion-social-dribbble:before { content: "\f22d"; }
+
+.ion-social-dribbble-outline:before { content: "\f22c"; }
+
+.ion-social-dropbox:before { content: "\f22f"; }
+
+.ion-social-dropbox-outline:before { content: "\f22e"; }
+
+.ion-social-euro:before { content: "\f4e1"; }
+
+.ion-social-euro-outline:before { content: "\f4e0"; }
+
+.ion-social-facebook:before { content: "\f231"; }
+
+.ion-social-facebook-outline:before { content: "\f230"; }
+
+.ion-social-foursquare:before { content: "\f34d"; }
+
+.ion-social-foursquare-outline:before { content: "\f34c"; }
+
+.ion-social-freebsd-devil:before { content: "\f2c4"; }
+
+.ion-social-github:before { content: "\f233"; }
+
+.ion-social-github-outline:before { content: "\f232"; }
+
+.ion-social-google:before { content: "\f34f"; }
+
+.ion-social-google-outline:before { content: "\f34e"; }
+
+.ion-social-googleplus:before { content: "\f235"; }
+
+.ion-social-googleplus-outline:before { content: "\f234"; }
+
+.ion-social-hackernews:before { content: "\f237"; }
+
+.ion-social-hackernews-outline:before { content: "\f236"; }
+
+.ion-social-html5:before { content: "\f4e3"; }
+
+.ion-social-html5-outline:before { content: "\f4e2"; }
+
+.ion-social-instagram:before { content: "\f351"; }
+
+.ion-social-instagram-outline:before { content: "\f350"; }
+
+.ion-social-javascript:before { content: "\f4e5"; }
+
+.ion-social-javascript-outline:before { content: "\f4e4"; }
+
+.ion-social-linkedin:before { content: "\f239"; }
+
+.ion-social-linkedin-outline:before { content: "\f238"; }
+
+.ion-social-markdown:before { content: "\f4e6"; }
+
+.ion-social-nodejs:before { content: "\f4e7"; }
+
+.ion-social-octocat:before { content: "\f4e8"; }
+
+.ion-social-pinterest:before { content: "\f2b1"; }
+
+.ion-social-pinterest-outline:before { content: "\f2b0"; }
+
+.ion-social-python:before { content: "\f4e9"; }
+
+.ion-social-reddit:before { content: "\f23b"; }
+
+.ion-social-reddit-outline:before { content: "\f23a"; }
+
+.ion-social-rss:before { content: "\f23d"; }
+
+.ion-social-rss-outline:before { content: "\f23c"; }
+
+.ion-social-sass:before { content: "\f4ea"; }
+
+.ion-social-skype:before { content: "\f23f"; }
+
+.ion-social-skype-outline:before { content: "\f23e"; }
+
+.ion-social-snapchat:before { content: "\f4ec"; }
+
+.ion-social-snapchat-outline:before { content: "\f4eb"; }
+
+.ion-social-tumblr:before { content: "\f241"; }
+
+.ion-social-tumblr-outline:before { content: "\f240"; }
+
+.ion-social-tux:before { content: "\f2c5"; }
+
+.ion-social-twitch:before { content: "\f4ee"; }
+
+.ion-social-twitch-outline:before { content: "\f4ed"; }
+
+.ion-social-twitter:before { content: "\f243"; }
+
+.ion-social-twitter-outline:before { content: "\f242"; }
+
+.ion-social-usd:before { content: "\f353"; }
+
+.ion-social-usd-outline:before { content: "\f352"; }
+
+.ion-social-vimeo:before { content: "\f245"; }
+
+.ion-social-vimeo-outline:before { content: "\f244"; }
+
+.ion-social-whatsapp:before { content: "\f4f0"; }
+
+.ion-social-whatsapp-outline:before { content: "\f4ef"; }
+
+.ion-social-windows:before { content: "\f247"; }
+
+.ion-social-windows-outline:before { content: "\f246"; }
+
+.ion-social-wordpress:before { content: "\f249"; }
+
+.ion-social-wordpress-outline:before { content: "\f248"; }
+
+.ion-social-yahoo:before { content: "\f24b"; }
+
+.ion-social-yahoo-outline:before { content: "\f24a"; }
+
+.ion-social-yen:before { content: "\f4f2"; }
+
+.ion-social-yen-outline:before { content: "\f4f1"; }
+
+.ion-social-youtube:before { content: "\f24d"; }
+
+.ion-social-youtube-outline:before { content: "\f24c"; }
+
+.ion-soup-can:before { content: "\f4f4"; }
+
+.ion-soup-can-outline:before { content: "\f4f3"; }
+
+.ion-speakerphone:before { content: "\f2b2"; }
+
+.ion-speedometer:before { content: "\f2b3"; }
+
+.ion-spoon:before { content: "\f2b4"; }
+
+.ion-star:before { content: "\f24e"; }
+
+.ion-stats-bars:before { content: "\f2b5"; }
+
+.ion-steam:before { content: "\f30b"; }
+
+.ion-stop:before { content: "\f24f"; }
+
+.ion-thermometer:before { content: "\f2b6"; }
+
+.ion-thumbsdown:before { content: "\f250"; }
+
+.ion-thumbsup:before { content: "\f251"; }
+
+.ion-toggle:before { content: "\f355"; }
+
+.ion-toggle-filled:before { content: "\f354"; }
+
+.ion-transgender:before { content: "\f4f5"; }
+
+.ion-trash-a:before { content: "\f252"; }
+
+.ion-trash-b:before { content: "\f253"; }
+
+.ion-trophy:before { content: "\f356"; }
+
+.ion-tshirt:before { content: "\f4f7"; }
+
+.ion-tshirt-outline:before { content: "\f4f6"; }
+
+.ion-umbrella:before { content: "\f2b7"; }
+
+.ion-university:before { content: "\f357"; }
+
+.ion-unlocked:before { content: "\f254"; }
+
+.ion-upload:before { content: "\f255"; }
+
+.ion-usb:before { content: "\f2b8"; }
+
+.ion-videocamera:before { content: "\f256"; }
+
+.ion-volume-high:before { content: "\f257"; }
+
+.ion-volume-low:before { content: "\f258"; }
+
+.ion-volume-medium:before { content: "\f259"; }
+
+.ion-volume-mute:before { content: "\f25a"; }
+
+.ion-wand:before { content: "\f358"; }
+
+.ion-waterdrop:before { content: "\f25b"; }
+
+.ion-wifi:before { content: "\f25c"; }
+
+.ion-wineglass:before { content: "\f2b9"; }
+
+.ion-woman:before { content: "\f25d"; }
+
+.ion-wrench:before { content: "\f2ba"; }
+
+.ion-xbox:before { content: "\f30c"; }
diff --git a/inst/rmd/h/ionicons-2.0.1/css/ionicons.min.css b/inst/rmd/h/ionicons-2.0.1/css/ionicons.min.css
new file mode 100755
index 0000000..ecb7dd3
--- /dev/null
+++ b/inst/rmd/h/ionicons-2.0.1/css/ionicons.min.css
@@ -0,0 +1,14 @@
+ at charset "UTF-8";/*!
+  Ionicons, v2.0.0
+  Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
+  https://twitter.com/benjsperry  https://twitter.com/ionicframework
+  MIT License: https://github.com/driftyco/ionicons
+
+  Android-style icons originally built by Google’s
+  Material Design Icons: https://github.com/google/material-design-icons
+  used under CC BY http://creativecommons.org/licenses/by/4.0/
+  Modified icons to fit ionicon’s grid from original.
+*/
+ at font-face { font-family: "Ionicons"; src: url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"); font-weight: normal; font-style: normal; }
+
+.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-ar [...]
diff --git a/inst/rmd/h/ionicons-2.0.1/fonts/ionicons.ttf b/inst/rmd/h/ionicons-2.0.1/fonts/ionicons.ttf
new file mode 100755
index 0000000..c4e4632
Binary files /dev/null and b/inst/rmd/h/ionicons-2.0.1/fonts/ionicons.ttf differ
diff --git a/inst/rmd/h/jquery-1.11.3/jquery.min.js b/inst/rmd/h/jquery-1.11.3/jquery.min.js
new file mode 100644
index 0000000..0f60b7b
--- /dev/null
+++ b/inst/rmd/h/jquery-1.11.3/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b [...]
+
+return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}fu [...]
+return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a, [...]
diff --git a/inst/rmd/h/jquery-AUTHORS.txt b/inst/rmd/h/jquery-AUTHORS.txt
new file mode 100644
index 0000000..14a0e68
--- /dev/null
+++ b/inst/rmd/h/jquery-AUTHORS.txt
@@ -0,0 +1,217 @@
+Authors ordered by first contribution.
+
+John Resig <jeresig at gmail.com>
+Gilles van den Hoven <gilles0181 at gmail.com>
+Michael Geary <mike at geary.com>
+Stefan Petre <stefan.petre at gmail.com>
+Yehuda Katz <wycats at gmail.com>
+Corey Jewett <cj at syntheticplayground.com>
+Klaus Hartl <klaus.hartl at googlemail.com>
+Franck Marcia <franck.marcia at gmail.com>
+Jörn Zaefferer <joern.zaefferer at gmail.com>
+Paul Bakaus <paul.bakaus at googlemail.com>
+Brandon Aaron <brandon.aaron at gmail.com>
+Mike Alsup <malsup at gmail.com>
+Dave Methvin <dave.methvin at gmail.com>
+Ed Engelhardt <edengelhardt at gmail.com>
+Sean Catchpole <littlecooldude at gmail.com>
+Paul Mclanahan <pmclanahan at gmail.com>
+David Serduke <davidserduke at gmail.com>
+Richard D. Worth <rdworth at gmail.com>
+Scott González <scott.gonzalez at gmail.com>
+Ariel Flesler <aflesler at gmail.com>
+Jon Evans <jon at springyweb.com>
+TJ Holowaychuk <tj at vision-media.ca>
+Michael Bensoussan <mickey at seesmic.com>
+Robert Katić <robert.katic at gmail.com>
+Louis-Rémi Babé <lrbabe at gmail.com>
+Earle Castledine <mrspeaker at gmail.com>
+Damian Janowski <damian.janowski at gmail.com>
+Rich Dougherty <rich at rd.gen.nz>
+Kim Dalsgaard <kim at kimdalsgaard.com>
+Andrea Giammarchi <andrea.giammarchi at gmail.com>
+Mark Gibson <jollytoad at gmail.com>
+Karl Swedberg <kswedberg at gmail.com>
+Justin Meyer <justinbmeyer at gmail.com>
+Ben Alman <cowboy at rj3.net>
+James Padolsey <cla at padolsey.net>
+David Petersen <public at petersendidit.com>
+Batiste Bieler <batiste at gmail.com>
+Alexander Farkas <info at corrupt-system.de>
+Rick Waldron <waldron.rick at gmail.com>
+Filipe Fortes <filipe at fortes.com>
+Neeraj Singh <neerajdotname at gmail.com>
+Paul Irish <paul.irish at gmail.com>
+Iraê Carvalho <irae at irae.pro.br>
+Matt Curry <matt at pseudocoder.com>
+Michael Monteleone <michael at michaelmonteleone.net>
+Noah Sloan <noah.sloan at gmail.com>
+Tom Viner <github at viner.tv>
+Douglas Neiner <doug at pixelgraphics.us>
+Adam J. Sontag <ajpiano at ajpiano.com>
+Dave Reed <dareed at microsoft.com>
+Ralph Whitbeck <ralph.whitbeck at gmail.com>
+Carl Fürstenberg <azatoth at gmail.com>
+Jacob Wright <jacwright at gmail.com>
+J. Ryan Stinnett <jryans at gmail.com>
+unknown <Igen005 at .upcorp.ad.uprr.com>
+temp01 <temp01irc at gmail.com>
+Heungsub Lee <h at subl.ee>
+Colin Snover <colin at alpha.zetafleet.com>
+Ryan W Tenney <ryan at 10e.us>
+Pinhook <contact at pinhooklabs.com>
+Ron Otten <r.j.g.otten at gmail.com>
+Jephte Clain <Jephte.Clain at univ-reunion.fr>
+Anton Matzneller <obhvsbypqghgc at gmail.com>
+Alex Sexton <AlexSexton at gmail.com>
+Dan Heberden <danheberden at gmail.com>
+Henri Wiechers <hwiechers at gmail.com>
+Russell Holbrook <russell.holbrook at patch.com>
+Julian Aubourg <aubourg.julian at gmail.com>
+Gianni Alessandro Chiappetta <gianni at runlevel6.org>
+Scott Jehl <scott at scottjehl.com>
+James Burke <jrburke at gmail.com>
+Jonas Pfenniger <jonas at pfenniger.name>
+Xavi Ramirez <xavi.rmz at gmail.com>
+Jared Grippe <jared at deadlyicon.com>
+Sylvester Keil <sylvester at keil.or.at>
+Brandon Sterne <bsterne at mozilla.com>
+Mathias Bynens <mathias at qiwi.be>
+Timmy Willison <timmywillisn at gmail.com>
+Corey Frang <gnarf at gnarf.net>
+Digitalxero <digitalxero>
+Anton Kovalyov <anton at kovalyov.net>
+David Murdoch <musicisair at yahoo.com>
+Josh Varner <josh.varner at gmail.com>
+Charles McNulty <cmcnulty at kznf.com>
+Jordan Boesch <jboesch26 at gmail.com>
+Jess Thrysoee <jess at thrysoee.dk>
+Michael Murray <m at murz.net>
+Lee Carpenter <elcarpie at gmail.com>
+Alexis Abril <me at alexisabril.com>
+Rob Morgan <robbym at gmail.com>
+John Firebaugh <john_firebaugh at bigfix.com>
+Sam Bisbee <sam at sbisbee.com>
+Gilmore Davidson <gilmoreorless at gmail.com>
+Brian Brennan <me at brianlovesthings.com>
+Xavier Montillet <xavierm02.net at gmail.com>
+Daniel Pihlstrom <sciolist.se at gmail.com>
+Sahab Yazdani <sahab.yazdani+github at gmail.com>
+avaly <github-com at agachi.name>
+Scott Hughes <hi at scott-hughes.me>
+Mike Sherov <mike.sherov at gmail.com>
+Greg Hazel <ghazel at gmail.com>
+Schalk Neethling <schalk at ossreleasefeed.com>
+Denis Knauf <Denis.Knauf at gmail.com>
+Timo Tijhof <krinklemail at gmail.com>
+Steen Nielsen <swinedk at gmail.com>
+Anton Ryzhov <anton at ryzhov.me>
+Shi Chuan <shichuanr at gmail.com>
+Berker Peksag <berker.peksag at gmail.com>
+Toby Brain <tobyb at freshview.com>
+Matt Mueller <mattmuelle at gmail.com>
+Justin <drakefjustin at gmail.com>
+Daniel Herman <daniel.c.herman at gmail.com>
+Oleg Gaidarenko <markelog at gmail.com>
+Richard Gibson <richard.gibson at gmail.com>
+Rafaël Blais Masson <rafbmasson at gmail.com>
+cmc3cn <59194618 at qq.com>
+Joe Presbrey <presbrey at gmail.com>
+Sindre Sorhus <sindresorhus at gmail.com>
+Arne de Bree <arne at bukkie.nl>
+Vladislav Zarakovsky <vlad.zar at gmail.com>
+Andrew E Monat <amonat at gmail.com>
+Oskari <admin at o-programs.com>
+Joao Henrique de Andrade Bruni <joaohbruni at yahoo.com.br>
+tsinha <tsinha at Anthonys-MacBook-Pro.local>
+Matt Farmer <matt at frmr.me>
+Trey Hunner <treyhunner at gmail.com>
+Jason Moon <jmoon at socialcast.com>
+Jeffery To <jeffery.to at gmail.com>
+Kris Borchers <kris.borchers at gmail.com>
+Vladimir Zhuravlev <private.face at gmail.com>
+Jacob Thornton <jacobthornton at gmail.com>
+Chad Killingsworth <chadkillingsworth at missouristate.edu>
+Nowres Rafid <nowres.rafed at gmail.com>
+David Benjamin <davidben at mit.edu>
+Uri Gilad <antishok at gmail.com>
+Chris Faulkner <thefaulkner at gmail.com>
+Elijah Manor <elijah.manor at gmail.com>
+Daniel Chatfield <chatfielddaniel at gmail.com>
+Nikita Govorov <nikita.govorov at gmail.com>
+Wesley Walser <wwalser at atlassian.com>
+Mike Pennisi <mike at mikepennisi.com>
+Markus Staab <markus.staab at redaxo.de>
+Dave Riddle <david at joyvuu.com>
+Callum Macrae <callum at lynxphp.com>
+Benjamin Truyman <bentruyman at gmail.com>
+James Huston <james at jameshuston.net>
+Erick Ruiz de Chávez <erickrdch at gmail.com>
+David Bonner <dbonner at cogolabs.com>
+Akintayo Akinwunmi <aakinwunmi at judge.com>
+MORGAN <morgan at morgangraphics.com>
+Ismail Khair <ismail.khair at gmail.com>
+Carl Danley <carldanley at gmail.com>
+Mike Petrovich <michael.c.petrovich at gmail.com>
+Greg Lavallee <greglavallee at wapolabs.com>
+Daniel Gálvez <dgalvez at editablething.com>
+Sai Lung Wong <sai.wong at huffingtonpost.com>
+Tom H Fuertes <TomFuertes at gmail.com>
+Roland Eckl <eckl.roland at googlemail.com>
+Jay Merrifield <fracmak at gmail.com>
+Allen J Schmidt Jr <cobrasoft at gmail.com>
+Jonathan Sampson <jjdsampson at gmail.com>
+Marcel Greter <marcel.greter at ocbnet.ch>
+Matthias Jäggli <matthias.jaeggli at gmail.com>
+David Fox <dfoxinator at gmail.com>
+Yiming He <yiminghe at gmail.com>
+Devin Cooper <cooper.semantics at gmail.com>
+Paul Ramos <paul.b.ramos at gmail.com>
+Rod Vagg <rod at vagg.org>
+Bennett Sorbo <bsorbo at gmail.com>
+Sebastian Burkhard <sebi.burkhard at gmail.com>
+nanto <nanto at moon.email.ne.jp>
+Danil Somsikov <danilasomsikov at gmail.com>
+Ryunosuke SATO <tricknotes.rs at gmail.com>
+Jean Boussier <jean.boussier at gmail.com>
+Adam Coulombe <me at adam.co>
+Andrew Plummer <plummer.andrew at gmail.com>
+Mark Raddatz <mraddatz at gmail.com>
+Dmitry Gusev <dmitry.gusev at gmail.com>
+Michał Gołębiowski <m.goleb at gmail.com>
+Nguyen Phuc Lam <ruado1987 at gmail.com>
+Tom H Fuertes <tomfuertes at gmail.com>
+Brandon Johnson <bjohn465+github at gmail.com>
+Jason Bedard <jason+jquery at jbedard.ca>
+Kyle Robinson Young <kyle at dontkry.com>
+Renato Oliveira dos Santos <ros3 at cin.ufpe.br>
+Chris Talkington <chris at talkingtontech.com>
+Eddie Monge <eddie at eddiemonge.com>
+Terry Jones <terry at jon.es>
+Jason Merino <jasonmerino at gmail.com>
+Jeremy Dunck <jdunck at gmail.com>
+Chris Price <price.c at gmail.com>
+Amey Sakhadeo <me at ameyms.com>
+Anthony Ryan <anthonyryan1 at gmail.com>
+Dominik D. Geyer <dominik.geyer at gmail.com>
+George Kats <katsgeorgeek at gmail.com>
+Lihan Li <frankieteardrop at gmail.com>
+Ronny Springer <springer.ronny at gmail.com>
+Marian Sollmann <marian.sollmann at cargomedia.ch>
+Corey Frang <gnarf37 at gmail.com>
+Chris Antaki <ChrisAntaki at gmail.com>
+Noah Hamann <njhamann at gmail.com>
+David Hong <d.hong at me.com>
+Jakob Stoeck <jakob at pokermania.de>
+Christopher Jones <christopherjonesqed at gmail.com>
+Forbes Lindesay <forbes at lindesay.co.uk>
+John Paul <john at johnkpaul.com>
+S. Andrew Sheppard <andrew at wq.io>
+Leonardo Balter <leonardo.balter at gmail.com>
+Roman Reiß <me at silverwind.io>
+Benjy Cui <benjytrys at gmail.com>
+Rodrigo Rosenfeld Rosas <rr.rosas at gmail.com>
+John Hoven <hovenj at gmail.com>
+Christian Kosmowski <ksmwsk at gmail.com>
+Liang Peng <poppinlp at gmail.com>
+TJ VanToll <tj.vantoll at gmail.com>
diff --git a/inst/rmd/h/jqueryui-1.11.4/README b/inst/rmd/h/jqueryui-1.11.4/README
new file mode 100644
index 0000000..9961a11
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/README
@@ -0,0 +1,8 @@
+This a jQuery UI custom build, downloaded from:
+http://jqueryui.com/download/#!version=1.11.4&components=1111111111110111111111111111111111111
+
+It includes all components except the datepicker, because it conflicts with
+bootstrap-datepicker that is packaged with Shiny.
+
+The copy of jQuery that is bundled with the download, under external/, is not
+included because Shiny already has its own copy of jQuery.
diff --git a/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_444444_256x240.png b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_444444_256x240.png
new file mode 100644
index 0000000..a802263
Binary files /dev/null and b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_444444_256x240.png differ
diff --git a/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_555555_256x240.png b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_555555_256x240.png
new file mode 100644
index 0000000..7009bf7
Binary files /dev/null and b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_555555_256x240.png differ
diff --git a/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_777620_256x240.png b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_777620_256x240.png
new file mode 100644
index 0000000..e0a1fdf
Binary files /dev/null and b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_777620_256x240.png differ
diff --git a/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_777777_256x240.png b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_777777_256x240.png
new file mode 100644
index 0000000..8e26ee4
Binary files /dev/null and b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_777777_256x240.png differ
diff --git a/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_cc0000_256x240.png b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_cc0000_256x240.png
new file mode 100644
index 0000000..2815430
Binary files /dev/null and b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_cc0000_256x240.png differ
diff --git a/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_ffffff_256x240.png b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_ffffff_256x240.png
new file mode 100644
index 0000000..4d66f59
Binary files /dev/null and b/inst/rmd/h/jqueryui-1.11.4/images/ui-icons_ffffff_256x240.png differ
diff --git a/inst/rmd/h/jqueryui-1.11.4/index.html b/inst/rmd/h/jqueryui-1.11.4/index.html
new file mode 100644
index 0000000..7f4a59a
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/index.html
@@ -0,0 +1,505 @@
+<!doctype html>
+<html lang="us">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Example Page</title>
+	<link href="jquery-ui.css" rel="stylesheet">
+	<style>
+	body{
+		font: 62.5% "Trebuchet MS", sans-serif;
+		margin: 50px;
+	}
+	.demoHeaders {
+		margin-top: 2em;
+	}
+	#dialog-link {
+		padding: .4em 1em .4em 20px;
+		text-decoration: none;
+		position: relative;
+	}
+	#dialog-link span.ui-icon {
+		margin: 0 5px 0 0;
+		position: absolute;
+		left: .2em;
+		top: 50%;
+		margin-top: -8px;
+	}
+	#icons {
+		margin: 0;
+		padding: 0;
+	}
+	#icons li {
+		margin: 2px;
+		position: relative;
+		padding: 4px 0;
+		cursor: pointer;
+		float: left;
+		list-style: none;
+	}
+	#icons span.ui-icon {
+		float: left;
+		margin: 0 4px;
+	}
+	.fakewindowcontain .ui-widget-overlay {
+		position: absolute;
+	}
+	select {
+		width: 200px;
+	}
+	</style>
+</head>
+<body>
+
+<h1>Welcome to jQuery UI!</h1>
+
+<div class="ui-widget">
+	<p>This page demonstrates the widgets and theme you selected in Download Builder. Please make sure you are using them with a compatible jQuery version.</p>
+</div>
+
+<h1>YOUR COMPONENTS:</h1>
+
+
+<!-- Accordion -->
+<h2 class="demoHeaders">Accordion</h2>
+<div id="accordion">
+	<h3>First</h3>
+	<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
+	<h3>Second</h3>
+	<div>Phasellus mattis tincidunt nibh.</div>
+	<h3>Third</h3>
+	<div>Nam dui erat, auctor a, dignissim quis.</div>
+</div>
+
+
+
+<!-- Autocomplete -->
+<h2 class="demoHeaders">Autocomplete</h2>
+<div>
+	<input id="autocomplete" title="type "a"">
+</div>
+
+
+
+<!-- Button -->
+<h2 class="demoHeaders">Button</h2>
+<button id="button">A button element</button>
+<form style="margin-top: 1em;">
+	<div id="radioset">
+		<input type="radio" id="radio1" name="radio"><label for="radio1">Choice 1</label>
+		<input type="radio" id="radio2" name="radio" checked="checked"><label for="radio2">Choice 2</label>
+		<input type="radio" id="radio3" name="radio"><label for="radio3">Choice 3</label>
+	</div>
+</form>
+
+
+
+<!-- Tabs -->
+<h2 class="demoHeaders">Tabs</h2>
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">First</a></li>
+		<li><a href="#tabs-2">Second</a></li>
+		<li><a href="#tabs-3">Third</a></li>
+	</ul>
+	<div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+	<div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
+	<div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
+</div>
+
+
+
+<!-- Dialog NOTE: Dialog is not generated by UI in this demo so it can be visually styled in themeroller-->
+<h2 class="demoHeaders">Dialog</h2>
+<p><a href="#" id="dialog-link" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-newwin"></span>Open Dialog</a></p>
+
+<h2 class="demoHeaders">Overlay and Shadow Classes <em>(not currently used in UI widgets)</em></h2>
+<div style="position: relative; width: 96%; height: 200px; padding:1% 2%; overflow:hidden;" class="fakewindowcontain">
+	<p>Lorem ipsum dolor sit amet,  Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. </p><p>Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit a [...]
+
+	<!-- ui-dialog -->
+	<div class="ui-overlay"><div class="ui-widget-overlay"></div><div class="ui-widget-shadow ui-corner-all" style="width: 302px; height: 152px; position: absolute; left: 50px; top: 30px;"></div></div>
+	<div style="position: absolute; width: 280px; height: 130px;left: 50px; top: 30px; padding: 10px;" class="ui-widget ui-widget-content ui-corner-all">
+		<div class="ui-dialog-content ui-widget-content" style="background: none; border: 0;">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+		</div>
+	</div>
+
+</div>
+
+<!-- ui-dialog -->
+<div id="dialog" title="Dialog Title">
+	<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+</div>
+
+
+
+<h2 class="demoHeaders">Framework Icons (content color preview)</h2>
+<ul id="icons" class="ui-widget ui-helper-clearfix">
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-n"><span class="ui-icon ui-icon-carat-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-ne"><span class="ui-icon ui-icon-carat-1-ne"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-e"><span class="ui-icon ui-icon-carat-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-se"><span class="ui-icon ui-icon-carat-1-se"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-s"><span class="ui-icon ui-icon-carat-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-sw"><span class="ui-icon ui-icon-carat-1-sw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-w"><span class="ui-icon ui-icon-carat-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-nw"><span class="ui-icon ui-icon-carat-1-nw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-n-s"><span class="ui-icon ui-icon-carat-2-n-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-e-w"><span class="ui-icon ui-icon-carat-2-e-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-n"><span class="ui-icon ui-icon-triangle-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-ne"><span class="ui-icon ui-icon-triangle-1-ne"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-e"><span class="ui-icon ui-icon-triangle-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-se"><span class="ui-icon ui-icon-triangle-1-se"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-s"><span class="ui-icon ui-icon-triangle-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-sw"><span class="ui-icon ui-icon-triangle-1-sw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-w"><span class="ui-icon ui-icon-triangle-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-nw"><span class="ui-icon ui-icon-triangle-1-nw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-n-s"><span class="ui-icon ui-icon-triangle-2-n-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-e-w"><span class="ui-icon ui-icon-triangle-2-e-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-n"><span class="ui-icon ui-icon-arrow-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-ne"><span class="ui-icon ui-icon-arrow-1-ne"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-e"><span class="ui-icon ui-icon-arrow-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-se"><span class="ui-icon ui-icon-arrow-1-se"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-s"><span class="ui-icon ui-icon-arrow-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-sw"><span class="ui-icon ui-icon-arrow-1-sw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-w"><span class="ui-icon ui-icon-arrow-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-nw"><span class="ui-icon ui-icon-arrow-1-nw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-n-s"><span class="ui-icon ui-icon-arrow-2-n-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-ne-sw"><span class="ui-icon ui-icon-arrow-2-ne-sw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-e-w"><span class="ui-icon ui-icon-arrow-2-e-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-se-nw"><span class="ui-icon ui-icon-arrow-2-se-nw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-n"><span class="ui-icon ui-icon-arrowstop-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-e"><span class="ui-icon ui-icon-arrowstop-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-s"><span class="ui-icon ui-icon-arrowstop-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-w"><span class="ui-icon ui-icon-arrowstop-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-n"><span class="ui-icon ui-icon-arrowthick-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-ne"><span class="ui-icon ui-icon-arrowthick-1-ne"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-e"><span class="ui-icon ui-icon-arrowthick-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-se"><span class="ui-icon ui-icon-arrowthick-1-se"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-s"><span class="ui-icon ui-icon-arrowthick-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-sw"><span class="ui-icon ui-icon-arrowthick-1-sw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-w"><span class="ui-icon ui-icon-arrowthick-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-nw"><span class="ui-icon ui-icon-arrowthick-1-nw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-n-s"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-ne-sw"><span class="ui-icon ui-icon-arrowthick-2-ne-sw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-e-w"><span class="ui-icon ui-icon-arrowthick-2-e-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-se-nw"><span class="ui-icon ui-icon-arrowthick-2-se-nw"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-n"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-e"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-s"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-w"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-w"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-n"><span class="ui-icon ui-icon-arrowreturnthick-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-e"><span class="ui-icon ui-icon-arrowreturnthick-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-s"><span class="ui-icon ui-icon-arrowreturnthick-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-w"><span class="ui-icon ui-icon-arrowreturn-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-n"><span class="ui-icon ui-icon-arrowreturn-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-e"><span class="ui-icon ui-icon-arrowreturn-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-s"><span class="ui-icon ui-icon-arrowreturn-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-w"><span class="ui-icon ui-icon-arrowrefresh-1-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-n"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-e"><span class="ui-icon ui-icon-arrowrefresh-1-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-s"><span class="ui-icon ui-icon-arrowrefresh-1-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4"><span class="ui-icon ui-icon-arrow-4"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4-diag"><span class="ui-icon ui-icon-arrow-4-diag"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-extlink"><span class="ui-icon ui-icon-extlink"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-newwin"><span class="ui-icon ui-icon-newwin"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-refresh"><span class="ui-icon ui-icon-refresh"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-shuffle"><span class="ui-icon ui-icon-shuffle"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-transfer-e-w"><span class="ui-icon ui-icon-transfer-e-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-transferthick-e-w"><span class="ui-icon ui-icon-transferthick-e-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-collapsed"><span class="ui-icon ui-icon-folder-collapsed"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-open"><span class="ui-icon ui-icon-folder-open"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-document"><span class="ui-icon ui-icon-document"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-document-b"><span class="ui-icon ui-icon-document-b"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-note"><span class="ui-icon ui-icon-note"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-open"><span class="ui-icon ui-icon-mail-open"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-suitcase"><span class="ui-icon ui-icon-suitcase"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-comment"><span class="ui-icon ui-icon-comment"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-person"><span class="ui-icon ui-icon-person"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-print"><span class="ui-icon ui-icon-print"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-trash"><span class="ui-icon ui-icon-trash"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-locked"><span class="ui-icon ui-icon-locked"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-unlocked"><span class="ui-icon ui-icon-unlocked"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-bookmark"><span class="ui-icon ui-icon-bookmark"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-tag"><span class="ui-icon ui-icon-tag"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-home"><span class="ui-icon ui-icon-home"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-flag"><span class="ui-icon ui-icon-flag"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-calculator"><span class="ui-icon ui-icon-calculator"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-cart"><span class="ui-icon ui-icon-cart"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-pencil"><span class="ui-icon ui-icon-pencil"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-clock"><span class="ui-icon ui-icon-clock"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-disk"><span class="ui-icon ui-icon-disk"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-calendar"><span class="ui-icon ui-icon-calendar"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomin"><span class="ui-icon ui-icon-zoomin"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomout"><span class="ui-icon ui-icon-zoomout"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-search"><span class="ui-icon ui-icon-search"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-wrench"><span class="ui-icon ui-icon-wrench"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-gear"><span class="ui-icon ui-icon-gear"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-heart"><span class="ui-icon ui-icon-heart"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-star"><span class="ui-icon ui-icon-star"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-link"><span class="ui-icon ui-icon-link"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-cancel"><span class="ui-icon ui-icon-cancel"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-plus"><span class="ui-icon ui-icon-plus"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-minus"><span class="ui-icon ui-icon-minus"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-minusthick"><span class="ui-icon ui-icon-minusthick"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-close"><span class="ui-icon ui-icon-close"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-closethick"><span class="ui-icon ui-icon-closethick"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-key"><span class="ui-icon ui-icon-key"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-lightbulb"><span class="ui-icon ui-icon-lightbulb"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-scissors"><span class="ui-icon ui-icon-scissors"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-clipboard"><span class="ui-icon ui-icon-clipboard"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-copy"><span class="ui-icon ui-icon-copy"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-contact"><span class="ui-icon ui-icon-contact"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-image"><span class="ui-icon ui-icon-image"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-video"><span class="ui-icon ui-icon-video"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-script"><span class="ui-icon ui-icon-script"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-alert"><span class="ui-icon ui-icon-alert"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-info"><span class="ui-icon ui-icon-info"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-notice"><span class="ui-icon ui-icon-notice"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-help"><span class="ui-icon ui-icon-help"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-bullet"><span class="ui-icon ui-icon-bullet"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-off"><span class="ui-icon ui-icon-radio-off"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-on"><span class="ui-icon ui-icon-radio-on"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-w"><span class="ui-icon ui-icon-pin-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-s"><span class="ui-icon ui-icon-pin-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-play"><span class="ui-icon ui-icon-play"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-pause"><span class="ui-icon ui-icon-pause"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-next"><span class="ui-icon ui-icon-seek-next"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-prev"><span class="ui-icon ui-icon-seek-prev"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-end"><span class="ui-icon ui-icon-seek-end"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-first"><span class="ui-icon ui-icon-seek-first"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-stop"><span class="ui-icon ui-icon-stop"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-eject"><span class="ui-icon ui-icon-eject"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-off"><span class="ui-icon ui-icon-volume-off"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-on"><span class="ui-icon ui-icon-volume-on"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-power"><span class="ui-icon ui-icon-power"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-signal-diag"><span class="ui-icon ui-icon-signal-diag"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-signal"><span class="ui-icon ui-icon-signal"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-0"><span class="ui-icon ui-icon-battery-0"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-1"><span class="ui-icon ui-icon-battery-1"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-2"><span class="ui-icon ui-icon-battery-2"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-3"><span class="ui-icon ui-icon-battery-3"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-plus"><span class="ui-icon ui-icon-circle-plus"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-minus"><span class="ui-icon ui-icon-circle-minus"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-close"><span class="ui-icon ui-icon-circle-close"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-e"><span class="ui-icon ui-icon-circle-triangle-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-s"><span class="ui-icon ui-icon-circle-triangle-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-w"><span class="ui-icon ui-icon-circle-triangle-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-n"><span class="ui-icon ui-icon-circle-triangle-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-e"><span class="ui-icon ui-icon-circle-arrow-e"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-s"><span class="ui-icon ui-icon-circle-arrow-s"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-w"><span class="ui-icon ui-icon-circle-arrow-w"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-n"><span class="ui-icon ui-icon-circle-arrow-n"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomin"><span class="ui-icon ui-icon-circle-zoomin"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomout"><span class="ui-icon ui-icon-circle-zoomout"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-check"><span class="ui-icon ui-icon-circle-check"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-plus"><span class="ui-icon ui-icon-circlesmall-plus"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-minus"><span class="ui-icon ui-icon-circlesmall-minus"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-close"><span class="ui-icon ui-icon-circlesmall-close"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-plus"><span class="ui-icon ui-icon-squaresmall-plus"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-minus"><span class="ui-icon ui-icon-squaresmall-minus"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-close"><span class="ui-icon ui-icon-squaresmall-close"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-vertical"><span class="ui-icon ui-icon-grip-dotted-vertical"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-horizontal"><span class="ui-icon ui-icon-grip-dotted-horizontal"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-vertical"><span class="ui-icon ui-icon-grip-solid-vertical"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-horizontal"><span class="ui-icon ui-icon-grip-solid-horizontal"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-gripsmall-diagonal-se"><span class="ui-icon ui-icon-gripsmall-diagonal-se"></span></li>
+	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li>
+</ul>
+
+
+<!-- Slider -->
+<h2 class="demoHeaders">Slider</h2>
+<div id="slider"></div>
+
+
+
+
+
+<!-- Progressbar -->
+<h2 class="demoHeaders">Progressbar</h2>
+<div id="progressbar"></div>
+
+
+
+<!-- Progressbar -->
+<h2 class="demoHeaders">Selectmenu</h2>
+<select id="selectmenu">
+	<option>Slower</option>
+	<option>Slow</option>
+	<option selected="selected">Medium</option>
+	<option>Fast</option>
+	<option>Faster</option>
+</select>
+
+
+
+<!-- Spinner -->
+<h2 class="demoHeaders">Spinner</h2>
+<input id="spinner">
+
+
+
+<!-- Menu -->
+<h2 class="demoHeaders">Menu</h2>
+<ul style="width:100px;" id="menu">
+	<li>Item 1</li>
+	<li>Item 2</li>
+	<li>Item 3
+		<ul>
+			<li>Item 3-1</li>
+			<li>Item 3-2</li>
+			<li>Item 3-3</li>
+			<li>Item 3-4</li>
+			<li>Item 3-5</li>
+		</ul>
+	</li>
+	<li>Item 4</li>
+	<li>Item 5</li>
+</ul>
+
+
+
+<!-- Tooltip -->
+<h2 class="demoHeaders">Tooltip</h2>
+<p id="tooltip">
+	<a href="#" title="That's what this widget is">Tooltips</a> can be attached to any element. When you hover
+the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip.
+</p>
+
+
+<!-- Highlight / Error -->
+<h2 class="demoHeaders">Highlight / Error</h2>
+<div class="ui-widget">
+	<div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;">
+		<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
+		<strong>Hey!</strong> Sample ui-state-highlight style.</p>
+	</div>
+</div>
+<br>
+<div class="ui-widget">
+	<div class="ui-state-error ui-corner-all" style="padding: 0 .7em;">
+		<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>
+		<strong>Alert:</strong> Sample ui-state-error style.</p>
+	</div>
+</div>
+
+<script src="external/jquery/jquery.js"></script>
+<script src="jquery-ui.js"></script>
+<script>
+
+$( "#accordion" ).accordion();
+
+
+
+var availableTags = [
+	"ActionScript",
+	"AppleScript",
+	"Asp",
+	"BASIC",
+	"C",
+	"C++",
+	"Clojure",
+	"COBOL",
+	"ColdFusion",
+	"Erlang",
+	"Fortran",
+	"Groovy",
+	"Haskell",
+	"Java",
+	"JavaScript",
+	"Lisp",
+	"Perl",
+	"PHP",
+	"Python",
+	"Ruby",
+	"Scala",
+	"Scheme"
+];
+$( "#autocomplete" ).autocomplete({
+	source: availableTags
+});
+
+
+
+$( "#button" ).button();
+$( "#radioset" ).buttonset();
+
+
+
+$( "#tabs" ).tabs();
+
+
+
+$( "#dialog" ).dialog({
+	autoOpen: false,
+	width: 400,
+	buttons: [
+		{
+			text: "Ok",
+			click: function() {
+				$( this ).dialog( "close" );
+			}
+		},
+		{
+			text: "Cancel",
+			click: function() {
+				$( this ).dialog( "close" );
+			}
+		}
+	]
+});
+
+// Link to open the dialog
+$( "#dialog-link" ).click(function( event ) {
+	$( "#dialog" ).dialog( "open" );
+	event.preventDefault();
+});
+
+
+
+
+
+$( "#slider" ).slider({
+	range: true,
+	values: [ 17, 67 ]
+});
+
+
+
+$( "#progressbar" ).progressbar({
+	value: 20
+});
+
+
+
+$( "#spinner" ).spinner();
+
+
+
+$( "#menu" ).menu();
+
+
+
+$( "#tooltip" ).tooltip();
+
+
+
+$( "#selectmenu" ).selectmenu();
+
+
+// Hover states on the static widgets
+$( "#dialog-link, #icons li" ).hover(
+	function() {
+		$( this ).addClass( "ui-state-hover" );
+	},
+	function() {
+		$( this ).removeClass( "ui-state-hover" );
+	}
+);
+</script>
+</body>
+</html>
diff --git a/inst/rmd/h/jqueryui-1.11.4/jquery-ui.css b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.css
new file mode 100644
index 0000000..79732ee
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.css
@@ -0,0 +1,1060 @@
+/*! jQuery UI - v1.11.4 - 2016-01-05
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgC [...]
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+	display: none;
+}
+.ui-helper-hidden-accessible {
+	border: 0;
+	clip: rect(0 0 0 0);
+	height: 1px;
+	margin: -1px;
+	overflow: hidden;
+	padding: 0;
+	position: absolute;
+	width: 1px;
+}
+.ui-helper-reset {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	outline: 0;
+	line-height: 1.3;
+	text-decoration: none;
+	font-size: 100%;
+	list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+	content: "";
+	display: table;
+	border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+	clear: both;
+}
+.ui-helper-clearfix {
+	min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+	width: 100%;
+	height: 100%;
+	top: 0;
+	left: 0;
+	position: absolute;
+	opacity: 0;
+	filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+	z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+	cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	display: block;
+	text-indent: -99999px;
+	overflow: hidden;
+	background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.ui-draggable-handle {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-resizable {
+	position: relative;
+}
+.ui-resizable-handle {
+	position: absolute;
+	font-size: 0.1px;
+	display: block;
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+	display: none;
+}
+.ui-resizable-n {
+	cursor: n-resize;
+	height: 7px;
+	width: 100%;
+	top: -5px;
+	left: 0;
+}
+.ui-resizable-s {
+	cursor: s-resize;
+	height: 7px;
+	width: 100%;
+	bottom: -5px;
+	left: 0;
+}
+.ui-resizable-e {
+	cursor: e-resize;
+	width: 7px;
+	right: -5px;
+	top: 0;
+	height: 100%;
+}
+.ui-resizable-w {
+	cursor: w-resize;
+	width: 7px;
+	left: -5px;
+	top: 0;
+	height: 100%;
+}
+.ui-resizable-se {
+	cursor: se-resize;
+	width: 12px;
+	height: 12px;
+	right: 1px;
+	bottom: 1px;
+}
+.ui-resizable-sw {
+	cursor: sw-resize;
+	width: 9px;
+	height: 9px;
+	left: -5px;
+	bottom: -5px;
+}
+.ui-resizable-nw {
+	cursor: nw-resize;
+	width: 9px;
+	height: 9px;
+	left: -5px;
+	top: -5px;
+}
+.ui-resizable-ne {
+	cursor: ne-resize;
+	width: 9px;
+	height: 9px;
+	right: -5px;
+	top: -5px;
+}
+.ui-selectable {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-selectable-helper {
+	position: absolute;
+	z-index: 100;
+	border: 1px dotted black;
+}
+.ui-sortable-handle {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+	display: block;
+	cursor: pointer;
+	position: relative;
+	margin: 2px 0 0 0;
+	padding: .5em .5em .5em .7em;
+	min-height: 0; /* support: IE7 */
+	font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+	padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+	padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+	position: absolute;
+	left: .5em;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+	padding: 1em 2.2em;
+	border-top: 0;
+	overflow: auto;
+}
+.ui-autocomplete {
+	position: absolute;
+	top: 0;
+	left: 0;
+	cursor: default;
+}
+.ui-button {
+	display: inline-block;
+	position: relative;
+	padding: 0;
+	line-height: normal;
+	margin-right: .1em;
+	cursor: pointer;
+	vertical-align: middle;
+	text-align: center;
+	overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+	text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+	width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+	width: 2.4em;
+}
+.ui-button-icons-only {
+	width: 3.4em;
+}
+button.ui-button-icons-only {
+	width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+	display: block;
+	line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+	padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+	padding: .4em;
+	text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+	padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+	padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+	padding-left: 2.1em;
+	padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+	padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+	position: absolute;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+	left: 50%;
+	margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+	left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+	right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+	margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+	margin-left: 0;
+	margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+	border: 0;
+	padding: 0;
+}
+.ui-dialog {
+	overflow: hidden;
+	position: absolute;
+	top: 0;
+	left: 0;
+	padding: .2em;
+	outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+	padding: .4em 1em;
+	position: relative;
+}
+.ui-dialog .ui-dialog-title {
+	float: left;
+	margin: .1em 0;
+	white-space: nowrap;
+	width: 90%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+	position: absolute;
+	right: .3em;
+	top: 50%;
+	width: 20px;
+	margin: -10px 0 0 0;
+	padding: 1px;
+	height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+	position: relative;
+	border: 0;
+	padding: .5em 1em;
+	background: none;
+	overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+	text-align: left;
+	border-width: 1px 0 0 0;
+	background-image: none;
+	margin-top: .5em;
+	padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+	float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+	margin: .5em .4em .5em 0;
+	cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+	width: 12px;
+	height: 12px;
+	right: -5px;
+	bottom: -5px;
+	background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+	cursor: move;
+}
+.ui-menu {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+	display: block;
+	outline: none;
+}
+.ui-menu .ui-menu {
+	position: absolute;
+}
+.ui-menu .ui-menu-item {
+	position: relative;
+	margin: 0;
+	padding: 3px 1em 3px .4em;
+	cursor: pointer;
+	min-height: 0; /* support: IE7 */
+	/* support: IE10, see #8844 */
+	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+	margin: 5px 0;
+	height: 0;
+	font-size: 0;
+	line-height: 0;
+	border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+	margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+	position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+	padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: .2em;
+	margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+	left: auto;
+	right: 0;
+}
+.ui-progressbar {
+	height: 2em;
+	text-align: left;
+	overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+	margin: -1px;
+	height: 100%;
+}
+.ui-progressbar .ui-progressbar-overlay {
+	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmo [...]
+	height: 100%;
+	filter: alpha(opacity=25); /* support: IE8 */
+	opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+	background-image: none;
+}
+.ui-selectmenu-menu {
+	padding: 0;
+	margin: 0;
+	position: absolute;
+	top: 0;
+	left: 0;
+	display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+	overflow: auto;
+	/* Support: IE7 */
+	overflow-x: hidden;
+	padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+	font-size: 1em;
+	font-weight: bold;
+	line-height: 1.5;
+	padding: 2px 0.4em;
+	margin: 0.5em 0 0 0;
+	height: auto;
+	border: 0;
+}
+.ui-selectmenu-open {
+	display: block;
+}
+.ui-selectmenu-button {
+	display: inline-block;
+	overflow: hidden;
+	position: relative;
+	text-decoration: none;
+	cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+	right: 0.5em;
+	left: auto;
+	margin-top: -8px;
+	position: absolute;
+	top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+	text-align: left;
+	padding: 0.4em 2.1em 0.4em 1em;
+	display: block;
+	line-height: 1.4;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+.ui-slider {
+	position: relative;
+	text-align: left;
+}
+.ui-slider .ui-slider-handle {
+	position: absolute;
+	z-index: 2;
+	width: 1.2em;
+	height: 1.2em;
+	cursor: default;
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-slider .ui-slider-range {
+	position: absolute;
+	z-index: 1;
+	font-size: .7em;
+	display: block;
+	border: 0;
+	background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+	filter: inherit;
+}
+
+.ui-slider-horizontal {
+	height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+	top: -.3em;
+	margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+	top: 0;
+	height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+	left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+	right: 0;
+}
+
+.ui-slider-vertical {
+	width: .8em;
+	height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+	left: -.3em;
+	margin-left: 0;
+	margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+	left: 0;
+	width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+	bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+	top: 0;
+}
+.ui-spinner {
+	position: relative;
+	display: inline-block;
+	overflow: hidden;
+	padding: 0;
+	vertical-align: middle;
+}
+.ui-spinner-input {
+	border: none;
+	background: none;
+	color: inherit;
+	padding: 0;
+	margin: .2em 0;
+	vertical-align: middle;
+	margin-left: .4em;
+	margin-right: 22px;
+}
+.ui-spinner-button {
+	width: 16px;
+	height: 50%;
+	font-size: .5em;
+	padding: 0;
+	margin: 0;
+	text-align: center;
+	position: absolute;
+	cursor: default;
+	display: block;
+	overflow: hidden;
+	right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+	border-top: none;
+	border-bottom: none;
+	border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+	position: absolute;
+	margin-top: -8px;
+	top: 50%;
+	left: 0;
+}
+.ui-spinner-up {
+	top: 0;
+}
+.ui-spinner-down {
+	bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+	/* need to fix icons sprite */
+	background-position: -65px -16px;
+}
+.ui-tabs {
+	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+	padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+	margin: 0;
+	padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+	list-style: none;
+	float: left;
+	position: relative;
+	top: 0;
+	margin: 1px .2em 0 0;
+	border-bottom-width: 0;
+	padding: 0;
+	white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+	float: left;
+	padding: .5em 1em;
+	text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+	margin-bottom: -1px;
+	padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+	cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+	cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+	display: block;
+	border-width: 0;
+	padding: 1em 1.4em;
+	background: none;
+}
+.ui-tooltip {
+	padding: 8px;
+	position: absolute;
+	z-index: 9999;
+	max-width: 300px;
+	-webkit-box-shadow: 0 0 5px #aaa;
+	box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+	border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+	font-family: Arial,Helvetica,sans-serif;
+	font-size: 1em;
+}
+.ui-widget .ui-widget {
+	font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+	font-family: Arial,Helvetica,sans-serif;
+	font-size: 1em;
+}
+.ui-widget-content {
+	border: 1px solid #dddddd;
+	background: #ffffff;
+	color: #333333;
+}
+.ui-widget-content a {
+	color: #333333;
+}
+.ui-widget-header {
+	border: 1px solid #dddddd;
+	background: #e9e9e9;
+	color: #333333;
+	font-weight: bold;
+}
+.ui-widget-header a {
+	color: #333333;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+	border: 1px solid #c5c5c5;
+	background: #f6f6f6;
+	font-weight: normal;
+	color: #454545;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+	color: #454545;
+	text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+	border: 1px solid #cccccc;
+	background: #ededed;
+	font-weight: normal;
+	color: #2b2b2b;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+	color: #2b2b2b;
+	text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+	border: 1px solid #003eff;
+	background: #007fff;
+	font-weight: normal;
+	color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+	color: #ffffff;
+	text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+	border: 1px solid #dad55e;
+	background: #fffa90;
+	color: #777620;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+	color: #777620;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+	border: 1px solid #f1a899;
+	background: #fddfdf;
+	color: #5f3f3f;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+	color: #5f3f3f;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+	color: #5f3f3f;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+	font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+	opacity: .7;
+	filter:Alpha(Opacity=70); /* support: IE8 */
+	font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+	opacity: .35;
+	filter:Alpha(Opacity=35); /* support: IE8 */
+	background-image: none;
+}
+.ui-state-disabled .ui-icon {
+	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	width: 16px;
+	height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+	background-image: url("images/ui-icons_444444_256x240.png");
+}
+.ui-widget-header .ui-icon {
+	background-image: url("images/ui-icons_444444_256x240.png");
+}
+.ui-state-default .ui-icon {
+	background-image: url("images/ui-icons_777777_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+	background-image: url("images/ui-icons_555555_256x240.png");
+}
+.ui-state-active .ui-icon {
+	background-image: url("images/ui-icons_ffffff_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+	background-image: url("images/ui-icons_777620_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+	background-image: url("images/ui-icons_cc0000_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+	border-top-left-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+	border-top-right-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+	border-bottom-left-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+	border-bottom-right-radius: 3px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+	background: #aaaaaa;
+	opacity: .3;
+	filter: Alpha(Opacity=30); /* support: IE8 */
+}
+.ui-widget-shadow {
+	margin: 0px 0 0 0px;
+	padding: 5px;
+	background: #666666;
+	opacity: .3;
+	filter: Alpha(Opacity=30); /* support: IE8 */
+	border-radius: 8px;
+}
diff --git a/inst/rmd/h/jqueryui-1.11.4/jquery-ui.js b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.js
new file mode 100644
index 0000000..3568f86
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.js
@@ -0,0 +1,14546 @@
+/*! jQuery UI - v1.11.4 - 2016-01-05
+* http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size [...]
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define([ "jquery" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery );
+	}
+}(function( $ ) {
+/*!
+ * jQuery UI Core 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/ui-core/
+ */
+
+
+// $.ui might exist from components with no dependencies, e.g., $.ui.position
+$.ui = $.ui || {};
+
+$.extend( $.ui, {
+	version: "1.11.4",
+
+	keyCode: {
+		BACKSPACE: 8,
+		COMMA: 188,
+		DELETE: 46,
+		DOWN: 40,
+		END: 35,
+		ENTER: 13,
+		ESCAPE: 27,
+		HOME: 36,
+		LEFT: 37,
+		PAGE_DOWN: 34,
+		PAGE_UP: 33,
+		PERIOD: 190,
+		RIGHT: 39,
+		SPACE: 32,
+		TAB: 9,
+		UP: 38
+	}
+});
+
+// plugins
+$.fn.extend({
+	scrollParent: function( includeHidden ) {
+		var position = this.css( "position" ),
+			excludeStaticParent = position === "absolute",
+			overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
+			scrollParent = this.parents().filter( function() {
+				var parent = $( this );
+				if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
+					return false;
+				}
+				return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
+			}).eq( 0 );
+
+		return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
+	},
+
+	uniqueId: (function() {
+		var uuid = 0;
+
+		return function() {
+			return this.each(function() {
+				if ( !this.id ) {
+					this.id = "ui-id-" + ( ++uuid );
+				}
+			});
+		};
+	})(),
+
+	removeUniqueId: function() {
+		return this.each(function() {
+			if ( /^ui-id-\d+$/.test( this.id ) ) {
+				$( this ).removeAttr( "id" );
+			}
+		});
+	}
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+	var map, mapName, img,
+		nodeName = element.nodeName.toLowerCase();
+	if ( "area" === nodeName ) {
+		map = element.parentNode;
+		mapName = map.name;
+		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+			return false;
+		}
+		img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
+		return !!img && visible( img );
+	}
+	return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
+		!element.disabled :
+		"a" === nodeName ?
+			element.href || isTabIndexNotNaN :
+			isTabIndexNotNaN) &&
+		// the element and all of its ancestors must be visible
+		visible( element );
+}
+
+function visible( element ) {
+	return $.expr.filters.visible( element ) &&
+		!$( element ).parents().addBack().filter(function() {
+			return $.css( this, "visibility" ) === "hidden";
+		}).length;
+}
+
+$.extend( $.expr[ ":" ], {
+	data: $.expr.createPseudo ?
+		$.expr.createPseudo(function( dataName ) {
+			return function( elem ) {
+				return !!$.data( elem, dataName );
+			};
+		}) :
+		// support: jQuery <1.8
+		function( elem, i, match ) {
+			return !!$.data( elem, match[ 3 ] );
+		},
+
+	focusable: function( element ) {
+		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+	},
+
+	tabbable: function( element ) {
+		var tabIndex = $.attr( element, "tabindex" ),
+			isTabIndexNaN = isNaN( tabIndex );
+		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+	}
+});
+
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+	$.each( [ "Width", "Height" ], function( i, name ) {
+		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+			type = name.toLowerCase(),
+			orig = {
+				innerWidth: $.fn.innerWidth,
+				innerHeight: $.fn.innerHeight,
+				outerWidth: $.fn.outerWidth,
+				outerHeight: $.fn.outerHeight
+			};
+
+		function reduce( elem, size, border, margin ) {
+			$.each( side, function() {
+				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
+				if ( border ) {
+					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
+				}
+				if ( margin ) {
+					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
+				}
+			});
+			return size;
+		}
+
+		$.fn[ "inner" + name ] = function( size ) {
+			if ( size === undefined ) {
+				return orig[ "inner" + name ].call( this );
+			}
+
+			return this.each(function() {
+				$( this ).css( type, reduce( this, size ) + "px" );
+			});
+		};
+
+		$.fn[ "outer" + name] = function( size, margin ) {
+			if ( typeof size !== "number" ) {
+				return orig[ "outer" + name ].call( this, size );
+			}
+
+			return this.each(function() {
+				$( this).css( type, reduce( this, size, true, margin ) + "px" );
+			});
+		};
+	});
+}
+
+// support: jQuery <1.8
+if ( !$.fn.addBack ) {
+	$.fn.addBack = function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	};
+}
+
+// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
+if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
+	$.fn.removeData = (function( removeData ) {
+		return function( key ) {
+			if ( arguments.length ) {
+				return removeData.call( this, $.camelCase( key ) );
+			} else {
+				return removeData.call( this );
+			}
+		};
+	})( $.fn.removeData );
+}
+
+// deprecated
+$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
+
+$.fn.extend({
+	focus: (function( orig ) {
+		return function( delay, fn ) {
+			return typeof delay === "number" ?
+				this.each(function() {
+					var elem = this;
+					setTimeout(function() {
+						$( elem ).focus();
+						if ( fn ) {
+							fn.call( elem );
+						}
+					}, delay );
+				}) :
+				orig.apply( this, arguments );
+		};
+	})( $.fn.focus ),
+
+	disableSelection: (function() {
+		var eventType = "onselectstart" in document.createElement( "div" ) ?
+			"selectstart" :
+			"mousedown";
+
+		return function() {
+			return this.bind( eventType + ".ui-disableSelection", function( event ) {
+				event.preventDefault();
+			});
+		};
+	})(),
+
+	enableSelection: function() {
+		return this.unbind( ".ui-disableSelection" );
+	},
+
+	zIndex: function( zIndex ) {
+		if ( zIndex !== undefined ) {
+			return this.css( "zIndex", zIndex );
+		}
+
+		if ( this.length ) {
+			var elem = $( this[ 0 ] ), position, value;
+			while ( elem.length && elem[ 0 ] !== document ) {
+				// Ignore z-index if position is set to a value where z-index is ignored by the browser
+				// This makes behavior of this function consistent across browsers
+				// WebKit always returns auto if the element is positioned
+				position = elem.css( "position" );
+				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+					// IE returns 0 when zIndex is not specified
+					// other browsers return a string
+					// we ignore the case of nested elements with an explicit value of 0
+					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+					value = parseInt( elem.css( "zIndex" ), 10 );
+					if ( !isNaN( value ) && value !== 0 ) {
+						return value;
+					}
+				}
+				elem = elem.parent();
+			}
+		}
+
+		return 0;
+	}
+});
+
+// $.ui.plugin is deprecated. Use $.widget() extensions instead.
+$.ui.plugin = {
+	add: function( module, option, set ) {
+		var i,
+			proto = $.ui[ module ].prototype;
+		for ( i in set ) {
+			proto.plugins[ i ] = proto.plugins[ i ] || [];
+			proto.plugins[ i ].push( [ option, set[ i ] ] );
+		}
+	},
+	call: function( instance, name, args, allowDisconnected ) {
+		var i,
+			set = instance.plugins[ name ];
+
+		if ( !set ) {
+			return;
+		}
+
+		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
+			return;
+		}
+
+		for ( i = 0; i < set.length; i++ ) {
+			if ( instance.options[ set[ i ][ 0 ] ] ) {
+				set[ i ][ 1 ].apply( instance.element, args );
+			}
+		}
+	}
+};
+
+
+/*!
+ * jQuery UI Widget 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/jQuery.widget/
+ */
+
+
+var widget_uuid = 0,
+	widget_slice = Array.prototype.slice;
+
+$.cleanData = (function( orig ) {
+	return function( elems ) {
+		var events, elem, i;
+		for ( i = 0; (elem = elems[i]) != null; i++ ) {
+			try {
+
+				// Only trigger remove when necessary to save time
+				events = $._data( elem, "events" );
+				if ( events && events.remove ) {
+					$( elem ).triggerHandler( "remove" );
+				}
+
+			// http://bugs.jquery.com/ticket/8235
+			} catch ( e ) {}
+		}
+		orig( elems );
+	};
+})( $.cleanData );
+
+$.widget = function( name, base, prototype ) {
+	var fullName, existingConstructor, constructor, basePrototype,
+		// proxiedPrototype allows the provided prototype to remain unmodified
+		// so that it can be used as a mixin for multiple widgets (#8876)
+		proxiedPrototype = {},
+		namespace = name.split( "." )[ 0 ];
+
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+		return !!$.data( elem, fullName );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	existingConstructor = $[ namespace ][ name ];
+	constructor = $[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without "new" keyword
+		if ( !this._createWidget ) {
+			return new constructor( options, element );
+		}
+
+		// allow instantiation without initializing for simple inheritance
+		// must use "new" keyword (the code above always passes args)
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+	// extend with the existing constructor to carry over any static properties
+	$.extend( constructor, existingConstructor, {
+		version: prototype.version,
+		// copy the object used to create the prototype in case we need to
+		// redefine the widget later
+		_proto: $.extend( {}, prototype ),
+		// track widgets that inherit from this widget in case this widget is
+		// redefined after a widget inherits from it
+		_childConstructors: []
+	});
+
+	basePrototype = new base();
+	// we need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+	basePrototype.options = $.widget.extend( {}, basePrototype.options );
+	$.each( prototype, function( prop, value ) {
+		if ( !$.isFunction( value ) ) {
+			proxiedPrototype[ prop ] = value;
+			return;
+		}
+		proxiedPrototype[ prop ] = (function() {
+			var _super = function() {
+					return base.prototype[ prop ].apply( this, arguments );
+				},
+				_superApply = function( args ) {
+					return base.prototype[ prop ].apply( this, args );
+				};
+			return function() {
+				var __super = this._super,
+					__superApply = this._superApply,
+					returnValue;
+
+				this._super = _super;
+				this._superApply = _superApply;
+
+				returnValue = value.apply( this, arguments );
+
+				this._super = __super;
+				this._superApply = __superApply;
+
+				return returnValue;
+			};
+		})();
+	});
+	constructor.prototype = $.widget.extend( basePrototype, {
+		// TODO: remove support for widgetEventPrefix
+		// always use the name + a colon as the prefix, e.g., draggable:start
+		// don't prefix for widgets that aren't DOM-based
+		widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
+	}, proxiedPrototype, {
+		constructor: constructor,
+		namespace: namespace,
+		widgetName: name,
+		widgetFullName: fullName
+	});
+
+	// If this widget is being redefined then we need to find all widgets that
+	// are inheriting from it and redefine all of them so that they inherit from
+	// the new version of this widget. We're essentially trying to replace one
+	// level in the prototype chain.
+	if ( existingConstructor ) {
+		$.each( existingConstructor._childConstructors, function( i, child ) {
+			var childPrototype = child.prototype;
+
+			// redefine the child widget using the same prototype that was
+			// originally used, but inherit from the new version of the base
+			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
+		});
+		// remove the list of existing child constructors from the old constructor
+		// so the old child constructors can be garbage collected
+		delete existingConstructor._childConstructors;
+	} else {
+		base._childConstructors.push( constructor );
+	}
+
+	$.widget.bridge( name, constructor );
+
+	return constructor;
+};
+
+$.widget.extend = function( target ) {
+	var input = widget_slice.call( arguments, 1 ),
+		inputIndex = 0,
+		inputLength = input.length,
+		key,
+		value;
+	for ( ; inputIndex < inputLength; inputIndex++ ) {
+		for ( key in input[ inputIndex ] ) {
+			value = input[ inputIndex ][ key ];
+			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+				// Clone objects
+				if ( $.isPlainObject( value ) ) {
+					target[ key ] = $.isPlainObject( target[ key ] ) ?
+						$.widget.extend( {}, target[ key ], value ) :
+						// Don't extend strings, arrays, etc. with objects
+						$.widget.extend( {}, value );
+				// Copy everything else by reference
+				} else {
+					target[ key ] = value;
+				}
+			}
+		}
+	}
+	return target;
+};
+
+$.widget.bridge = function( name, object ) {
+	var fullName = object.prototype.widgetFullName || name;
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = widget_slice.call( arguments, 1 ),
+			returnValue = this;
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var methodValue,
+					instance = $.data( this, fullName );
+				if ( options === "instance" ) {
+					returnValue = instance;
+					return false;
+				}
+				if ( !instance ) {
+					return $.error( "cannot call methods on " + name + " prior to initialization; " +
+						"attempted to call method '" + options + "'" );
+				}
+				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+				}
+				methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue && methodValue.jquery ?
+						returnValue.pushStack( methodValue.get() ) :
+						methodValue;
+					return false;
+				}
+			});
+		} else {
+
+			// Allow multiple hashes to be passed on init
+			if ( args.length ) {
+				options = $.widget.extend.apply( null, [ options ].concat(args) );
+			}
+
+			this.each(function() {
+				var instance = $.data( this, fullName );
+				if ( instance ) {
+					instance.option( options || {} );
+					if ( instance._init ) {
+						instance._init();
+					}
+				} else {
+					$.data( this, fullName, new object( options, this ) );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	defaultElement: "<div>",
+	options: {
+		disabled: false,
+
+		// callbacks
+		create: null
+	},
+	_createWidget: function( options, element ) {
+		element = $( element || this.defaultElement || this )[ 0 ];
+		this.element = $( element );
+		this.uuid = widget_uuid++;
+		this.eventNamespace = "." + this.widgetName + this.uuid;
+
+		this.bindings = $();
+		this.hoverable = $();
+		this.focusable = $();
+
+		if ( element !== this ) {
+			$.data( element, this.widgetFullName, this );
+			this._on( true, this.element, {
+				remove: function( event ) {
+					if ( event.target === element ) {
+						this.destroy();
+					}
+				}
+			});
+			this.document = $( element.style ?
+				// element within the document
+				element.ownerDocument :
+				// element is window or document
+				element.document || element );
+			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+		}
+
+		this.options = $.widget.extend( {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		this._create();
+		this._trigger( "create", null, this._getCreateEventData() );
+		this._init();
+	},
+	_getCreateOptions: $.noop,
+	_getCreateEventData: $.noop,
+	_create: $.noop,
+	_init: $.noop,
+
+	destroy: function() {
+		this._destroy();
+		// we can probably remove the unbind calls in 2.0
+		// all event bindings should go through this._on()
+		this.element
+			.unbind( this.eventNamespace )
+			.removeData( this.widgetFullName )
+			// support: jquery <1.6.3
+			// http://bugs.jquery.com/ticket/9413
+			.removeData( $.camelCase( this.widgetFullName ) );
+		this.widget()
+			.unbind( this.eventNamespace )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetFullName + "-disabled " +
+				"ui-state-disabled" );
+
+		// clean up events and states
+		this.bindings.unbind( this.eventNamespace );
+		this.hoverable.removeClass( "ui-state-hover" );
+		this.focusable.removeClass( "ui-state-focus" );
+	},
+	_destroy: $.noop,
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key,
+			parts,
+			curOption,
+			i;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.widget.extend( {}, this.options );
+		}
+
+		if ( typeof key === "string" ) {
+			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+			options = {};
+			parts = key.split( "." );
+			key = parts.shift();
+			if ( parts.length ) {
+				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+				for ( i = 0; i < parts.length - 1; i++ ) {
+					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+					curOption = curOption[ parts[ i ] ];
+				}
+				key = parts.pop();
+				if ( arguments.length === 1 ) {
+					return curOption[ key ] === undefined ? null : curOption[ key ];
+				}
+				curOption[ key ] = value;
+			} else {
+				if ( arguments.length === 1 ) {
+					return this.options[ key ] === undefined ? null : this.options[ key ];
+				}
+				options[ key ] = value;
+			}
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var key;
+
+		for ( key in options ) {
+			this._setOption( key, options[ key ] );
+		}
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				.toggleClass( this.widgetFullName + "-disabled", !!value );
+
+			// If the widget is becoming disabled, then nothing is interactive
+			if ( value ) {
+				this.hoverable.removeClass( "ui-state-hover" );
+				this.focusable.removeClass( "ui-state-focus" );
+			}
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOptions({ disabled: false });
+	},
+	disable: function() {
+		return this._setOptions({ disabled: true });
+	},
+
+	_on: function( suppressDisabledCheck, element, handlers ) {
+		var delegateElement,
+			instance = this;
+
+		// no suppressDisabledCheck flag, shuffle arguments
+		if ( typeof suppressDisabledCheck !== "boolean" ) {
+			handlers = element;
+			element = suppressDisabledCheck;
+			suppressDisabledCheck = false;
+		}
+
+		// no element argument, shuffle and use this.element
+		if ( !handlers ) {
+			handlers = element;
+			element = this.element;
+			delegateElement = this.widget();
+		} else {
+			element = delegateElement = $( element );
+			this.bindings = this.bindings.add( element );
+		}
+
+		$.each( handlers, function( event, handler ) {
+			function handlerProxy() {
+				// allow widgets to customize the disabled handling
+				// - disabled as an array instead of boolean
+				// - disabled class as method for disabling individual parts
+				if ( !suppressDisabledCheck &&
+						( instance.options.disabled === true ||
+							$( this ).hasClass( "ui-state-disabled" ) ) ) {
+					return;
+				}
+				return ( typeof handler === "string" ? instance[ handler ] : handler )
+					.apply( instance, arguments );
+			}
+
+			// copy the guid so direct unbinding works
+			if ( typeof handler !== "string" ) {
+				handlerProxy.guid = handler.guid =
+					handler.guid || handlerProxy.guid || $.guid++;
+			}
+
+			var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
+				eventName = match[1] + instance.eventNamespace,
+				selector = match[2];
+			if ( selector ) {
+				delegateElement.delegate( selector, eventName, handlerProxy );
+			} else {
+				element.bind( eventName, handlerProxy );
+			}
+		});
+	},
+
+	_off: function( element, eventName ) {
+		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
+			this.eventNamespace;
+		element.unbind( eventName ).undelegate( eventName );
+
+		// Clear the stack to avoid memory leaks (#10056)
+		this.bindings = $( this.bindings.not( element ).get() );
+		this.focusable = $( this.focusable.not( element ).get() );
+		this.hoverable = $( this.hoverable.not( element ).get() );
+	},
+
+	_delay: function( handler, delay ) {
+		function handlerProxy() {
+			return ( typeof handler === "string" ? instance[ handler ] : handler )
+				.apply( instance, arguments );
+		}
+		var instance = this;
+		return setTimeout( handlerProxy, delay || 0 );
+	},
+
+	_hoverable: function( element ) {
+		this.hoverable = this.hoverable.add( element );
+		this._on( element, {
+			mouseenter: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-hover" );
+			},
+			mouseleave: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-hover" );
+			}
+		});
+	},
+
+	_focusable: function( element ) {
+		this.focusable = this.focusable.add( element );
+		this._on( element, {
+			focusin: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-focus" );
+			},
+			focusout: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-focus" );
+			}
+		});
+	},
+
+	_trigger: function( type, event, data ) {
+		var prop, orig,
+			callback = this.options[ type ];
+
+		data = data || {};
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		// the original event may come from any element
+		// so we need to reset the target on the new event
+		event.target = this.element[ 0 ];
+
+		// copy original event properties over to the new event
+		orig = event.originalEvent;
+		if ( orig ) {
+			for ( prop in orig ) {
+				if ( !( prop in event ) ) {
+					event[ prop ] = orig[ prop ];
+				}
+			}
+		}
+
+		this.element.trigger( event, data );
+		return !( $.isFunction( callback ) &&
+			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+		if ( typeof options === "string" ) {
+			options = { effect: options };
+		}
+		var hasOptions,
+			effectName = !options ?
+				method :
+				options === true || typeof options === "number" ?
+					defaultEffect :
+					options.effect || defaultEffect;
+		options = options || {};
+		if ( typeof options === "number" ) {
+			options = { duration: options };
+		}
+		hasOptions = !$.isEmptyObject( options );
+		options.complete = callback;
+		if ( options.delay ) {
+			element.delay( options.delay );
+		}
+		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
+			element[ method ]( options );
+		} else if ( effectName !== method && element[ effectName ] ) {
+			element[ effectName ]( options.duration, options.easing, callback );
+		} else {
+			element.queue(function( next ) {
+				$( this )[ method ]();
+				if ( callback ) {
+					callback.call( element[ 0 ] );
+				}
+				next();
+			});
+		}
+	};
+});
+
+var widget = $.widget;
+
+
+/*!
+ * jQuery UI Mouse 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/mouse/
+ */
+
+
+var mouseHandled = false;
+$( document ).mouseup( function() {
+	mouseHandled = false;
+});
+
+var mouse = $.widget("ui.mouse", {
+	version: "1.11.4",
+	options: {
+		cancel: "input,textarea,button,select,option",
+		distance: 1,
+		delay: 0
+	},
+	_mouseInit: function() {
+		var that = this;
+
+		this.element
+			.bind("mousedown." + this.widgetName, function(event) {
+				return that._mouseDown(event);
+			})
+			.bind("click." + this.widgetName, function(event) {
+				if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
+					$.removeData(event.target, that.widgetName + ".preventClickEvent");
+					event.stopImmediatePropagation();
+					return false;
+				}
+			});
+
+		this.started = false;
+	},
+
+	// TODO: make sure destroying one instance of mouse doesn't mess with
+	// other instances of mouse
+	_mouseDestroy: function() {
+		this.element.unbind("." + this.widgetName);
+		if ( this._mouseMoveDelegate ) {
+			this.document
+				.unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
+				.unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
+		}
+	},
+
+	_mouseDown: function(event) {
+		// don't let more than one widget handle mouseStart
+		if ( mouseHandled ) {
+			return;
+		}
+
+		this._mouseMoved = false;
+
+		// we may have missed mouseup (out of window)
+		(this._mouseStarted && this._mouseUp(event));
+
+		this._mouseDownEvent = event;
+
+		var that = this,
+			btnIsLeft = (event.which === 1),
+			// event.target.nodeName works around a bug in IE 8 with
+			// disabled inputs (#7620)
+			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+			return true;
+		}
+
+		this.mouseDelayMet = !this.options.delay;
+		if (!this.mouseDelayMet) {
+			this._mouseDelayTimer = setTimeout(function() {
+				that.mouseDelayMet = true;
+			}, this.options.delay);
+		}
+
+		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+			this._mouseStarted = (this._mouseStart(event) !== false);
+			if (!this._mouseStarted) {
+				event.preventDefault();
+				return true;
+			}
+		}
+
+		// Click event may never have fired (Gecko & Opera)
+		if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
+			$.removeData(event.target, this.widgetName + ".preventClickEvent");
+		}
+
+		// these delegates are required to keep context
+		this._mouseMoveDelegate = function(event) {
+			return that._mouseMove(event);
+		};
+		this._mouseUpDelegate = function(event) {
+			return that._mouseUp(event);
+		};
+
+		this.document
+			.bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+			.bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+		event.preventDefault();
+
+		mouseHandled = true;
+		return true;
+	},
+
+	_mouseMove: function(event) {
+		// Only check for mouseups outside the document if you've moved inside the document
+		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
+		// fire a mousemove event if content is placed under the cursor. See #7778
+		// Support: IE <9
+		if ( this._mouseMoved ) {
+			// IE mouseup check - mouseup happened when mouse was out of window
+			if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
+				return this._mouseUp(event);
+
+			// Iframe mouseup check - mouseup occurred in another document
+			} else if ( !event.which ) {
+				return this._mouseUp( event );
+			}
+		}
+
+		if ( event.which || event.button ) {
+			this._mouseMoved = true;
+		}
+
+		if (this._mouseStarted) {
+			this._mouseDrag(event);
+			return event.preventDefault();
+		}
+
+		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+			this._mouseStarted =
+				(this._mouseStart(this._mouseDownEvent, event) !== false);
+			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+		}
+
+		return !this._mouseStarted;
+	},
+
+	_mouseUp: function(event) {
+		this.document
+			.unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
+			.unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
+
+		if (this._mouseStarted) {
+			this._mouseStarted = false;
+
+			if (event.target === this._mouseDownEvent.target) {
+				$.data(event.target, this.widgetName + ".preventClickEvent", true);
+			}
+
+			this._mouseStop(event);
+		}
+
+		mouseHandled = false;
+		return false;
+	},
+
+	_mouseDistanceMet: function(event) {
+		return (Math.max(
+				Math.abs(this._mouseDownEvent.pageX - event.pageX),
+				Math.abs(this._mouseDownEvent.pageY - event.pageY)
+			) >= this.options.distance
+		);
+	},
+
+	_mouseDelayMet: function(/* event */) {
+		return this.mouseDelayMet;
+	},
+
+	// These are placeholder methods, to be overriden by extending plugin
+	_mouseStart: function(/* event */) {},
+	_mouseDrag: function(/* event */) {},
+	_mouseStop: function(/* event */) {},
+	_mouseCapture: function(/* event */) { return true; }
+});
+
+
+/*!
+ * jQuery UI Position 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/position/
+ */
+
+(function() {
+
+$.ui = $.ui || {};
+
+var cachedScrollbarWidth, supportsOffsetFractions,
+	max = Math.max,
+	abs = Math.abs,
+	round = Math.round,
+	rhorizontal = /left|center|right/,
+	rvertical = /top|center|bottom/,
+	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+	rposition = /^\w+/,
+	rpercent = /%$/,
+	_position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+	return [
+		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+	];
+}
+
+function parseCss( element, property ) {
+	return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+function getDimensions( elem ) {
+	var raw = elem[0];
+	if ( raw.nodeType === 9 ) {
+		return {
+			width: elem.width(),
+			height: elem.height(),
+			offset: { top: 0, left: 0 }
+		};
+	}
+	if ( $.isWindow( raw ) ) {
+		return {
+			width: elem.width(),
+			height: elem.height(),
+			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
+		};
+	}
+	if ( raw.preventDefault ) {
+		return {
+			width: 0,
+			height: 0,
+			offset: { top: raw.pageY, left: raw.pageX }
+		};
+	}
+	return {
+		width: elem.outerWidth(),
+		height: elem.outerHeight(),
+		offset: elem.offset()
+	};
+}
+
+$.position = {
+	scrollbarWidth: function() {
+		if ( cachedScrollbarWidth !== undefined ) {
+			return cachedScrollbarWidth;
+		}
+		var w1, w2,
+			div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
+			innerDiv = div.children()[0];
+
+		$( "body" ).append( div );
+		w1 = innerDiv.offsetWidth;
+		div.css( "overflow", "scroll" );
+
+		w2 = innerDiv.offsetWidth;
+
+		if ( w1 === w2 ) {
+			w2 = div[0].clientWidth;
+		}
+
+		div.remove();
+
+		return (cachedScrollbarWidth = w1 - w2);
+	},
+	getScrollInfo: function( within ) {
+		var overflowX = within.isWindow || within.isDocument ? "" :
+				within.element.css( "overflow-x" ),
+			overflowY = within.isWindow || within.isDocument ? "" :
+				within.element.css( "overflow-y" ),
+			hasOverflowX = overflowX === "scroll" ||
+				( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
+			hasOverflowY = overflowY === "scroll" ||
+				( overflowY === "auto" && within.height < within.element[0].scrollHeight );
+		return {
+			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
+			height: hasOverflowX ? $.position.scrollbarWidth() : 0
+		};
+	},
+	getWithinInfo: function( element ) {
+		var withinElement = $( element || window ),
+			isWindow = $.isWindow( withinElement[0] ),
+			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
+		return {
+			element: withinElement,
+			isWindow: isWindow,
+			isDocument: isDocument,
+			offset: withinElement.offset() || { left: 0, top: 0 },
+			scrollLeft: withinElement.scrollLeft(),
+			scrollTop: withinElement.scrollTop(),
+
+			// support: jQuery 1.6.x
+			// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
+			width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
+			height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
+		};
+	}
+};
+
+$.fn.position = function( options ) {
+	if ( !options || !options.of ) {
+		return _position.apply( this, arguments );
+	}
+
+	// make a copy, we don't want to modify arguments
+	options = $.extend( {}, options );
+
+	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
+		target = $( options.of ),
+		within = $.position.getWithinInfo( options.within ),
+		scrollInfo = $.position.getScrollInfo( within ),
+		collision = ( options.collision || "flip" ).split( " " ),
+		offsets = {};
+
+	dimensions = getDimensions( target );
+	if ( target[0].preventDefault ) {
+		// force left top to allow flipping
+		options.at = "left top";
+	}
+	targetWidth = dimensions.width;
+	targetHeight = dimensions.height;
+	targetOffset = dimensions.offset;
+	// clone to reuse original targetOffset later
+	basePosition = $.extend( {}, targetOffset );
+
+	// force my and at to have valid horizontal and vertical positions
+	// if a value is missing or invalid, it will be converted to center
+	$.each( [ "my", "at" ], function() {
+		var pos = ( options[ this ] || "" ).split( " " ),
+			horizontalOffset,
+			verticalOffset;
+
+		if ( pos.length === 1) {
+			pos = rhorizontal.test( pos[ 0 ] ) ?
+				pos.concat( [ "center" ] ) :
+				rvertical.test( pos[ 0 ] ) ?
+					[ "center" ].concat( pos ) :
+					[ "center", "center" ];
+		}
+		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+		// calculate offsets
+		horizontalOffset = roffset.exec( pos[ 0 ] );
+		verticalOffset = roffset.exec( pos[ 1 ] );
+		offsets[ this ] = [
+			horizontalOffset ? horizontalOffset[ 0 ] : 0,
+			verticalOffset ? verticalOffset[ 0 ] : 0
+		];
+
+		// reduce to just the positions without the offsets
+		options[ this ] = [
+			rposition.exec( pos[ 0 ] )[ 0 ],
+			rposition.exec( pos[ 1 ] )[ 0 ]
+		];
+	});
+
+	// normalize collision option
+	if ( collision.length === 1 ) {
+		collision[ 1 ] = collision[ 0 ];
+	}
+
+	if ( options.at[ 0 ] === "right" ) {
+		basePosition.left += targetWidth;
+	} else if ( options.at[ 0 ] === "center" ) {
+		basePosition.left += targetWidth / 2;
+	}
+
+	if ( options.at[ 1 ] === "bottom" ) {
+		basePosition.top += targetHeight;
+	} else if ( options.at[ 1 ] === "center" ) {
+		basePosition.top += targetHeight / 2;
+	}
+
+	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+	basePosition.left += atOffset[ 0 ];
+	basePosition.top += atOffset[ 1 ];
+
+	return this.each(function() {
+		var collisionPosition, using,
+			elem = $( this ),
+			elemWidth = elem.outerWidth(),
+			elemHeight = elem.outerHeight(),
+			marginLeft = parseCss( this, "marginLeft" ),
+			marginTop = parseCss( this, "marginTop" ),
+			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
+			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
+			position = $.extend( {}, basePosition ),
+			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
+
+		if ( options.my[ 0 ] === "right" ) {
+			position.left -= elemWidth;
+		} else if ( options.my[ 0 ] === "center" ) {
+			position.left -= elemWidth / 2;
+		}
+
+		if ( options.my[ 1 ] === "bottom" ) {
+			position.top -= elemHeight;
+		} else if ( options.my[ 1 ] === "center" ) {
+			position.top -= elemHeight / 2;
+		}
+
+		position.left += myOffset[ 0 ];
+		position.top += myOffset[ 1 ];
+
+		// if the browser doesn't support fractions, then round for consistent results
+		if ( !supportsOffsetFractions ) {
+			position.left = round( position.left );
+			position.top = round( position.top );
+		}
+
+		collisionPosition = {
+			marginLeft: marginLeft,
+			marginTop: marginTop
+		};
+
+		$.each( [ "left", "top" ], function( i, dir ) {
+			if ( $.ui.position[ collision[ i ] ] ) {
+				$.ui.position[ collision[ i ] ][ dir ]( position, {
+					targetWidth: targetWidth,
+					targetHeight: targetHeight,
+					elemWidth: elemWidth,
+					elemHeight: elemHeight,
+					collisionPosition: collisionPosition,
+					collisionWidth: collisionWidth,
+					collisionHeight: collisionHeight,
+					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
+					my: options.my,
+					at: options.at,
+					within: within,
+					elem: elem
+				});
+			}
+		});
+
+		if ( options.using ) {
+			// adds feedback as second argument to using callback, if present
+			using = function( props ) {
+				var left = targetOffset.left - position.left,
+					right = left + targetWidth - elemWidth,
+					top = targetOffset.top - position.top,
+					bottom = top + targetHeight - elemHeight,
+					feedback = {
+						target: {
+							element: target,
+							left: targetOffset.left,
+							top: targetOffset.top,
+							width: targetWidth,
+							height: targetHeight
+						},
+						element: {
+							element: elem,
+							left: position.left,
+							top: position.top,
+							width: elemWidth,
+							height: elemHeight
+						},
+						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
+						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
+					};
+				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+					feedback.horizontal = "center";
+				}
+				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
+					feedback.vertical = "middle";
+				}
+				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+					feedback.important = "horizontal";
+				} else {
+					feedback.important = "vertical";
+				}
+				options.using.call( this, props, feedback );
+			};
+		}
+
+		elem.offset( $.extend( position, { using: using } ) );
+	});
+};
+
+$.ui.position = {
+	fit: {
+		left: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+				outerWidth = within.width,
+				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+				overLeft = withinOffset - collisionPosLeft,
+				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+				newOverRight;
+
+			// element is wider than within
+			if ( data.collisionWidth > outerWidth ) {
+				// element is initially over the left side of within
+				if ( overLeft > 0 && overRight <= 0 ) {
+					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
+					position.left += overLeft - newOverRight;
+				// element is initially over right side of within
+				} else if ( overRight > 0 && overLeft <= 0 ) {
+					position.left = withinOffset;
+				// element is initially over both left and right sides of within
+				} else {
+					if ( overLeft > overRight ) {
+						position.left = withinOffset + outerWidth - data.collisionWidth;
+					} else {
+						position.left = withinOffset;
+					}
+				}
+			// too far left -> align with left edge
+			} else if ( overLeft > 0 ) {
+				position.left += overLeft;
+			// too far right -> align with right edge
+			} else if ( overRight > 0 ) {
+				position.left -= overRight;
+			// adjust based on position and margin
+			} else {
+				position.left = max( position.left - collisionPosLeft, position.left );
+			}
+		},
+		top: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+				outerHeight = data.within.height,
+				collisionPosTop = position.top - data.collisionPosition.marginTop,
+				overTop = withinOffset - collisionPosTop,
+				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+				newOverBottom;
+
+			// element is taller than within
+			if ( data.collisionHeight > outerHeight ) {
+				// element is initially over the top of within
+				if ( overTop > 0 && overBottom <= 0 ) {
+					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
+					position.top += overTop - newOverBottom;
+				// element is initially over bottom of within
+				} else if ( overBottom > 0 && overTop <= 0 ) {
+					position.top = withinOffset;
+				// element is initially over both top and bottom of within
+				} else {
+					if ( overTop > overBottom ) {
+						position.top = withinOffset + outerHeight - data.collisionHeight;
+					} else {
+						position.top = withinOffset;
+					}
+				}
+			// too far up -> align with top
+			} else if ( overTop > 0 ) {
+				position.top += overTop;
+			// too far down -> align with bottom edge
+			} else if ( overBottom > 0 ) {
+				position.top -= overBottom;
+			// adjust based on position and margin
+			} else {
+				position.top = max( position.top - collisionPosTop, position.top );
+			}
+		}
+	},
+	flip: {
+		left: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.offset.left + within.scrollLeft,
+				outerWidth = within.width,
+				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+				overLeft = collisionPosLeft - offsetLeft,
+				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
+				myOffset = data.my[ 0 ] === "left" ?
+					-data.elemWidth :
+					data.my[ 0 ] === "right" ?
+						data.elemWidth :
+						0,
+				atOffset = data.at[ 0 ] === "left" ?
+					data.targetWidth :
+					data.at[ 0 ] === "right" ?
+						-data.targetWidth :
+						0,
+				offset = -2 * data.offset[ 0 ],
+				newOverRight,
+				newOverLeft;
+
+			if ( overLeft < 0 ) {
+				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
+				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+					position.left += myOffset + atOffset + offset;
+				}
+			} else if ( overRight > 0 ) {
+				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
+				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+					position.left += myOffset + atOffset + offset;
+				}
+			}
+		},
+		top: function( position, data ) {
+			var within = data.within,
+				withinOffset = within.offset.top + within.scrollTop,
+				outerHeight = within.height,
+				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+				collisionPosTop = position.top - data.collisionPosition.marginTop,
+				overTop = collisionPosTop - offsetTop,
+				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+				top = data.my[ 1 ] === "top",
+				myOffset = top ?
+					-data.elemHeight :
+					data.my[ 1 ] === "bottom" ?
+						data.elemHeight :
+						0,
+				atOffset = data.at[ 1 ] === "top" ?
+					data.targetHeight :
+					data.at[ 1 ] === "bottom" ?
+						-data.targetHeight :
+						0,
+				offset = -2 * data.offset[ 1 ],
+				newOverTop,
+				newOverBottom;
+			if ( overTop < 0 ) {
+				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
+				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
+					position.top += myOffset + atOffset + offset;
+				}
+			} else if ( overBottom > 0 ) {
+				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
+				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
+					position.top += myOffset + atOffset + offset;
+				}
+			}
+		}
+	},
+	flipfit: {
+		left: function() {
+			$.ui.position.flip.left.apply( this, arguments );
+			$.ui.position.fit.left.apply( this, arguments );
+		},
+		top: function() {
+			$.ui.position.flip.top.apply( this, arguments );
+			$.ui.position.fit.top.apply( this, arguments );
+		}
+	}
+};
+
+// fraction support test
+(function() {
+	var testElement, testElementParent, testElementStyle, offsetLeft, i,
+		body = document.getElementsByTagName( "body" )[ 0 ],
+		div = document.createElement( "div" );
+
+	//Create a "fake body" for testing based on method used in jQuery.support
+	testElement = document.createElement( body ? "div" : "body" );
+	testElementStyle = {
+		visibility: "hidden",
+		width: 0,
+		height: 0,
+		border: 0,
+		margin: 0,
+		background: "none"
+	};
+	if ( body ) {
+		$.extend( testElementStyle, {
+			position: "absolute",
+			left: "-1000px",
+			top: "-1000px"
+		});
+	}
+	for ( i in testElementStyle ) {
+		testElement.style[ i ] = testElementStyle[ i ];
+	}
+	testElement.appendChild( div );
+	testElementParent = body || document.documentElement;
+	testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+	div.style.cssText = "position: absolute; left: 10.7432222px;";
+
+	offsetLeft = $( div ).offset().left;
+	supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
+
+	testElement.innerHTML = "";
+	testElementParent.removeChild( testElement );
+})();
+
+})();
+
+var position = $.ui.position;
+
+
+/*!
+ * jQuery UI Draggable 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/draggable/
+ */
+
+
+$.widget("ui.draggable", $.ui.mouse, {
+	version: "1.11.4",
+	widgetEventPrefix: "drag",
+	options: {
+		addClasses: true,
+		appendTo: "parent",
+		axis: false,
+		connectToSortable: false,
+		containment: false,
+		cursor: "auto",
+		cursorAt: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		iframeFix: false,
+		opacity: false,
+		refreshPositions: false,
+		revert: false,
+		revertDuration: 500,
+		scope: "default",
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		snap: false,
+		snapMode: "both",
+		snapTolerance: 20,
+		stack: false,
+		zIndex: false,
+
+		// callbacks
+		drag: null,
+		start: null,
+		stop: null
+	},
+	_create: function() {
+
+		if ( this.options.helper === "original" ) {
+			this._setPositionRelative();
+		}
+		if (this.options.addClasses){
+			this.element.addClass("ui-draggable");
+		}
+		if (this.options.disabled){
+			this.element.addClass("ui-draggable-disabled");
+		}
+		this._setHandleClassName();
+
+		this._mouseInit();
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+		if ( key === "handle" ) {
+			this._removeHandleClassName();
+			this._setHandleClassName();
+		}
+	},
+
+	_destroy: function() {
+		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
+			this.destroyOnClear = true;
+			return;
+		}
+		this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
+		this._removeHandleClassName();
+		this._mouseDestroy();
+	},
+
+	_mouseCapture: function(event) {
+		var o = this.options;
+
+		this._blurActiveElement( event );
+
+		// among others, prevent a drag on a resizable-handle
+		if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
+			return false;
+		}
+
+		//Quit if we're not on a valid handle
+		this.handle = this._getHandle(event);
+		if (!this.handle) {
+			return false;
+		}
+
+		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
+
+		return true;
+
+	},
+
+	_blockFrames: function( selector ) {
+		this.iframeBlocks = this.document.find( selector ).map(function() {
+			var iframe = $( this );
+
+			return $( "<div>" )
+				.css( "position", "absolute" )
+				.appendTo( iframe.parent() )
+				.outerWidth( iframe.outerWidth() )
+				.outerHeight( iframe.outerHeight() )
+				.offset( iframe.offset() )[ 0 ];
+		});
+	},
+
+	_unblockFrames: function() {
+		if ( this.iframeBlocks ) {
+			this.iframeBlocks.remove();
+			delete this.iframeBlocks;
+		}
+	},
+
+	_blurActiveElement: function( event ) {
+		var document = this.document[ 0 ];
+
+		// Only need to blur if the event occurred on the draggable itself, see #10527
+		if ( !this.handleElement.is( event.target ) ) {
+			return;
+		}
+
+		// support: IE9
+		// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
+		try {
+
+			// Support: IE9, IE10
+			// If the <body> is blurred, IE will switch windows, see #9520
+			if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
+
+				// Blur any element that currently has focus, see #4261
+				$( document.activeElement ).blur();
+			}
+		} catch ( error ) {}
+	},
+
+	_mouseStart: function(event) {
+
+		var o = this.options;
+
+		//Create and append the visible helper
+		this.helper = this._createHelper(event);
+
+		this.helper.addClass("ui-draggable-dragging");
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		//If ddmanager is used for droppables, set the global draggable
+		if ($.ui.ddmanager) {
+			$.ui.ddmanager.current = this;
+		}
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Store the helper's css position
+		this.cssPosition = this.helper.css( "position" );
+		this.scrollParent = this.helper.scrollParent( true );
+		this.offsetParent = this.helper.offsetParent();
+		this.hasFixedAncestor = this.helper.parents().filter(function() {
+				return $( this ).css( "position" ) === "fixed";
+			}).length > 0;
+
+		//The element's absolute position on the page minus margins
+		this.positionAbs = this.element.offset();
+		this._refreshOffsets( event );
+
+		//Generate the original position
+		this.originalPosition = this.position = this._generatePosition( event, false );
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+		//Set a containment if given in the options
+		this._setContainment();
+
+		//Trigger event + callbacks
+		if (this._trigger("start", event) === false) {
+			this._clear();
+			return false;
+		}
+
+		//Recache the helper size
+		this._cacheHelperProportions();
+
+		//Prepare the droppable offsets
+		if ($.ui.ddmanager && !o.dropBehaviour) {
+			$.ui.ddmanager.prepareOffsets(this, event);
+		}
+
+		// Reset helper's right/bottom css if they're set and set explicit width/height instead
+		// as this prevents resizing of elements with right/bottom set (see #7772)
+		this._normalizeRightBottom();
+
+		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+
+		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
+		if ( $.ui.ddmanager ) {
+			$.ui.ddmanager.dragStart(this, event);
+		}
+
+		return true;
+	},
+
+	_refreshOffsets: function( event ) {
+		this.offset = {
+			top: this.positionAbs.top - this.margins.top,
+			left: this.positionAbs.left - this.margins.left,
+			scroll: false,
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset()
+		};
+
+		this.offset.click = {
+			left: event.pageX - this.offset.left,
+			top: event.pageY - this.offset.top
+		};
+	},
+
+	_mouseDrag: function(event, noPropagation) {
+		// reset any necessary cached properties (see #5009)
+		if ( this.hasFixedAncestor ) {
+			this.offset.parent = this._getParentOffset();
+		}
+
+		//Compute the helpers position
+		this.position = this._generatePosition( event, true );
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		//Call plugins and callbacks and use the resulting position if something is returned
+		if (!noPropagation) {
+			var ui = this._uiHash();
+			if (this._trigger("drag", event, ui) === false) {
+				this._mouseUp({});
+				return false;
+			}
+			this.position = ui.position;
+		}
+
+		this.helper[ 0 ].style.left = this.position.left + "px";
+		this.helper[ 0 ].style.top = this.position.top + "px";
+
+		if ($.ui.ddmanager) {
+			$.ui.ddmanager.drag(this, event);
+		}
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+
+		//If we are using droppables, inform the manager about the drop
+		var that = this,
+			dropped = false;
+		if ($.ui.ddmanager && !this.options.dropBehaviour) {
+			dropped = $.ui.ddmanager.drop(this, event);
+		}
+
+		//if a drop comes from outside (a sortable)
+		if (this.dropped) {
+			dropped = this.dropped;
+			this.dropped = false;
+		}
+
+		if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+				if (that._trigger("stop", event) !== false) {
+					that._clear();
+				}
+			});
+		} else {
+			if (this._trigger("stop", event) !== false) {
+				this._clear();
+			}
+		}
+
+		return false;
+	},
+
+	_mouseUp: function( event ) {
+		this._unblockFrames();
+
+		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
+		if ( $.ui.ddmanager ) {
+			$.ui.ddmanager.dragStop(this, event);
+		}
+
+		// Only need to focus if the event occurred on the draggable itself, see #10527
+		if ( this.handleElement.is( event.target ) ) {
+			// The interaction is over; whether or not the click resulted in a drag, focus the element
+			this.element.focus();
+		}
+
+		return $.ui.mouse.prototype._mouseUp.call(this, event);
+	},
+
+	cancel: function() {
+
+		if (this.helper.is(".ui-draggable-dragging")) {
+			this._mouseUp({});
+		} else {
+			this._clear();
+		}
+
+		return this;
+
+	},
+
+	_getHandle: function(event) {
+		return this.options.handle ?
+			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
+			true;
+	},
+
+	_setHandleClassName: function() {
+		this.handleElement = this.options.handle ?
+			this.element.find( this.options.handle ) : this.element;
+		this.handleElement.addClass( "ui-draggable-handle" );
+	},
+
+	_removeHandleClassName: function() {
+		this.handleElement.removeClass( "ui-draggable-handle" );
+	},
+
+	_createHelper: function(event) {
+
+		var o = this.options,
+			helperIsFunction = $.isFunction( o.helper ),
+			helper = helperIsFunction ?
+				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
+				( o.helper === "clone" ?
+					this.element.clone().removeAttr( "id" ) :
+					this.element );
+
+		if (!helper.parents("body").length) {
+			helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
+		}
+
+		// http://bugs.jqueryui.com/ticket/9446
+		// a helper function can return the original element
+		// which wouldn't have been set to relative in _create
+		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
+			this._setPositionRelative();
+		}
+
+		if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
+			helper.css("position", "absolute");
+		}
+
+		return helper;
+
+	},
+
+	_setPositionRelative: function() {
+		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
+			this.element[ 0 ].style.position = "relative";
+		}
+	},
+
+	_adjustOffsetFromHelper: function(obj) {
+		if (typeof obj === "string") {
+			obj = obj.split(" ");
+		}
+		if ($.isArray(obj)) {
+			obj = { left: +obj[0], top: +obj[1] || 0 };
+		}
+		if ("left" in obj) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ("right" in obj) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ("top" in obj) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ("bottom" in obj) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_isRootNode: function( element ) {
+		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
+	},
+
+	_getParentOffset: function() {
+
+		//Get the offsetParent and cache its position
+		var po = this.offsetParent.offset(),
+			document = this.document[ 0 ];
+
+		// This is a special case where we need to modify a offset calculated on start, since the following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+		if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
+			po = { top: 0, left: 0 };
+		}
+
+		return {
+			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
+			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+		if ( this.cssPosition !== "relative" ) {
+			return { top: 0, left: 0 };
+		}
+
+		var p = this.element.position(),
+			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
+
+		return {
+			top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
+			left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
+		};
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: (parseInt(this.element.css("marginLeft"), 10) || 0),
+			top: (parseInt(this.element.css("marginTop"), 10) || 0),
+			right: (parseInt(this.element.css("marginRight"), 10) || 0),
+			bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var isUserScrollable, c, ce,
+			o = this.options,
+			document = this.document[ 0 ];
+
+		this.relativeContainer = null;
+
+		if ( !o.containment ) {
+			this.containment = null;
+			return;
+		}
+
+		if ( o.containment === "window" ) {
+			this.containment = [
+				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+				$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
+				$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
+			];
+			return;
+		}
+
+		if ( o.containment === "document") {
+			this.containment = [
+				0,
+				0,
+				$( document ).width() - this.helperProportions.width - this.margins.left,
+				( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
+			];
+			return;
+		}
+
+		if ( o.containment.constructor === Array ) {
+			this.containment = o.containment;
+			return;
+		}
+
+		if ( o.containment === "parent" ) {
+			o.containment = this.helper[ 0 ].parentNode;
+		}
+
+		c = $( o.containment );
+		ce = c[ 0 ];
+
+		if ( !ce ) {
+			return;
+		}
+
+		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
+
+		this.containment = [
+			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
+			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
+			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
+				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
+				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
+				this.helperProportions.width -
+				this.margins.left -
+				this.margins.right,
+			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
+				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
+				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
+				this.helperProportions.height -
+				this.margins.top -
+				this.margins.bottom
+		];
+		this.relativeContainer = c;
+	},
+
+	_convertPositionTo: function(d, pos) {
+
+		if (!pos) {
+			pos = this.position;
+		}
+
+		var mod = d === "absolute" ? 1 : -1,
+			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
+
+		return {
+			top: (
+				pos.top	+																// The absolute mouse position
+				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.parent.top * mod -										// The offsetParent's offset without borders (offset + border)
+				( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
+			),
+			left: (
+				pos.left +																// The absolute mouse position
+				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
+				( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
+			)
+		};
+
+	},
+
+	_generatePosition: function( event, constrainPosition ) {
+
+		var containment, co, top, left,
+			o = this.options,
+			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
+			pageX = event.pageX,
+			pageY = event.pageY;
+
+		// Cache the scroll
+		if ( !scrollIsRootNode || !this.offset.scroll ) {
+			this.offset.scroll = {
+				top: this.scrollParent.scrollTop(),
+				left: this.scrollParent.scrollLeft()
+			};
+		}
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		// If we are not dragging yet, we won't check for options
+		if ( constrainPosition ) {
+			if ( this.containment ) {
+				if ( this.relativeContainer ){
+					co = this.relativeContainer.offset();
+					containment = [
+						this.containment[ 0 ] + co.left,
+						this.containment[ 1 ] + co.top,
+						this.containment[ 2 ] + co.left,
+						this.containment[ 3 ] + co.top
+					];
+				} else {
+					containment = this.containment;
+				}
+
+				if (event.pageX - this.offset.click.left < containment[0]) {
+					pageX = containment[0] + this.offset.click.left;
+				}
+				if (event.pageY - this.offset.click.top < containment[1]) {
+					pageY = containment[1] + this.offset.click.top;
+				}
+				if (event.pageX - this.offset.click.left > containment[2]) {
+					pageX = containment[2] + this.offset.click.left;
+				}
+				if (event.pageY - this.offset.click.top > containment[3]) {
+					pageY = containment[3] + this.offset.click.top;
+				}
+			}
+
+			if (o.grid) {
+				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
+				top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
+				pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+				left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
+				pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+			}
+
+			if ( o.axis === "y" ) {
+				pageX = this.originalPageX;
+			}
+
+			if ( o.axis === "x" ) {
+				pageY = this.originalPageY;
+			}
+		}
+
+		return {
+			top: (
+				pageY -																	// The absolute mouse position
+				this.offset.click.top	-												// Click offset (relative to the element)
+				this.offset.relative.top -												// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
+				( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
+			),
+			left: (
+				pageX -																	// The absolute mouse position
+				this.offset.click.left -												// Click offset (relative to the element)
+				this.offset.relative.left -												// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
+				( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
+			)
+		};
+
+	},
+
+	_clear: function() {
+		this.helper.removeClass("ui-draggable-dragging");
+		if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
+			this.helper.remove();
+		}
+		this.helper = null;
+		this.cancelHelperRemoval = false;
+		if ( this.destroyOnClear ) {
+			this.destroy();
+		}
+	},
+
+	_normalizeRightBottom: function() {
+		if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) {
+			this.helper.width( this.helper.width() );
+			this.helper.css( "right", "auto" );
+		}
+		if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) {
+			this.helper.height( this.helper.height() );
+			this.helper.css( "bottom", "auto" );
+		}
+	},
+
+	// From now on bulk stuff - mainly helpers
+
+	_trigger: function( type, event, ui ) {
+		ui = ui || this._uiHash();
+		$.ui.plugin.call( this, type, [ event, ui, this ], true );
+
+		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
+		if ( /^(drag|start|stop)/.test( type ) ) {
+			this.positionAbs = this._convertPositionTo( "absolute" );
+			ui.offset = this.positionAbs;
+		}
+		return $.Widget.prototype._trigger.call( this, type, event, ui );
+	},
+
+	plugins: {},
+
+	_uiHash: function() {
+		return {
+			helper: this.helper,
+			position: this.position,
+			originalPosition: this.originalPosition,
+			offset: this.positionAbs
+		};
+	}
+
+});
+
+$.ui.plugin.add( "draggable", "connectToSortable", {
+	start: function( event, ui, draggable ) {
+		var uiSortable = $.extend( {}, ui, {
+			item: draggable.element
+		});
+
+		draggable.sortables = [];
+		$( draggable.options.connectToSortable ).each(function() {
+			var sortable = $( this ).sortable( "instance" );
+
+			if ( sortable && !sortable.options.disabled ) {
+				draggable.sortables.push( sortable );
+
+				// refreshPositions is called at drag start to refresh the containerCache
+				// which is used in drag. This ensures it's initialized and synchronized
+				// with any changes that might have happened on the page since initialization.
+				sortable.refreshPositions();
+				sortable._trigger("activate", event, uiSortable);
+			}
+		});
+	},
+	stop: function( event, ui, draggable ) {
+		var uiSortable = $.extend( {}, ui, {
+			item: draggable.element
+		});
+
+		draggable.cancelHelperRemoval = false;
+
+		$.each( draggable.sortables, function() {
+			var sortable = this;
+
+			if ( sortable.isOver ) {
+				sortable.isOver = 0;
+
+				// Allow this sortable to handle removing the helper
+				draggable.cancelHelperRemoval = true;
+				sortable.cancelHelperRemoval = false;
+
+				// Use _storedCSS To restore properties in the sortable,
+				// as this also handles revert (#9675) since the draggable
+				// may have modified them in unexpected ways (#8809)
+				sortable._storedCSS = {
+					position: sortable.placeholder.css( "position" ),
+					top: sortable.placeholder.css( "top" ),
+					left: sortable.placeholder.css( "left" )
+				};
+
+				sortable._mouseStop(event);
+
+				// Once drag has ended, the sortable should return to using
+				// its original helper, not the shared helper from draggable
+				sortable.options.helper = sortable.options._helper;
+			} else {
+				// Prevent this Sortable from removing the helper.
+				// However, don't set the draggable to remove the helper
+				// either as another connected Sortable may yet handle the removal.
+				sortable.cancelHelperRemoval = true;
+
+				sortable._trigger( "deactivate", event, uiSortable );
+			}
+		});
+	},
+	drag: function( event, ui, draggable ) {
+		$.each( draggable.sortables, function() {
+			var innermostIntersecting = false,
+				sortable = this;
+
+			// Copy over variables that sortable's _intersectsWith uses
+			sortable.positionAbs = draggable.positionAbs;
+			sortable.helperProportions = draggable.helperProportions;
+			sortable.offset.click = draggable.offset.click;
+
+			if ( sortable._intersectsWith( sortable.containerCache ) ) {
+				innermostIntersecting = true;
+
+				$.each( draggable.sortables, function() {
+					// Copy over variables that sortable's _intersectsWith uses
+					this.positionAbs = draggable.positionAbs;
+					this.helperProportions = draggable.helperProportions;
+					this.offset.click = draggable.offset.click;
+
+					if ( this !== sortable &&
+							this._intersectsWith( this.containerCache ) &&
+							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
+						innermostIntersecting = false;
+					}
+
+					return innermostIntersecting;
+				});
+			}
+
+			if ( innermostIntersecting ) {
+				// If it intersects, we use a little isOver variable and set it once,
+				// so that the move-in stuff gets fired only once.
+				if ( !sortable.isOver ) {
+					sortable.isOver = 1;
+
+					// Store draggable's parent in case we need to reappend to it later.
+					draggable._parent = ui.helper.parent();
+
+					sortable.currentItem = ui.helper
+						.appendTo( sortable.element )
+						.data( "ui-sortable-item", true );
+
+					// Store helper option to later restore it
+					sortable.options._helper = sortable.options.helper;
+
+					sortable.options.helper = function() {
+						return ui.helper[ 0 ];
+					};
+
+					// Fire the start events of the sortable with our passed browser event,
+					// and our own helper (so it doesn't create a new one)
+					event.target = sortable.currentItem[ 0 ];
+					sortable._mouseCapture( event, true );
+					sortable._mouseStart( event, true, true );
+
+					// Because the browser event is way off the new appended portlet,
+					// modify necessary variables to reflect the changes
+					sortable.offset.click.top = draggable.offset.click.top;
+					sortable.offset.click.left = draggable.offset.click.left;
+					sortable.offset.parent.left -= draggable.offset.parent.left -
+						sortable.offset.parent.left;
+					sortable.offset.parent.top -= draggable.offset.parent.top -
+						sortable.offset.parent.top;
+
+					draggable._trigger( "toSortable", event );
+
+					// Inform draggable that the helper is in a valid drop zone,
+					// used solely in the revert option to handle "valid/invalid".
+					draggable.dropped = sortable.element;
+
+					// Need to refreshPositions of all sortables in the case that
+					// adding to one sortable changes the location of the other sortables (#9675)
+					$.each( draggable.sortables, function() {
+						this.refreshPositions();
+					});
+
+					// hack so receive/update callbacks work (mostly)
+					draggable.currentItem = draggable.element;
+					sortable.fromOutside = draggable;
+				}
+
+				if ( sortable.currentItem ) {
+					sortable._mouseDrag( event );
+					// Copy the sortable's position because the draggable's can potentially reflect
+					// a relative position, while sortable is always absolute, which the dragged
+					// element has now become. (#8809)
+					ui.position = sortable.position;
+				}
+			} else {
+				// If it doesn't intersect with the sortable, and it intersected before,
+				// we fake the drag stop of the sortable, but make sure it doesn't remove
+				// the helper by using cancelHelperRemoval.
+				if ( sortable.isOver ) {
+
+					sortable.isOver = 0;
+					sortable.cancelHelperRemoval = true;
+
+					// Calling sortable's mouseStop would trigger a revert,
+					// so revert must be temporarily false until after mouseStop is called.
+					sortable.options._revert = sortable.options.revert;
+					sortable.options.revert = false;
+
+					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
+					sortable._mouseStop( event, true );
+
+					// restore sortable behaviors that were modfied
+					// when the draggable entered the sortable area (#9481)
+					sortable.options.revert = sortable.options._revert;
+					sortable.options.helper = sortable.options._helper;
+
+					if ( sortable.placeholder ) {
+						sortable.placeholder.remove();
+					}
+
+					// Restore and recalculate the draggable's offset considering the sortable
+					// may have modified them in unexpected ways. (#8809, #10669)
+					ui.helper.appendTo( draggable._parent );
+					draggable._refreshOffsets( event );
+					ui.position = draggable._generatePosition( event, true );
+
+					draggable._trigger( "fromSortable", event );
+
+					// Inform draggable that the helper is no longer in a valid drop zone
+					draggable.dropped = false;
+
+					// Need to refreshPositions of all sortables just in case removing
+					// from one sortable changes the location of other sortables (#9675)
+					$.each( draggable.sortables, function() {
+						this.refreshPositions();
+					});
+				}
+			}
+		});
+	}
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+	start: function( event, ui, instance ) {
+		var t = $( "body" ),
+			o = instance.options;
+
+		if (t.css("cursor")) {
+			o._cursor = t.css("cursor");
+		}
+		t.css("cursor", o.cursor);
+	},
+	stop: function( event, ui, instance ) {
+		var o = instance.options;
+		if (o._cursor) {
+			$("body").css("cursor", o._cursor);
+		}
+	}
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+	start: function( event, ui, instance ) {
+		var t = $( ui.helper ),
+			o = instance.options;
+		if (t.css("opacity")) {
+			o._opacity = t.css("opacity");
+		}
+		t.css("opacity", o.opacity);
+	},
+	stop: function( event, ui, instance ) {
+		var o = instance.options;
+		if (o._opacity) {
+			$(ui.helper).css("opacity", o._opacity);
+		}
+	}
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+	start: function( event, ui, i ) {
+		if ( !i.scrollParentNotHidden ) {
+			i.scrollParentNotHidden = i.helper.scrollParent( false );
+		}
+
+		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
+			i.overflowOffset = i.scrollParentNotHidden.offset();
+		}
+	},
+	drag: function( event, ui, i  ) {
+
+		var o = i.options,
+			scrolled = false,
+			scrollParent = i.scrollParentNotHidden[ 0 ],
+			document = i.document[ 0 ];
+
+		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
+			if ( !o.axis || o.axis !== "x" ) {
+				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {
+					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
+				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
+					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
+				}
+			}
+
+			if ( !o.axis || o.axis !== "y" ) {
+				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {
+					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
+				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
+					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
+				}
+			}
+
+		} else {
+
+			if (!o.axis || o.axis !== "x") {
+				if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
+					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+				} else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
+					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+				}
+			}
+
+			if (!o.axis || o.axis !== "y") {
+				if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
+					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+				} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
+					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+				}
+			}
+
+		}
+
+		if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
+			$.ui.ddmanager.prepareOffsets(i, event);
+		}
+
+	}
+});
+
+$.ui.plugin.add("draggable", "snap", {
+	start: function( event, ui, i ) {
+
+		var o = i.options;
+
+		i.snapElements = [];
+
+		$(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
+			var $t = $(this),
+				$o = $t.offset();
+			if (this !== i.element[0]) {
+				i.snapElements.push({
+					item: this,
+					width: $t.outerWidth(), height: $t.outerHeight(),
+					top: $o.top, left: $o.left
+				});
+			}
+		});
+
+	},
+	drag: function( event, ui, inst ) {
+
+		var ts, bs, ls, rs, l, r, t, b, i, first,
+			o = inst.options,
+			d = o.snapTolerance,
+			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+		for (i = inst.snapElements.length - 1; i >= 0; i--){
+
+			l = inst.snapElements[i].left - inst.margins.left;
+			r = l + inst.snapElements[i].width;
+			t = inst.snapElements[i].top - inst.margins.top;
+			b = t + inst.snapElements[i].height;
+
+			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
+				if (inst.snapElements[i].snapping) {
+					(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+				}
+				inst.snapElements[i].snapping = false;
+				continue;
+			}
+
+			if (o.snapMode !== "inner") {
+				ts = Math.abs(t - y2) <= d;
+				bs = Math.abs(b - y1) <= d;
+				ls = Math.abs(l - x2) <= d;
+				rs = Math.abs(r - x1) <= d;
+				if (ts) {
+					ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top;
+				}
+				if (bs) {
+					ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top;
+				}
+				if (ls) {
+					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left;
+				}
+				if (rs) {
+					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left;
+				}
+			}
+
+			first = (ts || bs || ls || rs);
+
+			if (o.snapMode !== "outer") {
+				ts = Math.abs(t - y1) <= d;
+				bs = Math.abs(b - y2) <= d;
+				ls = Math.abs(l - x1) <= d;
+				rs = Math.abs(r - x2) <= d;
+				if (ts) {
+					ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top;
+				}
+				if (bs) {
+					ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top;
+				}
+				if (ls) {
+					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left;
+				}
+				if (rs) {
+					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left;
+				}
+			}
+
+			if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
+				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+			}
+			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+		}
+
+	}
+});
+
+$.ui.plugin.add("draggable", "stack", {
+	start: function( event, ui, instance ) {
+		var min,
+			o = instance.options,
+			group = $.makeArray($(o.stack)).sort(function(a, b) {
+				return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
+			});
+
+		if (!group.length) { return; }
+
+		min = parseInt($(group[0]).css("zIndex"), 10) || 0;
+		$(group).each(function(i) {
+			$(this).css("zIndex", min + i);
+		});
+		this.css("zIndex", (min + group.length));
+	}
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+	start: function( event, ui, instance ) {
+		var t = $( ui.helper ),
+			o = instance.options;
+
+		if (t.css("zIndex")) {
+			o._zIndex = t.css("zIndex");
+		}
+		t.css("zIndex", o.zIndex);
+	},
+	stop: function( event, ui, instance ) {
+		var o = instance.options;
+
+		if (o._zIndex) {
+			$(ui.helper).css("zIndex", o._zIndex);
+		}
+	}
+});
+
+var draggable = $.ui.draggable;
+
+
+/*!
+ * jQuery UI Droppable 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/droppable/
+ */
+
+
+$.widget( "ui.droppable", {
+	version: "1.11.4",
+	widgetEventPrefix: "drop",
+	options: {
+		accept: "*",
+		activeClass: false,
+		addClasses: true,
+		greedy: false,
+		hoverClass: false,
+		scope: "default",
+		tolerance: "intersect",
+
+		// callbacks
+		activate: null,
+		deactivate: null,
+		drop: null,
+		out: null,
+		over: null
+	},
+	_create: function() {
+
+		var proportions,
+			o = this.options,
+			accept = o.accept;
+
+		this.isover = false;
+		this.isout = true;
+
+		this.accept = $.isFunction( accept ) ? accept : function( d ) {
+			return d.is( accept );
+		};
+
+		this.proportions = function( /* valueToWrite */ ) {
+			if ( arguments.length ) {
+				// Store the droppable's proportions
+				proportions = arguments[ 0 ];
+			} else {
+				// Retrieve or derive the droppable's proportions
+				return proportions ?
+					proportions :
+					proportions = {
+						width: this.element[ 0 ].offsetWidth,
+						height: this.element[ 0 ].offsetHeight
+					};
+			}
+		};
+
+		this._addToManager( o.scope );
+
+		o.addClasses && this.element.addClass( "ui-droppable" );
+
+	},
+
+	_addToManager: function( scope ) {
+		// Add the reference and positions to the manager
+		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
+		$.ui.ddmanager.droppables[ scope ].push( this );
+	},
+
+	_splice: function( drop ) {
+		var i = 0;
+		for ( ; i < drop.length; i++ ) {
+			if ( drop[ i ] === this ) {
+				drop.splice( i, 1 );
+			}
+		}
+	},
+
+	_destroy: function() {
+		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
+
+		this._splice( drop );
+
+		this.element.removeClass( "ui-droppable ui-droppable-disabled" );
+	},
+
+	_setOption: function( key, value ) {
+
+		if ( key === "accept" ) {
+			this.accept = $.isFunction( value ) ? value : function( d ) {
+				return d.is( value );
+			};
+		} else if ( key === "scope" ) {
+			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
+
+			this._splice( drop );
+			this._addToManager( value );
+		}
+
+		this._super( key, value );
+	},
+
+	_activate: function( event ) {
+		var draggable = $.ui.ddmanager.current;
+		if ( this.options.activeClass ) {
+			this.element.addClass( this.options.activeClass );
+		}
+		if ( draggable ){
+			this._trigger( "activate", event, this.ui( draggable ) );
+		}
+	},
+
+	_deactivate: function( event ) {
+		var draggable = $.ui.ddmanager.current;
+		if ( this.options.activeClass ) {
+			this.element.removeClass( this.options.activeClass );
+		}
+		if ( draggable ){
+			this._trigger( "deactivate", event, this.ui( draggable ) );
+		}
+	},
+
+	_over: function( event ) {
+
+		var draggable = $.ui.ddmanager.current;
+
+		// Bail if draggable and droppable are same element
+		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
+			return;
+		}
+
+		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
+			if ( this.options.hoverClass ) {
+				this.element.addClass( this.options.hoverClass );
+			}
+			this._trigger( "over", event, this.ui( draggable ) );
+		}
+
+	},
+
+	_out: function( event ) {
+
+		var draggable = $.ui.ddmanager.current;
+
+		// Bail if draggable and droppable are same element
+		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
+			return;
+		}
+
+		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
+			if ( this.options.hoverClass ) {
+				this.element.removeClass( this.options.hoverClass );
+			}
+			this._trigger( "out", event, this.ui( draggable ) );
+		}
+
+	},
+
+	_drop: function( event, custom ) {
+
+		var draggable = custom || $.ui.ddmanager.current,
+			childrenIntersection = false;
+
+		// Bail if draggable and droppable are same element
+		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
+			return false;
+		}
+
+		this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() {
+			var inst = $( this ).droppable( "instance" );
+			if (
+				inst.options.greedy &&
+				!inst.options.disabled &&
+				inst.options.scope === draggable.options.scope &&
+				inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&
+				$.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )
+			) { childrenIntersection = true; return false; }
+		});
+		if ( childrenIntersection ) {
+			return false;
+		}
+
+		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
+			if ( this.options.activeClass ) {
+				this.element.removeClass( this.options.activeClass );
+			}
+			if ( this.options.hoverClass ) {
+				this.element.removeClass( this.options.hoverClass );
+			}
+			this._trigger( "drop", event, this.ui( draggable ) );
+			return this.element;
+		}
+
+		return false;
+
+	},
+
+	ui: function( c ) {
+		return {
+			draggable: ( c.currentItem || c.element ),
+			helper: c.helper,
+			position: c.position,
+			offset: c.positionAbs
+		};
+	}
+
+});
+
+$.ui.intersect = (function() {
+	function isOverAxis( x, reference, size ) {
+		return ( x >= reference ) && ( x < ( reference + size ) );
+	}
+
+	return function( draggable, droppable, toleranceMode, event ) {
+
+		if ( !droppable.offset ) {
+			return false;
+		}
+
+		var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,
+			y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,
+			x2 = x1 + draggable.helperProportions.width,
+			y2 = y1 + draggable.helperProportions.height,
+			l = droppable.offset.left,
+			t = droppable.offset.top,
+			r = l + droppable.proportions().width,
+			b = t + droppable.proportions().height;
+
+		switch ( toleranceMode ) {
+		case "fit":
+			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
+		case "intersect":
+			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
+				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
+				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
+				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
+		case "pointer":
+			return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
+		case "touch":
+			return (
+				( y1 >= t && y1 <= b ) || // Top edge touching
+				( y2 >= t && y2 <= b ) || // Bottom edge touching
+				( y1 < t && y2 > b ) // Surrounded vertically
+			) && (
+				( x1 >= l && x1 <= r ) || // Left edge touching
+				( x2 >= l && x2 <= r ) || // Right edge touching
+				( x1 < l && x2 > r ) // Surrounded horizontally
+			);
+		default:
+			return false;
+		}
+	};
+})();
+
+/*
+	This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+	current: null,
+	droppables: { "default": [] },
+	prepareOffsets: function( t, event ) {
+
+		var i, j,
+			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
+			type = event ? event.type : null, // workaround for #2317
+			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
+
+		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
+
+			// No disabled and non-accepted
+			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {
+				continue;
+			}
+
+			// Filter out elements in the current dragged item
+			for ( j = 0; j < list.length; j++ ) {
+				if ( list[ j ] === m[ i ].element[ 0 ] ) {
+					m[ i ].proportions().height = 0;
+					continue droppablesLoop;
+				}
+			}
+
+			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
+			if ( !m[ i ].visible ) {
+				continue;
+			}
+
+			// Activate the droppable if used directly from draggables
+			if ( type === "mousedown" ) {
+				m[ i ]._activate.call( m[ i ], event );
+			}
+
+			m[ i ].offset = m[ i ].element.offset();
+			m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
+
+		}
+
+	},
+	drop: function( draggable, event ) {
+
+		var dropped = false;
+		// Create a copy of the droppables in case the list changes during the drop (#9116)
+		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
+
+			if ( !this.options ) {
+				return;
+			}
+			if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
+				dropped = this._drop.call( this, event ) || dropped;
+			}
+
+			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
+				this.isout = true;
+				this.isover = false;
+				this._deactivate.call( this, event );
+			}
+
+		});
+		return dropped;
+
+	},
+	dragStart: function( draggable, event ) {
+		// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
+		draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
+			if ( !draggable.options.refreshPositions ) {
+				$.ui.ddmanager.prepareOffsets( draggable, event );
+			}
+		});
+	},
+	drag: function( draggable, event ) {
+
+		// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+		if ( draggable.options.refreshPositions ) {
+			$.ui.ddmanager.prepareOffsets( draggable, event );
+		}
+
+		// Run through all droppables and check their positions based on specific tolerance options
+		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
+
+			if ( this.options.disabled || this.greedyChild || !this.visible ) {
+				return;
+			}
+
+			var parentInstance, scope, parent,
+				intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
+				c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
+			if ( !c ) {
+				return;
+			}
+
+			if ( this.options.greedy ) {
+				// find droppable parents with same scope
+				scope = this.options.scope;
+				parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
+					return $( this ).droppable( "instance" ).options.scope === scope;
+				});
+
+				if ( parent.length ) {
+					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
+					parentInstance.greedyChild = ( c === "isover" );
+				}
+			}
+
+			// we just moved into a greedy child
+			if ( parentInstance && c === "isover" ) {
+				parentInstance.isover = false;
+				parentInstance.isout = true;
+				parentInstance._out.call( parentInstance, event );
+			}
+
+			this[ c ] = true;
+			this[c === "isout" ? "isover" : "isout"] = false;
+			this[c === "isover" ? "_over" : "_out"].call( this, event );
+
+			// we just moved out of a greedy child
+			if ( parentInstance && c === "isout" ) {
+				parentInstance.isout = false;
+				parentInstance.isover = true;
+				parentInstance._over.call( parentInstance, event );
+			}
+		});
+
+	},
+	dragStop: function( draggable, event ) {
+		draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
+		// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
+		if ( !draggable.options.refreshPositions ) {
+			$.ui.ddmanager.prepareOffsets( draggable, event );
+		}
+	}
+};
+
+var droppable = $.ui.droppable;
+
+
+/*!
+ * jQuery UI Resizable 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/resizable/
+ */
+
+
+$.widget("ui.resizable", $.ui.mouse, {
+	version: "1.11.4",
+	widgetEventPrefix: "resize",
+	options: {
+		alsoResize: false,
+		animate: false,
+		animateDuration: "slow",
+		animateEasing: "swing",
+		aspectRatio: false,
+		autoHide: false,
+		containment: false,
+		ghost: false,
+		grid: false,
+		handles: "e,s,se",
+		helper: false,
+		maxHeight: null,
+		maxWidth: null,
+		minHeight: 10,
+		minWidth: 10,
+		// See #7960
+		zIndex: 90,
+
+		// callbacks
+		resize: null,
+		start: null,
+		stop: null
+	},
+
+	_num: function( value ) {
+		return parseInt( value, 10 ) || 0;
+	},
+
+	_isNumber: function( value ) {
+		return !isNaN( parseInt( value, 10 ) );
+	},
+
+	_hasScroll: function( el, a ) {
+
+		if ( $( el ).css( "overflow" ) === "hidden") {
+			return false;
+		}
+
+		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+			has = false;
+
+		if ( el[ scroll ] > 0 ) {
+			return true;
+		}
+
+		// TODO: determine which cases actually cause this to happen
+		// if the element doesn't have the scroll set, see if it's possible to
+		// set the scroll
+		el[ scroll ] = 1;
+		has = ( el[ scroll ] > 0 );
+		el[ scroll ] = 0;
+		return has;
+	},
+
+	_create: function() {
+
+		var n, i, handle, axis, hname,
+			that = this,
+			o = this.options;
+		this.element.addClass("ui-resizable");
+
+		$.extend(this, {
+			_aspectRatio: !!(o.aspectRatio),
+			aspectRatio: o.aspectRatio,
+			originalElement: this.element,
+			_proportionallyResizeElements: [],
+			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
+		});
+
+		// Wrap the element if it cannot hold child nodes
+		if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
+
+			this.element.wrap(
+				$("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
+					position: this.element.css("position"),
+					width: this.element.outerWidth(),
+					height: this.element.outerHeight(),
+					top: this.element.css("top"),
+					left: this.element.css("left")
+				})
+			);
+
+			this.element = this.element.parent().data(
+				"ui-resizable", this.element.resizable( "instance" )
+			);
+
+			this.elementIsWrapper = true;
+
+			this.element.css({
+				marginLeft: this.originalElement.css("marginLeft"),
+				marginTop: this.originalElement.css("marginTop"),
+				marginRight: this.originalElement.css("marginRight"),
+				marginBottom: this.originalElement.css("marginBottom")
+			});
+			this.originalElement.css({
+				marginLeft: 0,
+				marginTop: 0,
+				marginRight: 0,
+				marginBottom: 0
+			});
+			// support: Safari
+			// Prevent Safari textarea resize
+			this.originalResizeStyle = this.originalElement.css("resize");
+			this.originalElement.css("resize", "none");
+
+			this._proportionallyResizeElements.push( this.originalElement.css({
+				position: "static",
+				zoom: 1,
+				display: "block"
+			}) );
+
+			// support: IE9
+			// avoid IE jump (hard set the margin)
+			this.originalElement.css({ margin: this.originalElement.css("margin") });
+
+			this._proportionallyResize();
+		}
+
+		this.handles = o.handles ||
+			( !$(".ui-resizable-handle", this.element).length ?
+				"e,s,se" : {
+					n: ".ui-resizable-n",
+					e: ".ui-resizable-e",
+					s: ".ui-resizable-s",
+					w: ".ui-resizable-w",
+					se: ".ui-resizable-se",
+					sw: ".ui-resizable-sw",
+					ne: ".ui-resizable-ne",
+					nw: ".ui-resizable-nw"
+				} );
+
+		this._handles = $();
+		if ( this.handles.constructor === String ) {
+
+			if ( this.handles === "all") {
+				this.handles = "n,e,s,w,se,sw,ne,nw";
+			}
+
+			n = this.handles.split(",");
+			this.handles = {};
+
+			for (i = 0; i < n.length; i++) {
+
+				handle = $.trim(n[i]);
+				hname = "ui-resizable-" + handle;
+				axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
+
+				axis.css({ zIndex: o.zIndex });
+
+				// TODO : What's going on here?
+				if ("se" === handle) {
+					axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
+				}
+
+				this.handles[handle] = ".ui-resizable-" + handle;
+				this.element.append(axis);
+			}
+
+		}
+
+		this._renderAxis = function(target) {
+
+			var i, axis, padPos, padWrapper;
+
+			target = target || this.element;
+
+			for (i in this.handles) {
+
+				if (this.handles[i].constructor === String) {
+					this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
+				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
+					this.handles[ i ] = $( this.handles[ i ] );
+					this._on( this.handles[ i ], { "mousedown": that._mouseDown });
+				}
+
+				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
+
+					axis = $(this.handles[i], this.element);
+
+					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+					padPos = [ "padding",
+						/ne|nw|n/.test(i) ? "Top" :
+						/se|sw|s/.test(i) ? "Bottom" :
+						/^e$/.test(i) ? "Right" : "Left" ].join("");
+
+					target.css(padPos, padWrapper);
+
+					this._proportionallyResize();
+				}
+
+				this._handles = this._handles.add( this.handles[ i ] );
+			}
+		};
+
+		// TODO: make renderAxis a prototype function
+		this._renderAxis(this.element);
+
+		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
+		this._handles.disableSelection();
+
+		this._handles.mouseover(function() {
+			if (!that.resizing) {
+				if (this.className) {
+					axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+				}
+				that.axis = axis && axis[1] ? axis[1] : "se";
+			}
+		});
+
+		if (o.autoHide) {
+			this._handles.hide();
+			$(this.element)
+				.addClass("ui-resizable-autohide")
+				.mouseenter(function() {
+					if (o.disabled) {
+						return;
+					}
+					$(this).removeClass("ui-resizable-autohide");
+					that._handles.show();
+				})
+				.mouseleave(function() {
+					if (o.disabled) {
+						return;
+					}
+					if (!that.resizing) {
+						$(this).addClass("ui-resizable-autohide");
+						that._handles.hide();
+					}
+				});
+		}
+
+		this._mouseInit();
+	},
+
+	_destroy: function() {
+
+		this._mouseDestroy();
+
+		var wrapper,
+			_destroy = function(exp) {
+				$(exp)
+					.removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+					.removeData("resizable")
+					.removeData("ui-resizable")
+					.unbind(".resizable")
+					.find(".ui-resizable-handle")
+						.remove();
+			};
+
+		// TODO: Unwrap at same DOM position
+		if (this.elementIsWrapper) {
+			_destroy(this.element);
+			wrapper = this.element;
+			this.originalElement.css({
+				position: wrapper.css("position"),
+				width: wrapper.outerWidth(),
+				height: wrapper.outerHeight(),
+				top: wrapper.css("top"),
+				left: wrapper.css("left")
+			}).insertAfter( wrapper );
+			wrapper.remove();
+		}
+
+		this.originalElement.css("resize", this.originalResizeStyle);
+		_destroy(this.originalElement);
+
+		return this;
+	},
+
+	_mouseCapture: function(event) {
+		var i, handle,
+			capture = false;
+
+		for (i in this.handles) {
+			handle = $(this.handles[i])[0];
+			if (handle === event.target || $.contains(handle, event.target)) {
+				capture = true;
+			}
+		}
+
+		return !this.options.disabled && capture;
+	},
+
+	_mouseStart: function(event) {
+
+		var curleft, curtop, cursor,
+			o = this.options,
+			el = this.element;
+
+		this.resizing = true;
+
+		this._renderProxy();
+
+		curleft = this._num(this.helper.css("left"));
+		curtop = this._num(this.helper.css("top"));
+
+		if (o.containment) {
+			curleft += $(o.containment).scrollLeft() || 0;
+			curtop += $(o.containment).scrollTop() || 0;
+		}
+
+		this.offset = this.helper.offset();
+		this.position = { left: curleft, top: curtop };
+
+		this.size = this._helper ? {
+				width: this.helper.width(),
+				height: this.helper.height()
+			} : {
+				width: el.width(),
+				height: el.height()
+			};
+
+		this.originalSize = this._helper ? {
+				width: el.outerWidth(),
+				height: el.outerHeight()
+			} : {
+				width: el.width(),
+				height: el.height()
+			};
+
+		this.sizeDiff = {
+			width: el.outerWidth() - el.width(),
+			height: el.outerHeight() - el.height()
+		};
+
+		this.originalPosition = { left: curleft, top: curtop };
+		this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+		this.aspectRatio = (typeof o.aspectRatio === "number") ?
+			o.aspectRatio :
+			((this.originalSize.width / this.originalSize.height) || 1);
+
+		cursor = $(".ui-resizable-" + this.axis).css("cursor");
+		$("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
+
+		el.addClass("ui-resizable-resizing");
+		this._propagate("start", event);
+		return true;
+	},
+
+	_mouseDrag: function(event) {
+
+		var data, props,
+			smp = this.originalMousePosition,
+			a = this.axis,
+			dx = (event.pageX - smp.left) || 0,
+			dy = (event.pageY - smp.top) || 0,
+			trigger = this._change[a];
+
+		this._updatePrevProperties();
+
+		if (!trigger) {
+			return false;
+		}
+
+		data = trigger.apply(this, [ event, dx, dy ]);
+
+		this._updateVirtualBoundaries(event.shiftKey);
+		if (this._aspectRatio || event.shiftKey) {
+			data = this._updateRatio(data, event);
+		}
+
+		data = this._respectSize(data, event);
+
+		this._updateCache(data);
+
+		this._propagate("resize", event);
+
+		props = this._applyChanges();
+
+		if ( !this._helper && this._proportionallyResizeElements.length ) {
+			this._proportionallyResize();
+		}
+
+		if ( !$.isEmptyObject( props ) ) {
+			this._updatePrevProperties();
+			this._trigger( "resize", event, this.ui() );
+			this._applyChanges();
+		}
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+
+		this.resizing = false;
+		var pr, ista, soffseth, soffsetw, s, left, top,
+			o = this.options, that = this;
+
+		if (this._helper) {
+
+			pr = this._proportionallyResizeElements;
+			ista = pr.length && (/textarea/i).test(pr[0].nodeName);
+			soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
+			soffsetw = ista ? 0 : that.sizeDiff.width;
+
+			s = {
+				width: (that.helper.width()  - soffsetw),
+				height: (that.helper.height() - soffseth)
+			};
+			left = (parseInt(that.element.css("left"), 10) +
+				(that.position.left - that.originalPosition.left)) || null;
+			top = (parseInt(that.element.css("top"), 10) +
+				(that.position.top - that.originalPosition.top)) || null;
+
+			if (!o.animate) {
+				this.element.css($.extend(s, { top: top, left: left }));
+			}
+
+			that.helper.height(that.size.height);
+			that.helper.width(that.size.width);
+
+			if (this._helper && !o.animate) {
+				this._proportionallyResize();
+			}
+		}
+
+		$("body").css("cursor", "auto");
+
+		this.element.removeClass("ui-resizable-resizing");
+
+		this._propagate("stop", event);
+
+		if (this._helper) {
+			this.helper.remove();
+		}
+
+		return false;
+
+	},
+
+	_updatePrevProperties: function() {
+		this.prevPosition = {
+			top: this.position.top,
+			left: this.position.left
+		};
+		this.prevSize = {
+			width: this.size.width,
+			height: this.size.height
+		};
+	},
+
+	_applyChanges: function() {
+		var props = {};
+
+		if ( this.position.top !== this.prevPosition.top ) {
+			props.top = this.position.top + "px";
+		}
+		if ( this.position.left !== this.prevPosition.left ) {
+			props.left = this.position.left + "px";
+		}
+		if ( this.size.width !== this.prevSize.width ) {
+			props.width = this.size.width + "px";
+		}
+		if ( this.size.height !== this.prevSize.height ) {
+			props.height = this.size.height + "px";
+		}
+
+		this.helper.css( props );
+
+		return props;
+	},
+
+	_updateVirtualBoundaries: function(forceAspectRatio) {
+		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
+			o = this.options;
+
+		b = {
+			minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
+			maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+			minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
+			maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
+		};
+
+		if (this._aspectRatio || forceAspectRatio) {
+			pMinWidth = b.minHeight * this.aspectRatio;
+			pMinHeight = b.minWidth / this.aspectRatio;
+			pMaxWidth = b.maxHeight * this.aspectRatio;
+			pMaxHeight = b.maxWidth / this.aspectRatio;
+
+			if (pMinWidth > b.minWidth) {
+				b.minWidth = pMinWidth;
+			}
+			if (pMinHeight > b.minHeight) {
+				b.minHeight = pMinHeight;
+			}
+			if (pMaxWidth < b.maxWidth) {
+				b.maxWidth = pMaxWidth;
+			}
+			if (pMaxHeight < b.maxHeight) {
+				b.maxHeight = pMaxHeight;
+			}
+		}
+		this._vBoundaries = b;
+	},
+
+	_updateCache: function(data) {
+		this.offset = this.helper.offset();
+		if (this._isNumber(data.left)) {
+			this.position.left = data.left;
+		}
+		if (this._isNumber(data.top)) {
+			this.position.top = data.top;
+		}
+		if (this._isNumber(data.height)) {
+			this.size.height = data.height;
+		}
+		if (this._isNumber(data.width)) {
+			this.size.width = data.width;
+		}
+	},
+
+	_updateRatio: function( data ) {
+
+		var cpos = this.position,
+			csize = this.size,
+			a = this.axis;
+
+		if (this._isNumber(data.height)) {
+			data.width = (data.height * this.aspectRatio);
+		} else if (this._isNumber(data.width)) {
+			data.height = (data.width / this.aspectRatio);
+		}
+
+		if (a === "sw") {
+			data.left = cpos.left + (csize.width - data.width);
+			data.top = null;
+		}
+		if (a === "nw") {
+			data.top = cpos.top + (csize.height - data.height);
+			data.left = cpos.left + (csize.width - data.width);
+		}
+
+		return data;
+	},
+
+	_respectSize: function( data ) {
+
+		var o = this._vBoundaries,
+			a = this.axis,
+			ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
+			ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+			isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
+			isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
+			dw = this.originalPosition.left + this.originalSize.width,
+			dh = this.position.top + this.size.height,
+			cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+		if (isminw) {
+			data.width = o.minWidth;
+		}
+		if (isminh) {
+			data.height = o.minHeight;
+		}
+		if (ismaxw) {
+			data.width = o.maxWidth;
+		}
+		if (ismaxh) {
+			data.height = o.maxHeight;
+		}
+
+		if (isminw && cw) {
+			data.left = dw - o.minWidth;
+		}
+		if (ismaxw && cw) {
+			data.left = dw - o.maxWidth;
+		}
+		if (isminh && ch) {
+			data.top = dh - o.minHeight;
+		}
+		if (ismaxh && ch) {
+			data.top = dh - o.maxHeight;
+		}
+
+		// Fixing jump error on top/left - bug #2330
+		if (!data.width && !data.height && !data.left && data.top) {
+			data.top = null;
+		} else if (!data.width && !data.height && !data.top && data.left) {
+			data.left = null;
+		}
+
+		return data;
+	},
+
+	_getPaddingPlusBorderDimensions: function( element ) {
+		var i = 0,
+			widths = [],
+			borders = [
+				element.css( "borderTopWidth" ),
+				element.css( "borderRightWidth" ),
+				element.css( "borderBottomWidth" ),
+				element.css( "borderLeftWidth" )
+			],
+			paddings = [
+				element.css( "paddingTop" ),
+				element.css( "paddingRight" ),
+				element.css( "paddingBottom" ),
+				element.css( "paddingLeft" )
+			];
+
+		for ( ; i < 4; i++ ) {
+			widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
+			widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
+		}
+
+		return {
+			height: widths[ 0 ] + widths[ 2 ],
+			width: widths[ 1 ] + widths[ 3 ]
+		};
+	},
+
+	_proportionallyResize: function() {
+
+		if (!this._proportionallyResizeElements.length) {
+			return;
+		}
+
+		var prel,
+			i = 0,
+			element = this.helper || this.element;
+
+		for ( ; i < this._proportionallyResizeElements.length; i++) {
+
+			prel = this._proportionallyResizeElements[i];
+
+			// TODO: Seems like a bug to cache this.outerDimensions
+			// considering that we are in a loop.
+			if (!this.outerDimensions) {
+				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
+			}
+
+			prel.css({
+				height: (element.height() - this.outerDimensions.height) || 0,
+				width: (element.width() - this.outerDimensions.width) || 0
+			});
+
+		}
+
+	},
+
+	_renderProxy: function() {
+
+		var el = this.element, o = this.options;
+		this.elementOffset = el.offset();
+
+		if (this._helper) {
+
+			this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
+
+			this.helper.addClass(this._helper).css({
+				width: this.element.outerWidth() - 1,
+				height: this.element.outerHeight() - 1,
+				position: "absolute",
+				left: this.elementOffset.left + "px",
+				top: this.elementOffset.top + "px",
+				zIndex: ++o.zIndex //TODO: Don't modify option
+			});
+
+			this.helper
+				.appendTo("body")
+				.disableSelection();
+
+		} else {
+			this.helper = this.element;
+		}
+
+	},
+
+	_change: {
+		e: function(event, dx) {
+			return { width: this.originalSize.width + dx };
+		},
+		w: function(event, dx) {
+			var cs = this.originalSize, sp = this.originalPosition;
+			return { left: sp.left + dx, width: cs.width - dx };
+		},
+		n: function(event, dx, dy) {
+			var cs = this.originalSize, sp = this.originalPosition;
+			return { top: sp.top + dy, height: cs.height - dy };
+		},
+		s: function(event, dx, dy) {
+			return { height: this.originalSize.height + dy };
+		},
+		se: function(event, dx, dy) {
+			return $.extend(this._change.s.apply(this, arguments),
+				this._change.e.apply(this, [ event, dx, dy ]));
+		},
+		sw: function(event, dx, dy) {
+			return $.extend(this._change.s.apply(this, arguments),
+				this._change.w.apply(this, [ event, dx, dy ]));
+		},
+		ne: function(event, dx, dy) {
+			return $.extend(this._change.n.apply(this, arguments),
+				this._change.e.apply(this, [ event, dx, dy ]));
+		},
+		nw: function(event, dx, dy) {
+			return $.extend(this._change.n.apply(this, arguments),
+				this._change.w.apply(this, [ event, dx, dy ]));
+		}
+	},
+
+	_propagate: function(n, event) {
+		$.ui.plugin.call(this, n, [ event, this.ui() ]);
+		(n !== "resize" && this._trigger(n, event, this.ui()));
+	},
+
+	plugins: {},
+
+	ui: function() {
+		return {
+			originalElement: this.originalElement,
+			element: this.element,
+			helper: this.helper,
+			position: this.position,
+			size: this.size,
+			originalSize: this.originalSize,
+			originalPosition: this.originalPosition
+		};
+	}
+
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "animate", {
+
+	stop: function( event ) {
+		var that = $(this).resizable( "instance" ),
+			o = that.options,
+			pr = that._proportionallyResizeElements,
+			ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+			soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
+			soffsetw = ista ? 0 : that.sizeDiff.width,
+			style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
+			left = (parseInt(that.element.css("left"), 10) +
+				(that.position.left - that.originalPosition.left)) || null,
+			top = (parseInt(that.element.css("top"), 10) +
+				(that.position.top - that.originalPosition.top)) || null;
+
+		that.element.animate(
+			$.extend(style, top && left ? { top: top, left: left } : {}), {
+				duration: o.animateDuration,
+				easing: o.animateEasing,
+				step: function() {
+
+					var data = {
+						width: parseInt(that.element.css("width"), 10),
+						height: parseInt(that.element.css("height"), 10),
+						top: parseInt(that.element.css("top"), 10),
+						left: parseInt(that.element.css("left"), 10)
+					};
+
+					if (pr && pr.length) {
+						$(pr[0]).css({ width: data.width, height: data.height });
+					}
+
+					// propagating resize, and updating values for each animation step
+					that._updateCache(data);
+					that._propagate("resize", event);
+
+				}
+			}
+		);
+	}
+
+});
+
+$.ui.plugin.add( "resizable", "containment", {
+
+	start: function() {
+		var element, p, co, ch, cw, width, height,
+			that = $( this ).resizable( "instance" ),
+			o = that.options,
+			el = that.element,
+			oc = o.containment,
+			ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
+
+		if ( !ce ) {
+			return;
+		}
+
+		that.containerElement = $( ce );
+
+		if ( /document/.test( oc ) || oc === document ) {
+			that.containerOffset = {
+				left: 0,
+				top: 0
+			};
+			that.containerPosition = {
+				left: 0,
+				top: 0
+			};
+
+			that.parentData = {
+				element: $( document ),
+				left: 0,
+				top: 0,
+				width: $( document ).width(),
+				height: $( document ).height() || document.body.parentNode.scrollHeight
+			};
+		} else {
+			element = $( ce );
+			p = [];
+			$([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
+				p[ i ] = that._num( element.css( "padding" + name ) );
+			});
+
+			that.containerOffset = element.offset();
+			that.containerPosition = element.position();
+			that.containerSize = {
+				height: ( element.innerHeight() - p[ 3 ] ),
+				width: ( element.innerWidth() - p[ 1 ] )
+			};
+
+			co = that.containerOffset;
+			ch = that.containerSize.height;
+			cw = that.containerSize.width;
+			width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
+			height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
+
+			that.parentData = {
+				element: ce,
+				left: co.left,
+				top: co.top,
+				width: width,
+				height: height
+			};
+		}
+	},
+
+	resize: function( event ) {
+		var woset, hoset, isParent, isOffsetRelative,
+			that = $( this ).resizable( "instance" ),
+			o = that.options,
+			co = that.containerOffset,
+			cp = that.position,
+			pRatio = that._aspectRatio || event.shiftKey,
+			cop = {
+				top: 0,
+				left: 0
+			},
+			ce = that.containerElement,
+			continueResize = true;
+
+		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
+			cop = co;
+		}
+
+		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
+			that.size.width = that.size.width +
+				( that._helper ?
+					( that.position.left - co.left ) :
+					( that.position.left - cop.left ) );
+
+			if ( pRatio ) {
+				that.size.height = that.size.width / that.aspectRatio;
+				continueResize = false;
+			}
+			that.position.left = o.helper ? co.left : 0;
+		}
+
+		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
+			that.size.height = that.size.height +
+				( that._helper ?
+					( that.position.top - co.top ) :
+					that.position.top );
+
+			if ( pRatio ) {
+				that.size.width = that.size.height * that.aspectRatio;
+				continueResize = false;
+			}
+			that.position.top = that._helper ? co.top : 0;
+		}
+
+		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
+		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
+
+		if ( isParent && isOffsetRelative ) {
+			that.offset.left = that.parentData.left + that.position.left;
+			that.offset.top = that.parentData.top + that.position.top;
+		} else {
+			that.offset.left = that.element.offset().left;
+			that.offset.top = that.element.offset().top;
+		}
+
+		woset = Math.abs( that.sizeDiff.width +
+			(that._helper ?
+				that.offset.left - cop.left :
+				(that.offset.left - co.left)) );
+
+		hoset = Math.abs( that.sizeDiff.height +
+			(that._helper ?
+				that.offset.top - cop.top :
+				(that.offset.top - co.top)) );
+
+		if ( woset + that.size.width >= that.parentData.width ) {
+			that.size.width = that.parentData.width - woset;
+			if ( pRatio ) {
+				that.size.height = that.size.width / that.aspectRatio;
+				continueResize = false;
+			}
+		}
+
+		if ( hoset + that.size.height >= that.parentData.height ) {
+			that.size.height = that.parentData.height - hoset;
+			if ( pRatio ) {
+				that.size.width = that.size.height * that.aspectRatio;
+				continueResize = false;
+			}
+		}
+
+		if ( !continueResize ) {
+			that.position.left = that.prevPosition.left;
+			that.position.top = that.prevPosition.top;
+			that.size.width = that.prevSize.width;
+			that.size.height = that.prevSize.height;
+		}
+	},
+
+	stop: function() {
+		var that = $( this ).resizable( "instance" ),
+			o = that.options,
+			co = that.containerOffset,
+			cop = that.containerPosition,
+			ce = that.containerElement,
+			helper = $( that.helper ),
+			ho = helper.offset(),
+			w = helper.outerWidth() - that.sizeDiff.width,
+			h = helper.outerHeight() - that.sizeDiff.height;
+
+		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
+			$( this ).css({
+				left: ho.left - cop.left - co.left,
+				width: w,
+				height: h
+			});
+		}
+
+		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
+			$( this ).css({
+				left: ho.left - cop.left - co.left,
+				width: w,
+				height: h
+			});
+		}
+	}
+});
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+	start: function() {
+		var that = $(this).resizable( "instance" ),
+			o = that.options;
+
+		$(o.alsoResize).each(function() {
+			var el = $(this);
+			el.data("ui-resizable-alsoresize", {
+				width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+				left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
+			});
+		});
+	},
+
+	resize: function(event, ui) {
+		var that = $(this).resizable( "instance" ),
+			o = that.options,
+			os = that.originalSize,
+			op = that.originalPosition,
+			delta = {
+				height: (that.size.height - os.height) || 0,
+				width: (that.size.width - os.width) || 0,
+				top: (that.position.top - op.top) || 0,
+				left: (that.position.left - op.left) || 0
+			};
+
+			$(o.alsoResize).each(function() {
+				var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
+					css = el.parents(ui.originalElement[0]).length ?
+							[ "width", "height" ] :
+							[ "width", "height", "top", "left" ];
+
+				$.each(css, function(i, prop) {
+					var sum = (start[prop] || 0) + (delta[prop] || 0);
+					if (sum && sum >= 0) {
+						style[prop] = sum || null;
+					}
+				});
+
+				el.css(style);
+			});
+	},
+
+	stop: function() {
+		$(this).removeData("resizable-alsoresize");
+	}
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+	start: function() {
+
+		var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
+
+		that.ghost = that.originalElement.clone();
+		that.ghost
+			.css({
+				opacity: 0.25,
+				display: "block",
+				position: "relative",
+				height: cs.height,
+				width: cs.width,
+				margin: 0,
+				left: 0,
+				top: 0
+			})
+			.addClass("ui-resizable-ghost")
+			.addClass(typeof o.ghost === "string" ? o.ghost : "");
+
+		that.ghost.appendTo(that.helper);
+
+	},
+
+	resize: function() {
+		var that = $(this).resizable( "instance" );
+		if (that.ghost) {
+			that.ghost.css({
+				position: "relative",
+				height: that.size.height,
+				width: that.size.width
+			});
+		}
+	},
+
+	stop: function() {
+		var that = $(this).resizable( "instance" );
+		if (that.ghost && that.helper) {
+			that.helper.get(0).removeChild(that.ghost.get(0));
+		}
+	}
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+	resize: function() {
+		var outerDimensions,
+			that = $(this).resizable( "instance" ),
+			o = that.options,
+			cs = that.size,
+			os = that.originalSize,
+			op = that.originalPosition,
+			a = that.axis,
+			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
+			gridX = (grid[0] || 1),
+			gridY = (grid[1] || 1),
+			ox = Math.round((cs.width - os.width) / gridX) * gridX,
+			oy = Math.round((cs.height - os.height) / gridY) * gridY,
+			newWidth = os.width + ox,
+			newHeight = os.height + oy,
+			isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
+			isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
+			isMinWidth = o.minWidth && (o.minWidth > newWidth),
+			isMinHeight = o.minHeight && (o.minHeight > newHeight);
+
+		o.grid = grid;
+
+		if (isMinWidth) {
+			newWidth += gridX;
+		}
+		if (isMinHeight) {
+			newHeight += gridY;
+		}
+		if (isMaxWidth) {
+			newWidth -= gridX;
+		}
+		if (isMaxHeight) {
+			newHeight -= gridY;
+		}
+
+		if (/^(se|s|e)$/.test(a)) {
+			that.size.width = newWidth;
+			that.size.height = newHeight;
+		} else if (/^(ne)$/.test(a)) {
+			that.size.width = newWidth;
+			that.size.height = newHeight;
+			that.position.top = op.top - oy;
+		} else if (/^(sw)$/.test(a)) {
+			that.size.width = newWidth;
+			that.size.height = newHeight;
+			that.position.left = op.left - ox;
+		} else {
+			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
+				outerDimensions = that._getPaddingPlusBorderDimensions( this );
+			}
+
+			if ( newHeight - gridY > 0 ) {
+				that.size.height = newHeight;
+				that.position.top = op.top - oy;
+			} else {
+				newHeight = gridY - outerDimensions.height;
+				that.size.height = newHeight;
+				that.position.top = op.top + os.height - newHeight;
+			}
+			if ( newWidth - gridX > 0 ) {
+				that.size.width = newWidth;
+				that.position.left = op.left - ox;
+			} else {
+				newWidth = gridX - outerDimensions.width;
+				that.size.width = newWidth;
+				that.position.left = op.left + os.width - newWidth;
+			}
+		}
+	}
+
+});
+
+var resizable = $.ui.resizable;
+
+
+/*!
+ * jQuery UI Selectable 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/selectable/
+ */
+
+
+var selectable = $.widget("ui.selectable", $.ui.mouse, {
+	version: "1.11.4",
+	options: {
+		appendTo: "body",
+		autoRefresh: true,
+		distance: 0,
+		filter: "*",
+		tolerance: "touch",
+
+		// callbacks
+		selected: null,
+		selecting: null,
+		start: null,
+		stop: null,
+		unselected: null,
+		unselecting: null
+	},
+	_create: function() {
+		var selectees,
+			that = this;
+
+		this.element.addClass("ui-selectable");
+
+		this.dragged = false;
+
+		// cache selectee children based on filter
+		this.refresh = function() {
+			selectees = $(that.options.filter, that.element[0]);
+			selectees.addClass("ui-selectee");
+			selectees.each(function() {
+				var $this = $(this),
+					pos = $this.offset();
+				$.data(this, "selectable-item", {
+					element: this,
+					$element: $this,
+					left: pos.left,
+					top: pos.top,
+					right: pos.left + $this.outerWidth(),
+					bottom: pos.top + $this.outerHeight(),
+					startselected: false,
+					selected: $this.hasClass("ui-selected"),
+					selecting: $this.hasClass("ui-selecting"),
+					unselecting: $this.hasClass("ui-unselecting")
+				});
+			});
+		};
+		this.refresh();
+
+		this.selectees = selectees.addClass("ui-selectee");
+
+		this._mouseInit();
+
+		this.helper = $("<div class='ui-selectable-helper'></div>");
+	},
+
+	_destroy: function() {
+		this.selectees
+			.removeClass("ui-selectee")
+			.removeData("selectable-item");
+		this.element
+			.removeClass("ui-selectable ui-selectable-disabled");
+		this._mouseDestroy();
+	},
+
+	_mouseStart: function(event) {
+		var that = this,
+			options = this.options;
+
+		this.opos = [ event.pageX, event.pageY ];
+
+		if (this.options.disabled) {
+			return;
+		}
+
+		this.selectees = $(options.filter, this.element[0]);
+
+		this._trigger("start", event);
+
+		$(options.appendTo).append(this.helper);
+		// position helper (lasso)
+		this.helper.css({
+			"left": event.pageX,
+			"top": event.pageY,
+			"width": 0,
+			"height": 0
+		});
+
+		if (options.autoRefresh) {
+			this.refresh();
+		}
+
+		this.selectees.filter(".ui-selected").each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.startselected = true;
+			if (!event.metaKey && !event.ctrlKey) {
+				selectee.$element.removeClass("ui-selected");
+				selectee.selected = false;
+				selectee.$element.addClass("ui-unselecting");
+				selectee.unselecting = true;
+				// selectable UNSELECTING callback
+				that._trigger("unselecting", event, {
+					unselecting: selectee.element
+				});
+			}
+		});
+
+		$(event.target).parents().addBack().each(function() {
+			var doSelect,
+				selectee = $.data(this, "selectable-item");
+			if (selectee) {
+				doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
+				selectee.$element
+					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+				selectee.unselecting = !doSelect;
+				selectee.selecting = doSelect;
+				selectee.selected = doSelect;
+				// selectable (UN)SELECTING callback
+				if (doSelect) {
+					that._trigger("selecting", event, {
+						selecting: selectee.element
+					});
+				} else {
+					that._trigger("unselecting", event, {
+						unselecting: selectee.element
+					});
+				}
+				return false;
+			}
+		});
+
+	},
+
+	_mouseDrag: function(event) {
+
+		this.dragged = true;
+
+		if (this.options.disabled) {
+			return;
+		}
+
+		var tmp,
+			that = this,
+			options = this.options,
+			x1 = this.opos[0],
+			y1 = this.opos[1],
+			x2 = event.pageX,
+			y2 = event.pageY;
+
+		if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
+		if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
+		this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
+
+		this.selectees.each(function() {
+			var selectee = $.data(this, "selectable-item"),
+				hit = false;
+
+			//prevent helper from being selected if appendTo: selectable
+			if (!selectee || selectee.element === that.element[0]) {
+				return;
+			}
+
+			if (options.tolerance === "touch") {
+				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+			} else if (options.tolerance === "fit") {
+				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+			}
+
+			if (hit) {
+				// SELECT
+				if (selectee.selected) {
+					selectee.$element.removeClass("ui-selected");
+					selectee.selected = false;
+				}
+				if (selectee.unselecting) {
+					selectee.$element.removeClass("ui-unselecting");
+					selectee.unselecting = false;
+				}
+				if (!selectee.selecting) {
+					selectee.$element.addClass("ui-selecting");
+					selectee.selecting = true;
+					// selectable SELECTING callback
+					that._trigger("selecting", event, {
+						selecting: selectee.element
+					});
+				}
+			} else {
+				// UNSELECT
+				if (selectee.selecting) {
+					if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
+						selectee.$element.removeClass("ui-selecting");
+						selectee.selecting = false;
+						selectee.$element.addClass("ui-selected");
+						selectee.selected = true;
+					} else {
+						selectee.$element.removeClass("ui-selecting");
+						selectee.selecting = false;
+						if (selectee.startselected) {
+							selectee.$element.addClass("ui-unselecting");
+							selectee.unselecting = true;
+						}
+						// selectable UNSELECTING callback
+						that._trigger("unselecting", event, {
+							unselecting: selectee.element
+						});
+					}
+				}
+				if (selectee.selected) {
+					if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
+						selectee.$element.removeClass("ui-selected");
+						selectee.selected = false;
+
+						selectee.$element.addClass("ui-unselecting");
+						selectee.unselecting = true;
+						// selectable UNSELECTING callback
+						that._trigger("unselecting", event, {
+							unselecting: selectee.element
+						});
+					}
+				}
+			}
+		});
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+		var that = this;
+
+		this.dragged = false;
+
+		$(".ui-unselecting", this.element[0]).each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.$element.removeClass("ui-unselecting");
+			selectee.unselecting = false;
+			selectee.startselected = false;
+			that._trigger("unselected", event, {
+				unselected: selectee.element
+			});
+		});
+		$(".ui-selecting", this.element[0]).each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
+			selectee.selecting = false;
+			selectee.selected = true;
+			selectee.startselected = true;
+			that._trigger("selected", event, {
+				selected: selectee.element
+			});
+		});
+		this._trigger("stop", event);
+
+		this.helper.remove();
+
+		return false;
+	}
+
+});
+
+
+/*!
+ * jQuery UI Sortable 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/sortable/
+ */
+
+
+var sortable = $.widget("ui.sortable", $.ui.mouse, {
+	version: "1.11.4",
+	widgetEventPrefix: "sort",
+	ready: false,
+	options: {
+		appendTo: "parent",
+		axis: false,
+		connectWith: false,
+		containment: false,
+		cursor: "auto",
+		cursorAt: false,
+		dropOnEmpty: true,
+		forcePlaceholderSize: false,
+		forceHelperSize: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		items: "> *",
+		opacity: false,
+		placeholder: false,
+		revert: false,
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		scope: "default",
+		tolerance: "intersect",
+		zIndex: 1000,
+
+		// callbacks
+		activate: null,
+		beforeStop: null,
+		change: null,
+		deactivate: null,
+		out: null,
+		over: null,
+		receive: null,
+		remove: null,
+		sort: null,
+		start: null,
+		stop: null,
+		update: null
+	},
+
+	_isOverAxis: function( x, reference, size ) {
+		return ( x >= reference ) && ( x < ( reference + size ) );
+	},
+
+	_isFloating: function( item ) {
+		return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
+	},
+
+	_create: function() {
+		this.containerCache = {};
+		this.element.addClass("ui-sortable");
+
+		//Get the items
+		this.refresh();
+
+		//Let's determine the parent's offset
+		this.offset = this.element.offset();
+
+		//Initialize mouse events for interaction
+		this._mouseInit();
+
+		this._setHandleClassName();
+
+		//We're ready to go
+		this.ready = true;
+
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+
+		if ( key === "handle" ) {
+			this._setHandleClassName();
+		}
+	},
+
+	_setHandleClassName: function() {
+		this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
+		$.each( this.items, function() {
+			( this.instance.options.handle ?
+				this.item.find( this.instance.options.handle ) : this.item )
+				.addClass( "ui-sortable-handle" );
+		});
+	},
+
+	_destroy: function() {
+		this.element
+			.removeClass( "ui-sortable ui-sortable-disabled" )
+			.find( ".ui-sortable-handle" )
+				.removeClass( "ui-sortable-handle" );
+		this._mouseDestroy();
+
+		for ( var i = this.items.length - 1; i >= 0; i-- ) {
+			this.items[i].item.removeData(this.widgetName + "-item");
+		}
+
+		return this;
+	},
+
+	_mouseCapture: function(event, overrideHandle) {
+		var currentItem = null,
+			validHandle = false,
+			that = this;
+
+		if (this.reverting) {
+			return false;
+		}
+
+		if(this.options.disabled || this.options.type === "static") {
+			return false;
+		}
+
+		//We have to refresh the items data once first
+		this._refreshItems(event);
+
+		//Find out if the clicked node (or one of its parents) is a actual item in this.items
+		$(event.target).parents().each(function() {
+			if($.data(this, that.widgetName + "-item") === that) {
+				currentItem = $(this);
+				return false;
+			}
+		});
+		if($.data(event.target, that.widgetName + "-item") === that) {
+			currentItem = $(event.target);
+		}
+
+		if(!currentItem) {
+			return false;
+		}
+		if(this.options.handle && !overrideHandle) {
+			$(this.options.handle, currentItem).find("*").addBack().each(function() {
+				if(this === event.target) {
+					validHandle = true;
+				}
+			});
+			if(!validHandle) {
+				return false;
+			}
+		}
+
+		this.currentItem = currentItem;
+		this._removeCurrentsFromItems();
+		return true;
+
+	},
+
+	_mouseStart: function(event, overrideHandle, noActivation) {
+
+		var i, body,
+			o = this.options;
+
+		this.currentContainer = this;
+
+		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+		this.refreshPositions();
+
+		//Create and append the visible helper
+		this.helper = this._createHelper(event);
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Get the next scrolling parent
+		this.scrollParent = this.helper.scrollParent();
+
+		//The element's absolute position on the page minus margins
+		this.offset = this.currentItem.offset();
+		this.offset = {
+			top: this.offset.top - this.margins.top,
+			left: this.offset.left - this.margins.left
+		};
+
+		$.extend(this.offset, {
+			click: { //Where the click happened, relative to the element
+				left: event.pageX - this.offset.left,
+				top: event.pageY - this.offset.top
+			},
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+		});
+
+		// Only after we got the offset, we can change the helper's position to absolute
+		// TODO: Still need to figure out a way to make relative sorting possible
+		this.helper.css("position", "absolute");
+		this.cssPosition = this.helper.css("position");
+
+		//Generate the original position
+		this.originalPosition = this._generatePosition(event);
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
+		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+		//Cache the former DOM position
+		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+		if(this.helper[0] !== this.currentItem[0]) {
+			this.currentItem.hide();
+		}
+
+		//Create the placeholder
+		this._createPlaceholder();
+
+		//Set a containment if given in the options
+		if(o.containment) {
+			this._setContainment();
+		}
+
+		if( o.cursor && o.cursor !== "auto" ) { // cursor option
+			body = this.document.find( "body" );
+
+			// support: IE
+			this.storedCursor = body.css( "cursor" );
+			body.css( "cursor", o.cursor );
+
+			this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
+		}
+
+		if(o.opacity) { // opacity option
+			if (this.helper.css("opacity")) {
+				this._storedOpacity = this.helper.css("opacity");
+			}
+			this.helper.css("opacity", o.opacity);
+		}
+
+		if(o.zIndex) { // zIndex option
+			if (this.helper.css("zIndex")) {
+				this._storedZIndex = this.helper.css("zIndex");
+			}
+			this.helper.css("zIndex", o.zIndex);
+		}
+
+		//Prepare scrolling
+		if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
+			this.overflowOffset = this.scrollParent.offset();
+		}
+
+		//Call callbacks
+		this._trigger("start", event, this._uiHash());
+
+		//Recache the helper size
+		if(!this._preserveHelperProportions) {
+			this._cacheHelperProportions();
+		}
+
+
+		//Post "activate" events to possible containers
+		if( !noActivation ) {
+			for ( i = this.containers.length - 1; i >= 0; i-- ) {
+				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
+			}
+		}
+
+		//Prepare possible droppables
+		if($.ui.ddmanager) {
+			$.ui.ddmanager.current = this;
+		}
+
+		if ($.ui.ddmanager && !o.dropBehaviour) {
+			$.ui.ddmanager.prepareOffsets(this, event);
+		}
+
+		this.dragging = true;
+
+		this.helper.addClass("ui-sortable-helper");
+		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+		return true;
+
+	},
+
+	_mouseDrag: function(event) {
+		var i, item, itemElement, intersection,
+			o = this.options,
+			scrolled = false;
+
+		//Compute the helpers position
+		this.position = this._generatePosition(event);
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		if (!this.lastPositionAbs) {
+			this.lastPositionAbs = this.positionAbs;
+		}
+
+		//Do scrolling
+		if(this.options.scroll) {
+			if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
+
+				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
+					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+				} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
+					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+				}
+
+				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
+					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+				} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
+					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+				}
+
+			} else {
+
+				if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
+					scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
+				} else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {
+					scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
+				}
+
+				if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
+					scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
+				} else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {
+					scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
+				}
+
+			}
+
+			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
+				$.ui.ddmanager.prepareOffsets(this, event);
+			}
+		}
+
+		//Regenerate the absolute position used for position checks
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		//Set the helper position
+		if(!this.options.axis || this.options.axis !== "y") {
+			this.helper[0].style.left = this.position.left+"px";
+		}
+		if(!this.options.axis || this.options.axis !== "x") {
+			this.helper[0].style.top = this.position.top+"px";
+		}
+
+		//Rearrange
+		for (i = this.items.length - 1; i >= 0; i--) {
+
+			//Cache variables and intersection, continue if no intersection
+			item = this.items[i];
+			itemElement = item.item[0];
+			intersection = this._intersectsWithPointer(item);
+			if (!intersection) {
+				continue;
+			}
+
+			// Only put the placeholder inside the current Container, skip all
+			// items from other containers. This works because when moving
+			// an item from one container to another the
+			// currentContainer is switched before the placeholder is moved.
+			//
+			// Without this, moving items in "sub-sortables" can cause
+			// the placeholder to jitter between the outer and inner container.
+			if (item.instance !== this.currentContainer) {
+				continue;
+			}
+
+			// cannot intersect with itself
+			// no useless actions that have been done before
+			// no action if the item moved is the parent of the item checked
+			if (itemElement !== this.currentItem[0] &&
+				this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
+				!$.contains(this.placeholder[0], itemElement) &&
+				(this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
+			) {
+
+				this.direction = intersection === 1 ? "down" : "up";
+
+				if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
+					this._rearrange(event, item);
+				} else {
+					break;
+				}
+
+				this._trigger("change", event, this._uiHash());
+				break;
+			}
+		}
+
+		//Post events to containers
+		this._contactContainers(event);
+
+		//Interconnect with droppables
+		if($.ui.ddmanager) {
+			$.ui.ddmanager.drag(this, event);
+		}
+
+		//Call callbacks
+		this._trigger("sort", event, this._uiHash());
+
+		this.lastPositionAbs = this.positionAbs;
+		return false;
+
+	},
+
+	_mouseStop: function(event, noPropagation) {
+
+		if(!event) {
+			return;
+		}
+
+		//If we are using droppables, inform the manager about the drop
+		if ($.ui.ddmanager && !this.options.dropBehaviour) {
+			$.ui.ddmanager.drop(this, event);
+		}
+
+		if(this.options.revert) {
+			var that = this,
+				cur = this.placeholder.offset(),
+				axis = this.options.axis,
+				animation = {};
+
+			if ( !axis || axis === "x" ) {
+				animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
+			}
+			if ( !axis || axis === "y" ) {
+				animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
+			}
+			this.reverting = true;
+			$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
+				that._clear(event);
+			});
+		} else {
+			this._clear(event, noPropagation);
+		}
+
+		return false;
+
+	},
+
+	cancel: function() {
+
+		if(this.dragging) {
+
+			this._mouseUp({ target: null });
+
+			if(this.options.helper === "original") {
+				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+			} else {
+				this.currentItem.show();
+			}
+
+			//Post deactivating events to containers
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
+				if(this.containers[i].containerCache.over) {
+					this.containers[i]._trigger("out", null, this._uiHash(this));
+					this.containers[i].containerCache.over = 0;
+				}
+			}
+
+		}
+
+		if (this.placeholder) {
+			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+			if(this.placeholder[0].parentNode) {
+				this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+			}
+			if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
+				this.helper.remove();
+			}
+
+			$.extend(this, {
+				helper: null,
+				dragging: false,
+				reverting: false,
+				_noFinalSort: null
+			});
+
+			if(this.domPosition.prev) {
+				$(this.domPosition.prev).after(this.currentItem);
+			} else {
+				$(this.domPosition.parent).prepend(this.currentItem);
+			}
+		}
+
+		return this;
+
+	},
+
+	serialize: function(o) {
+
+		var items = this._getItemsAsjQuery(o && o.connected),
+			str = [];
+		o = o || {};
+
+		$(items).each(function() {
+			var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
+			if (res) {
+				str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
+			}
+		});
+
+		if(!str.length && o.key) {
+			str.push(o.key + "=");
+		}
+
+		return str.join("&");
+
+	},
+
+	toArray: function(o) {
+
+		var items = this._getItemsAsjQuery(o && o.connected),
+			ret = [];
+
+		o = o || {};
+
+		items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
+		return ret;
+
+	},
+
+	/* Be careful with the following core functions */
+	_intersectsWith: function(item) {
+
+		var x1 = this.positionAbs.left,
+			x2 = x1 + this.helperProportions.width,
+			y1 = this.positionAbs.top,
+			y2 = y1 + this.helperProportions.height,
+			l = item.left,
+			r = l + item.width,
+			t = item.top,
+			b = t + item.height,
+			dyClick = this.offset.click.top,
+			dxClick = this.offset.click.left,
+			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
+			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
+			isOverElement = isOverElementHeight && isOverElementWidth;
+
+		if ( this.options.tolerance === "pointer" ||
+			this.options.forcePointerForContainers ||
+			(this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
+		) {
+			return isOverElement;
+		} else {
+
+			return (l < x1 + (this.helperProportions.width / 2) && // Right Half
+				x2 - (this.helperProportions.width / 2) < r && // Left Half
+				t < y1 + (this.helperProportions.height / 2) && // Bottom Half
+				y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+		}
+	},
+
+	_intersectsWithPointer: function(item) {
+
+		var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+			isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+			isOverElement = isOverElementHeight && isOverElementWidth,
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if (!isOverElement) {
+			return false;
+		}
+
+		return this.floating ?
+			( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
+			: ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
+
+	},
+
+	_intersectsWithSides: function(item) {
+
+		var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+			isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if (this.floating && horizontalDirection) {
+			return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
+		} else {
+			return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
+		}
+
+	},
+
+	_getDragVerticalDirection: function() {
+		var delta = this.positionAbs.top - this.lastPositionAbs.top;
+		return delta !== 0 && (delta > 0 ? "down" : "up");
+	},
+
+	_getDragHorizontalDirection: function() {
+		var delta = this.positionAbs.left - this.lastPositionAbs.left;
+		return delta !== 0 && (delta > 0 ? "right" : "left");
+	},
+
+	refresh: function(event) {
+		this._refreshItems(event);
+		this._setHandleClassName();
+		this.refreshPositions();
+		return this;
+	},
+
+	_connectWith: function() {
+		var options = this.options;
+		return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
+	},
+
+	_getItemsAsjQuery: function(connected) {
+
+		var i, j, cur, inst,
+			items = [],
+			queries = [],
+			connectWith = this._connectWith();
+
+		if(connectWith && connected) {
+			for (i = connectWith.length - 1; i >= 0; i--){
+				cur = $(connectWith[i], this.document[0]);
+				for ( j = cur.length - 1; j >= 0; j--){
+					inst = $.data(cur[j], this.widgetFullName);
+					if(inst && inst !== this && !inst.options.disabled) {
+						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
+					}
+				}
+			}
+		}
+
+		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
+
+		function addItems() {
+			items.push( this );
+		}
+		for (i = queries.length - 1; i >= 0; i--){
+			queries[i][0].each( addItems );
+		}
+
+		return $(items);
+
+	},
+
+	_removeCurrentsFromItems: function() {
+
+		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
+
+		this.items = $.grep(this.items, function (item) {
+			for (var j=0; j < list.length; j++) {
+				if(list[j] === item.item[0]) {
+					return false;
+				}
+			}
+			return true;
+		});
+
+	},
+
+	_refreshItems: function(event) {
+
+		this.items = [];
+		this.containers = [this];
+
+		var i, j, cur, inst, targetData, _queries, item, queriesLength,
+			items = this.items,
+			queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
+			connectWith = this._connectWith();
+
+		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
+			for (i = connectWith.length - 1; i >= 0; i--){
+				cur = $(connectWith[i], this.document[0]);
+				for (j = cur.length - 1; j >= 0; j--){
+					inst = $.data(cur[j], this.widgetFullName);
+					if(inst && inst !== this && !inst.options.disabled) {
+						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+						this.containers.push(inst);
+					}
+				}
+			}
+		}
+
+		for (i = queries.length - 1; i >= 0; i--) {
+			targetData = queries[i][1];
+			_queries = queries[i][0];
+
+			for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+				item = $(_queries[j]);
+
+				item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
+
+				items.push({
+					item: item,
+					instance: targetData,
+					width: 0, height: 0,
+					left: 0, top: 0
+				});
+			}
+		}
+
+	},
+
+	refreshPositions: function(fast) {
+
+		// Determine whether items are being displayed horizontally
+		this.floating = this.items.length ?
+			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
+			false;
+
+		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+		if(this.offsetParent && this.helper) {
+			this.offset.parent = this._getParentOffset();
+		}
+
+		var i, item, t, p;
+
+		for (i = this.items.length - 1; i >= 0; i--){
+			item = this.items[i];
+
+			//We ignore calculating positions of all connected containers when we're not over them
+			if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
+				continue;
+			}
+
+			t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+			if (!fast) {
+				item.width = t.outerWidth();
+				item.height = t.outerHeight();
+			}
+
+			p = t.offset();
+			item.left = p.left;
+			item.top = p.top;
+		}
+
+		if(this.options.custom && this.options.custom.refreshContainers) {
+			this.options.custom.refreshContainers.call(this);
+		} else {
+			for (i = this.containers.length - 1; i >= 0; i--){
+				p = this.containers[i].element.offset();
+				this.containers[i].containerCache.left = p.left;
+				this.containers[i].containerCache.top = p.top;
+				this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
+				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+			}
+		}
+
+		return this;
+	},
+
+	_createPlaceholder: function(that) {
+		that = that || this;
+		var className,
+			o = that.options;
+
+		if(!o.placeholder || o.placeholder.constructor === String) {
+			className = o.placeholder;
+			o.placeholder = {
+				element: function() {
+
+					var nodeName = that.currentItem[0].nodeName.toLowerCase(),
+						element = $( "<" + nodeName + ">", that.document[0] )
+							.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
+							.removeClass("ui-sortable-helper");
+
+					if ( nodeName === "tbody" ) {
+						that._createTrPlaceholder(
+							that.currentItem.find( "tr" ).eq( 0 ),
+							$( "<tr>", that.document[ 0 ] ).appendTo( element )
+						);
+					} else if ( nodeName === "tr" ) {
+						that._createTrPlaceholder( that.currentItem, element );
+					} else if ( nodeName === "img" ) {
+						element.attr( "src", that.currentItem.attr( "src" ) );
+					}
+
+					if ( !className ) {
+						element.css( "visibility", "hidden" );
+					}
+
+					return element;
+				},
+				update: function(container, p) {
+
+					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+					if(className && !o.forcePlaceholderSize) {
+						return;
+					}
+
+					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
+					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
+				}
+			};
+		}
+
+		//Create the placeholder
+		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
+
+		//Append it after the actual current item
+		that.currentItem.after(that.placeholder);
+
+		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+		o.placeholder.update(that, that.placeholder);
+
+	},
+
+	_createTrPlaceholder: function( sourceTr, targetTr ) {
+		var that = this;
+
+		sourceTr.children().each(function() {
+			$( "<td> </td>", that.document[ 0 ] )
+				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
+				.appendTo( targetTr );
+		});
+	},
+
+	_contactContainers: function(event) {
+		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
+			innermostContainer = null,
+			innermostIndex = null;
+
+		// get innermost container that intersects with item
+		for (i = this.containers.length - 1; i >= 0; i--) {
+
+			// never consider a container that's located within the item itself
+			if($.contains(this.currentItem[0], this.containers[i].element[0])) {
+				continue;
+			}
+
+			if(this._intersectsWith(this.containers[i].containerCache)) {
+
+				// if we've already found a container and it's more "inner" than this, then continue
+				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
+					continue;
+				}
+
+				innermostContainer = this.containers[i];
+				innermostIndex = i;
+
+			} else {
+				// container doesn't intersect. trigger "out" event if necessary
+				if(this.containers[i].containerCache.over) {
+					this.containers[i]._trigger("out", event, this._uiHash(this));
+					this.containers[i].containerCache.over = 0;
+				}
+			}
+
+		}
+
+		// if no intersecting containers found, return
+		if(!innermostContainer) {
+			return;
+		}
+
+		// move the item into the container if it's not there already
+		if(this.containers.length === 1) {
+			if (!this.containers[innermostIndex].containerCache.over) {
+				this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+				this.containers[innermostIndex].containerCache.over = 1;
+			}
+		} else {
+
+			//When entering a new container, we will find the item with the least distance and append our item near it
+			dist = 10000;
+			itemWithLeastDistance = null;
+			floating = innermostContainer.floating || this._isFloating(this.currentItem);
+			posProperty = floating ? "left" : "top";
+			sizeProperty = floating ? "width" : "height";
+			axis = floating ? "clientX" : "clientY";
+
+			for (j = this.items.length - 1; j >= 0; j--) {
+				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
+					continue;
+				}
+				if(this.items[j].item[0] === this.currentItem[0]) {
+					continue;
+				}
+
+				cur = this.items[j].item.offset()[posProperty];
+				nearBottom = false;
+				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
+					nearBottom = true;
+				}
+
+				if ( Math.abs( event[ axis ] - cur ) < dist ) {
+					dist = Math.abs( event[ axis ] - cur );
+					itemWithLeastDistance = this.items[ j ];
+					this.direction = nearBottom ? "up": "down";
+				}
+			}
+
+			//Check if dropOnEmpty is enabled
+			if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
+				return;
+			}
+
+			if(this.currentContainer === this.containers[innermostIndex]) {
+				if ( !this.currentContainer.containerCache.over ) {
+					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
+					this.currentContainer.containerCache.over = 1;
+				}
+				return;
+			}
+
+			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
+			this._trigger("change", event, this._uiHash());
+			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
+			this.currentContainer = this.containers[innermostIndex];
+
+			//Update the placeholder
+			this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+			this.containers[innermostIndex].containerCache.over = 1;
+		}
+
+
+	},
+
+	_createHelper: function(event) {
+
+		var o = this.options,
+			helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
+
+		//Add the helper to the DOM if that didn't happen already
+		if(!helper.parents("body").length) {
+			$(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+		}
+
+		if(helper[0] === this.currentItem[0]) {
+			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+		}
+
+		if(!helper[0].style.width || o.forceHelperSize) {
+			helper.width(this.currentItem.width());
+		}
+		if(!helper[0].style.height || o.forceHelperSize) {
+			helper.height(this.currentItem.height());
+		}
+
+		return helper;
+
+	},
+
+	_adjustOffsetFromHelper: function(obj) {
+		if (typeof obj === "string") {
+			obj = obj.split(" ");
+		}
+		if ($.isArray(obj)) {
+			obj = {left: +obj[0], top: +obj[1] || 0};
+		}
+		if ("left" in obj) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ("right" in obj) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ("top" in obj) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ("bottom" in obj) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_getParentOffset: function() {
+
+
+		//Get the offsetParent and cache its position
+		this.offsetParent = this.helper.offsetParent();
+		var po = this.offsetParent.offset();
+
+		// This is a special case where we need to modify a offset calculated on start, since the following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+		if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		// This needs to be actually done for all browsers, since pageX/pageY includes this information
+		// with an ugly IE fix
+		if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
+			po = { top: 0, left: 0 };
+		}
+
+		return {
+			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+
+		if(this.cssPosition === "relative") {
+			var p = this.currentItem.position();
+			return {
+				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+			};
+		} else {
+			return { top: 0, left: 0 };
+		}
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var ce, co, over,
+			o = this.options;
+		if(o.containment === "parent") {
+			o.containment = this.helper[0].parentNode;
+		}
+		if(o.containment === "document" || o.containment === "window") {
+			this.containment = [
+				0 - this.offset.relative.left - this.offset.parent.left,
+				0 - this.offset.relative.top - this.offset.parent.top,
+				o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,
+				(o.containment === "document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+			];
+		}
+
+		if(!(/^(document|window|parent)$/).test(o.containment)) {
+			ce = $(o.containment)[0];
+			co = $(o.containment).offset();
+			over = ($(ce).css("overflow") !== "hidden");
+
+			this.containment = [
+				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+			];
+		}
+
+	},
+
+	_convertPositionTo: function(d, pos) {
+
+		if(!pos) {
+			pos = this.position;
+		}
+		var mod = d === "absolute" ? 1 : -1,
+			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
+			scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		return {
+			top: (
+				pos.top	+																// The absolute mouse position
+				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.parent.top * mod -											// The offsetParent's offset without borders (offset + border)
+				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+			),
+			left: (
+				pos.left +																// The absolute mouse position
+				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
+				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+			)
+		};
+
+	},
+
+	_generatePosition: function(event) {
+
+		var top, left,
+			o = this.options,
+			pageX = event.pageX,
+			pageY = event.pageY,
+			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		// This is another very weird special case that only happens for relative elements:
+		// 1. If the css position is relative
+		// 2. and the scroll parent is the document or similar to the offset parent
+		// we have to refresh the relative offset during the scroll so there are no jumps
+		if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
+			this.offset.relative = this._getRelativeOffset();
+		}
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+			if(this.containment) {
+				if(event.pageX - this.offset.click.left < this.containment[0]) {
+					pageX = this.containment[0] + this.offset.click.left;
+				}
+				if(event.pageY - this.offset.click.top < this.containment[1]) {
+					pageY = this.containment[1] + this.offset.click.top;
+				}
+				if(event.pageX - this.offset.click.left > this.containment[2]) {
+					pageX = this.containment[2] + this.offset.click.left;
+				}
+				if(event.pageY - this.offset.click.top > this.containment[3]) {
+					pageY = this.containment[3] + this.offset.click.top;
+				}
+			}
+
+			if(o.grid) {
+				top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+				pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+				left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+				pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+			}
+
+		}
+
+		return {
+			top: (
+				pageY -																// The absolute mouse position
+				this.offset.click.top -													// Click offset (relative to the element)
+				this.offset.relative.top	-											// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
+				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+			),
+			left: (
+				pageX -																// The absolute mouse position
+				this.offset.click.left -												// Click offset (relative to the element)
+				this.offset.relative.left	-											// Only for relative positioned nodes: Relative offset from element to offset parent
+				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
+				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+			)
+		};
+
+	},
+
+	_rearrange: function(event, i, a, hardRefresh) {
+
+		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
+
+		//Various things done here to improve the performance:
+		// 1. we create a setTimeout, that calls refreshPositions
+		// 2. on the instance, we have a counter variable, that get's higher after every append
+		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+		// 4. this lets only the last addition to the timeout stack through
+		this.counter = this.counter ? ++this.counter : 1;
+		var counter = this.counter;
+
+		this._delay(function() {
+			if(counter === this.counter) {
+				this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+			}
+		});
+
+	},
+
+	_clear: function(event, noPropagation) {
+
+		this.reverting = false;
+		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
+		// everything else normalized again
+		var i,
+			delayedTriggers = [];
+
+		// We first have to update the dom position of the actual currentItem
+		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+		if(!this._noFinalSort && this.currentItem.parent().length) {
+			this.placeholder.before(this.currentItem);
+		}
+		this._noFinalSort = null;
+
+		if(this.helper[0] === this.currentItem[0]) {
+			for(i in this._storedCSS) {
+				if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
+					this._storedCSS[i] = "";
+				}
+			}
+			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+		} else {
+			this.currentItem.show();
+		}
+
+		if(this.fromOutside && !noPropagation) {
+			delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+		}
+		if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
+			delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+		}
+
+		// Check if the items Container has Changed and trigger appropriate
+		// events.
+		if (this !== this.currentContainer) {
+			if(!noPropagation) {
+				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
+				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
+			}
+		}
+
+
+		//Post events to containers
+		function delayEvent( type, instance, container ) {
+			return function( event ) {
+				container._trigger( type, event, instance._uiHash( instance ) );
+			};
+		}
+		for (i = this.containers.length - 1; i >= 0; i--){
+			if (!noPropagation) {
+				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
+			}
+			if(this.containers[i].containerCache.over) {
+				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
+				this.containers[i].containerCache.over = 0;
+			}
+		}
+
+		//Do what was originally in plugins
+		if ( this.storedCursor ) {
+			this.document.find( "body" ).css( "cursor", this.storedCursor );
+			this.storedStylesheet.remove();
+		}
+		if(this._storedOpacity) {
+			this.helper.css("opacity", this._storedOpacity);
+		}
+		if(this._storedZIndex) {
+			this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
+		}
+
+		this.dragging = false;
+
+		if(!noPropagation) {
+			this._trigger("beforeStop", event, this._uiHash());
+		}
+
+		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+		if ( !this.cancelHelperRemoval ) {
+			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
+				this.helper.remove();
+			}
+			this.helper = null;
+		}
+
+		if(!noPropagation) {
+			for (i=0; i < delayedTriggers.length; i++) {
+				delayedTriggers[i].call(this, event);
+			} //Trigger all delayed events
+			this._trigger("stop", event, this._uiHash());
+		}
+
+		this.fromOutside = false;
+		return !this.cancelHelperRemoval;
+
+	},
+
+	_trigger: function() {
+		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+			this.cancel();
+		}
+	},
+
+	_uiHash: function(_inst) {
+		var inst = _inst || this;
+		return {
+			helper: inst.helper,
+			placeholder: inst.placeholder || $([]),
+			position: inst.position,
+			originalPosition: inst.originalPosition,
+			offset: inst.positionAbs,
+			item: inst.currentItem,
+			sender: _inst ? _inst.element : null
+		};
+	}
+
+});
+
+
+/*!
+ * jQuery UI Accordion 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/accordion/
+ */
+
+
+var accordion = $.widget( "ui.accordion", {
+	version: "1.11.4",
+	options: {
+		active: 0,
+		animate: {},
+		collapsible: false,
+		event: "click",
+		header: "> li > :first-child,> :not(li):even",
+		heightStyle: "auto",
+		icons: {
+			activeHeader: "ui-icon-triangle-1-s",
+			header: "ui-icon-triangle-1-e"
+		},
+
+		// callbacks
+		activate: null,
+		beforeActivate: null
+	},
+
+	hideProps: {
+		borderTopWidth: "hide",
+		borderBottomWidth: "hide",
+		paddingTop: "hide",
+		paddingBottom: "hide",
+		height: "hide"
+	},
+
+	showProps: {
+		borderTopWidth: "show",
+		borderBottomWidth: "show",
+		paddingTop: "show",
+		paddingBottom: "show",
+		height: "show"
+	},
+
+	_create: function() {
+		var options = this.options;
+		this.prevShow = this.prevHide = $();
+		this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
+			// ARIA
+			.attr( "role", "tablist" );
+
+		// don't allow collapsible: false and active: false / null
+		if ( !options.collapsible && (options.active === false || options.active == null) ) {
+			options.active = 0;
+		}
+
+		this._processPanels();
+		// handle negative values
+		if ( options.active < 0 ) {
+			options.active += this.headers.length;
+		}
+		this._refresh();
+	},
+
+	_getCreateEventData: function() {
+		return {
+			header: this.active,
+			panel: !this.active.length ? $() : this.active.next()
+		};
+	},
+
+	_createIcons: function() {
+		var icons = this.options.icons;
+		if ( icons ) {
+			$( "<span>" )
+				.addClass( "ui-accordion-header-icon ui-icon " + icons.header )
+				.prependTo( this.headers );
+			this.active.children( ".ui-accordion-header-icon" )
+				.removeClass( icons.header )
+				.addClass( icons.activeHeader );
+			this.headers.addClass( "ui-accordion-icons" );
+		}
+	},
+
+	_destroyIcons: function() {
+		this.headers
+			.removeClass( "ui-accordion-icons" )
+			.children( ".ui-accordion-header-icon" )
+				.remove();
+	},
+
+	_destroy: function() {
+		var contents;
+
+		// clean up main element
+		this.element
+			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
+			.removeAttr( "role" );
+
+		// clean up headers
+		this.headers
+			.removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " +
+				"ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-expanded" )
+			.removeAttr( "aria-selected" )
+			.removeAttr( "aria-controls" )
+			.removeAttr( "tabIndex" )
+			.removeUniqueId();
+
+		this._destroyIcons();
+
+		// clean up content panels
+		contents = this.headers.next()
+			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " +
+				"ui-accordion-content ui-accordion-content-active ui-state-disabled" )
+			.css( "display", "" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-hidden" )
+			.removeAttr( "aria-labelledby" )
+			.removeUniqueId();
+
+		if ( this.options.heightStyle !== "content" ) {
+			contents.css( "height", "" );
+		}
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "active" ) {
+			// _activate() will handle invalid values and update this.options
+			this._activate( value );
+			return;
+		}
+
+		if ( key === "event" ) {
+			if ( this.options.event ) {
+				this._off( this.headers, this.options.event );
+			}
+			this._setupEvents( value );
+		}
+
+		this._super( key, value );
+
+		// setting collapsible: false while collapsed; open first panel
+		if ( key === "collapsible" && !value && this.options.active === false ) {
+			this._activate( 0 );
+		}
+
+		if ( key === "icons" ) {
+			this._destroyIcons();
+			if ( value ) {
+				this._createIcons();
+			}
+		}
+
+		// #5332 - opacity doesn't cascade to positioned elements in IE
+		// so we need to add the disabled class to the headers and panels
+		if ( key === "disabled" ) {
+			this.element
+				.toggleClass( "ui-state-disabled", !!value )
+				.attr( "aria-disabled", value );
+			this.headers.add( this.headers.next() )
+				.toggleClass( "ui-state-disabled", !!value );
+		}
+	},
+
+	_keydown: function( event ) {
+		if ( event.altKey || event.ctrlKey ) {
+			return;
+		}
+
+		var keyCode = $.ui.keyCode,
+			length = this.headers.length,
+			currentIndex = this.headers.index( event.target ),
+			toFocus = false;
+
+		switch ( event.keyCode ) {
+			case keyCode.RIGHT:
+			case keyCode.DOWN:
+				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+				break;
+			case keyCode.LEFT:
+			case keyCode.UP:
+				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+				break;
+			case keyCode.SPACE:
+			case keyCode.ENTER:
+				this._eventHandler( event );
+				break;
+			case keyCode.HOME:
+				toFocus = this.headers[ 0 ];
+				break;
+			case keyCode.END:
+				toFocus = this.headers[ length - 1 ];
+				break;
+		}
+
+		if ( toFocus ) {
+			$( event.target ).attr( "tabIndex", -1 );
+			$( toFocus ).attr( "tabIndex", 0 );
+			toFocus.focus();
+			event.preventDefault();
+		}
+	},
+
+	_panelKeyDown: function( event ) {
+		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
+			$( event.currentTarget ).prev().focus();
+		}
+	},
+
+	refresh: function() {
+		var options = this.options;
+		this._processPanels();
+
+		// was collapsed or no panel
+		if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
+			options.active = false;
+			this.active = $();
+		// active false only when collapsible is true
+		} else if ( options.active === false ) {
+			this._activate( 0 );
+		// was active, but active panel is gone
+		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
+			// all remaining panel are disabled
+			if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
+				options.active = false;
+				this.active = $();
+			// activate previous panel
+			} else {
+				this._activate( Math.max( 0, options.active - 1 ) );
+			}
+		// was active, active panel still exists
+		} else {
+			// make sure active index is correct
+			options.active = this.headers.index( this.active );
+		}
+
+		this._destroyIcons();
+
+		this._refresh();
+	},
+
+	_processPanels: function() {
+		var prevHeaders = this.headers,
+			prevPanels = this.panels;
+
+		this.headers = this.element.find( this.options.header )
+			.addClass( "ui-accordion-header ui-state-default ui-corner-all" );
+
+		this.panels = this.headers.next()
+			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
+			.filter( ":not(.ui-accordion-content-active)" )
+			.hide();
+
+		// Avoid memory leaks (#10056)
+		if ( prevPanels ) {
+			this._off( prevHeaders.not( this.headers ) );
+			this._off( prevPanels.not( this.panels ) );
+		}
+	},
+
+	_refresh: function() {
+		var maxHeight,
+			options = this.options,
+			heightStyle = options.heightStyle,
+			parent = this.element.parent();
+
+		this.active = this._findActive( options.active )
+			.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
+			.removeClass( "ui-corner-all" );
+		this.active.next()
+			.addClass( "ui-accordion-content-active" )
+			.show();
+
+		this.headers
+			.attr( "role", "tab" )
+			.each(function() {
+				var header = $( this ),
+					headerId = header.uniqueId().attr( "id" ),
+					panel = header.next(),
+					panelId = panel.uniqueId().attr( "id" );
+				header.attr( "aria-controls", panelId );
+				panel.attr( "aria-labelledby", headerId );
+			})
+			.next()
+				.attr( "role", "tabpanel" );
+
+		this.headers
+			.not( this.active )
+			.attr({
+				"aria-selected": "false",
+				"aria-expanded": "false",
+				tabIndex: -1
+			})
+			.next()
+				.attr({
+					"aria-hidden": "true"
+				})
+				.hide();
+
+		// make sure at least one header is in the tab order
+		if ( !this.active.length ) {
+			this.headers.eq( 0 ).attr( "tabIndex", 0 );
+		} else {
+			this.active.attr({
+				"aria-selected": "true",
+				"aria-expanded": "true",
+				tabIndex: 0
+			})
+			.next()
+				.attr({
+					"aria-hidden": "false"
+				});
+		}
+
+		this._createIcons();
+
+		this._setupEvents( options.event );
+
+		if ( heightStyle === "fill" ) {
+			maxHeight = parent.height();
+			this.element.siblings( ":visible" ).each(function() {
+				var elem = $( this ),
+					position = elem.css( "position" );
+
+				if ( position === "absolute" || position === "fixed" ) {
+					return;
+				}
+				maxHeight -= elem.outerHeight( true );
+			});
+
+			this.headers.each(function() {
+				maxHeight -= $( this ).outerHeight( true );
+			});
+
+			this.headers.next()
+				.each(function() {
+					$( this ).height( Math.max( 0, maxHeight -
+						$( this ).innerHeight() + $( this ).height() ) );
+				})
+				.css( "overflow", "auto" );
+		} else if ( heightStyle === "auto" ) {
+			maxHeight = 0;
+			this.headers.next()
+				.each(function() {
+					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
+				})
+				.height( maxHeight );
+		}
+	},
+
+	_activate: function( index ) {
+		var active = this._findActive( index )[ 0 ];
+
+		// trying to activate the already active panel
+		if ( active === this.active[ 0 ] ) {
+			return;
+		}
+
+		// trying to collapse, simulate a click on the currently active header
+		active = active || this.active[ 0 ];
+
+		this._eventHandler({
+			target: active,
+			currentTarget: active,
+			preventDefault: $.noop
+		});
+	},
+
+	_findActive: function( selector ) {
+		return typeof selector === "number" ? this.headers.eq( selector ) : $();
+	},
+
+	_setupEvents: function( event ) {
+		var events = {
+			keydown: "_keydown"
+		};
+		if ( event ) {
+			$.each( event.split( " " ), function( index, eventName ) {
+				events[ eventName ] = "_eventHandler";
+			});
+		}
+
+		this._off( this.headers.add( this.headers.next() ) );
+		this._on( this.headers, events );
+		this._on( this.headers.next(), { keydown: "_panelKeyDown" });
+		this._hoverable( this.headers );
+		this._focusable( this.headers );
+	},
+
+	_eventHandler: function( event ) {
+		var options = this.options,
+			active = this.active,
+			clicked = $( event.currentTarget ),
+			clickedIsActive = clicked[ 0 ] === active[ 0 ],
+			collapsing = clickedIsActive && options.collapsible,
+			toShow = collapsing ? $() : clicked.next(),
+			toHide = active.next(),
+			eventData = {
+				oldHeader: active,
+				oldPanel: toHide,
+				newHeader: collapsing ? $() : clicked,
+				newPanel: toShow
+			};
+
+		event.preventDefault();
+
+		if (
+				// click on active header, but not collapsible
+				( clickedIsActive && !options.collapsible ) ||
+				// allow canceling activation
+				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+			return;
+		}
+
+		options.active = collapsing ? false : this.headers.index( clicked );
+
+		// when the call to ._toggle() comes after the class changes
+		// it causes a very odd bug in IE 8 (see #6720)
+		this.active = clickedIsActive ? $() : clicked;
+		this._toggle( eventData );
+
+		// switch classes
+		// corner classes on the previously active header stay after the animation
+		active.removeClass( "ui-accordion-header-active ui-state-active" );
+		if ( options.icons ) {
+			active.children( ".ui-accordion-header-icon" )
+				.removeClass( options.icons.activeHeader )
+				.addClass( options.icons.header );
+		}
+
+		if ( !clickedIsActive ) {
+			clicked
+				.removeClass( "ui-corner-all" )
+				.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
+			if ( options.icons ) {
+				clicked.children( ".ui-accordion-header-icon" )
+					.removeClass( options.icons.header )
+					.addClass( options.icons.activeHeader );
+			}
+
+			clicked
+				.next()
+				.addClass( "ui-accordion-content-active" );
+		}
+	},
+
+	_toggle: function( data ) {
+		var toShow = data.newPanel,
+			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
+
+		// handle activating a panel during the animation for another activation
+		this.prevShow.add( this.prevHide ).stop( true, true );
+		this.prevShow = toShow;
+		this.prevHide = toHide;
+
+		if ( this.options.animate ) {
+			this._animate( toShow, toHide, data );
+		} else {
+			toHide.hide();
+			toShow.show();
+			this._toggleComplete( data );
+		}
+
+		toHide.attr({
+			"aria-hidden": "true"
+		});
+		toHide.prev().attr({
+			"aria-selected": "false",
+			"aria-expanded": "false"
+		});
+		// if we're switching panels, remove the old header from the tab order
+		// if we're opening from collapsed state, remove the previous header from the tab order
+		// if we're collapsing, then keep the collapsing header in the tab order
+		if ( toShow.length && toHide.length ) {
+			toHide.prev().attr({
+				"tabIndex": -1,
+				"aria-expanded": "false"
+			});
+		} else if ( toShow.length ) {
+			this.headers.filter(function() {
+				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
+			})
+			.attr( "tabIndex", -1 );
+		}
+
+		toShow
+			.attr( "aria-hidden", "false" )
+			.prev()
+				.attr({
+					"aria-selected": "true",
+					"aria-expanded": "true",
+					tabIndex: 0
+				});
+	},
+
+	_animate: function( toShow, toHide, data ) {
+		var total, easing, duration,
+			that = this,
+			adjust = 0,
+			boxSizing = toShow.css( "box-sizing" ),
+			down = toShow.length &&
+				( !toHide.length || ( toShow.index() < toHide.index() ) ),
+			animate = this.options.animate || {},
+			options = down && animate.down || animate,
+			complete = function() {
+				that._toggleComplete( data );
+			};
+
+		if ( typeof options === "number" ) {
+			duration = options;
+		}
+		if ( typeof options === "string" ) {
+			easing = options;
+		}
+		// fall back from options to animation in case of partial down settings
+		easing = easing || options.easing || animate.easing;
+		duration = duration || options.duration || animate.duration;
+
+		if ( !toHide.length ) {
+			return toShow.animate( this.showProps, duration, easing, complete );
+		}
+		if ( !toShow.length ) {
+			return toHide.animate( this.hideProps, duration, easing, complete );
+		}
+
+		total = toShow.show().outerHeight();
+		toHide.animate( this.hideProps, {
+			duration: duration,
+			easing: easing,
+			step: function( now, fx ) {
+				fx.now = Math.round( now );
+			}
+		});
+		toShow
+			.hide()
+			.animate( this.showProps, {
+				duration: duration,
+				easing: easing,
+				complete: complete,
+				step: function( now, fx ) {
+					fx.now = Math.round( now );
+					if ( fx.prop !== "height" ) {
+						if ( boxSizing === "content-box" ) {
+							adjust += fx.now;
+						}
+					} else if ( that.options.heightStyle !== "content" ) {
+						fx.now = Math.round( total - toHide.outerHeight() - adjust );
+						adjust = 0;
+					}
+				}
+			});
+	},
+
+	_toggleComplete: function( data ) {
+		var toHide = data.oldPanel;
+
+		toHide
+			.removeClass( "ui-accordion-content-active" )
+			.prev()
+				.removeClass( "ui-corner-top" )
+				.addClass( "ui-corner-all" );
+
+		// Work around for rendering bug in IE (#5421)
+		if ( toHide.length ) {
+			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
+		}
+		this._trigger( "activate", null, data );
+	}
+});
+
+
+/*!
+ * jQuery UI Menu 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/menu/
+ */
+
+
+var menu = $.widget( "ui.menu", {
+	version: "1.11.4",
+	defaultElement: "<ul>",
+	delay: 300,
+	options: {
+		icons: {
+			submenu: "ui-icon-carat-1-e"
+		},
+		items: "> *",
+		menus: "ul",
+		position: {
+			my: "left-1 top",
+			at: "right top"
+		},
+		role: "menu",
+
+		// callbacks
+		blur: null,
+		focus: null,
+		select: null
+	},
+
+	_create: function() {
+		this.activeMenu = this.element;
+
+		// Flag used to prevent firing of the click handler
+		// as the event bubbles up through nested menus
+		this.mouseHandled = false;
+		this.element
+			.uniqueId()
+			.addClass( "ui-menu ui-widget ui-widget-content" )
+			.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
+			.attr({
+				role: this.options.role,
+				tabIndex: 0
+			});
+
+		if ( this.options.disabled ) {
+			this.element
+				.addClass( "ui-state-disabled" )
+				.attr( "aria-disabled", "true" );
+		}
+
+		this._on({
+			// Prevent focus from sticking to links inside menu after clicking
+			// them (focus should always stay on UL during navigation).
+			"mousedown .ui-menu-item": function( event ) {
+				event.preventDefault();
+			},
+			"click .ui-menu-item": function( event ) {
+				var target = $( event.target );
+				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
+					this.select( event );
+
+					// Only set the mouseHandled flag if the event will bubble, see #9469.
+					if ( !event.isPropagationStopped() ) {
+						this.mouseHandled = true;
+					}
+
+					// Open submenu on click
+					if ( target.has( ".ui-menu" ).length ) {
+						this.expand( event );
+					} else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
+
+						// Redirect focus to the menu
+						this.element.trigger( "focus", [ true ] );
+
+						// If the active item is on the top level, let it stay active.
+						// Otherwise, blur the active item since it is no longer visible.
+						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
+							clearTimeout( this.timer );
+						}
+					}
+				}
+			},
+			"mouseenter .ui-menu-item": function( event ) {
+				// Ignore mouse events while typeahead is active, see #10458.
+				// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
+				// is over an item in the menu
+				if ( this.previousFilter ) {
+					return;
+				}
+				var target = $( event.currentTarget );
+				// Remove ui-state-active class from siblings of the newly focused menu item
+				// to avoid a jump caused by adjacent elements both having a class with a border
+				target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" );
+				this.focus( event, target );
+			},
+			mouseleave: "collapseAll",
+			"mouseleave .ui-menu": "collapseAll",
+			focus: function( event, keepActiveItem ) {
+				// If there's already an active item, keep it active
+				// If not, activate the first item
+				var item = this.active || this.element.find( this.options.items ).eq( 0 );
+
+				if ( !keepActiveItem ) {
+					this.focus( event, item );
+				}
+			},
+			blur: function( event ) {
+				this._delay(function() {
+					if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
+						this.collapseAll( event );
+					}
+				});
+			},
+			keydown: "_keydown"
+		});
+
+		this.refresh();
+
+		// Clicks outside of a menu collapse any open menus
+		this._on( this.document, {
+			click: function( event ) {
+				if ( this._closeOnDocumentClick( event ) ) {
+					this.collapseAll( event );
+				}
+
+				// Reset the mouseHandled flag
+				this.mouseHandled = false;
+			}
+		});
+	},
+
+	_destroy: function() {
+		// Destroy (sub)menus
+		this.element
+			.removeAttr( "aria-activedescendant" )
+			.find( ".ui-menu" ).addBack()
+				.removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
+				.removeAttr( "role" )
+				.removeAttr( "tabIndex" )
+				.removeAttr( "aria-labelledby" )
+				.removeAttr( "aria-expanded" )
+				.removeAttr( "aria-hidden" )
+				.removeAttr( "aria-disabled" )
+				.removeUniqueId()
+				.show();
+
+		// Destroy menu items
+		this.element.find( ".ui-menu-item" )
+			.removeClass( "ui-menu-item" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-disabled" )
+			.removeUniqueId()
+			.removeClass( "ui-state-hover" )
+			.removeAttr( "tabIndex" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-haspopup" )
+			.children().each( function() {
+				var elem = $( this );
+				if ( elem.data( "ui-menu-submenu-carat" ) ) {
+					elem.remove();
+				}
+			});
+
+		// Destroy menu dividers
+		this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
+	},
+
+	_keydown: function( event ) {
+		var match, prev, character, skip,
+			preventDefault = true;
+
+		switch ( event.keyCode ) {
+		case $.ui.keyCode.PAGE_UP:
+			this.previousPage( event );
+			break;
+		case $.ui.keyCode.PAGE_DOWN:
+			this.nextPage( event );
+			break;
+		case $.ui.keyCode.HOME:
+			this._move( "first", "first", event );
+			break;
+		case $.ui.keyCode.END:
+			this._move( "last", "last", event );
+			break;
+		case $.ui.keyCode.UP:
+			this.previous( event );
+			break;
+		case $.ui.keyCode.DOWN:
+			this.next( event );
+			break;
+		case $.ui.keyCode.LEFT:
+			this.collapse( event );
+			break;
+		case $.ui.keyCode.RIGHT:
+			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
+				this.expand( event );
+			}
+			break;
+		case $.ui.keyCode.ENTER:
+		case $.ui.keyCode.SPACE:
+			this._activate( event );
+			break;
+		case $.ui.keyCode.ESCAPE:
+			this.collapse( event );
+			break;
+		default:
+			preventDefault = false;
+			prev = this.previousFilter || "";
+			character = String.fromCharCode( event.keyCode );
+			skip = false;
+
+			clearTimeout( this.filterTimer );
+
+			if ( character === prev ) {
+				skip = true;
+			} else {
+				character = prev + character;
+			}
+
+			match = this._filterMenuItems( character );
+			match = skip && match.index( this.active.next() ) !== -1 ?
+				this.active.nextAll( ".ui-menu-item" ) :
+				match;
+
+			// If no matches on the current filter, reset to the last character pressed
+			// to move down the menu to the first item that starts with that character
+			if ( !match.length ) {
+				character = String.fromCharCode( event.keyCode );
+				match = this._filterMenuItems( character );
+			}
+
+			if ( match.length ) {
+				this.focus( event, match );
+				this.previousFilter = character;
+				this.filterTimer = this._delay(function() {
+					delete this.previousFilter;
+				}, 1000 );
+			} else {
+				delete this.previousFilter;
+			}
+		}
+
+		if ( preventDefault ) {
+			event.preventDefault();
+		}
+	},
+
+	_activate: function( event ) {
+		if ( !this.active.is( ".ui-state-disabled" ) ) {
+			if ( this.active.is( "[aria-haspopup='true']" ) ) {
+				this.expand( event );
+			} else {
+				this.select( event );
+			}
+		}
+	},
+
+	refresh: function() {
+		var menus, items,
+			that = this,
+			icon = this.options.icons.submenu,
+			submenus = this.element.find( this.options.menus );
+
+		this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
+
+		// Initialize nested menus
+		submenus.filter( ":not(.ui-menu)" )
+			.addClass( "ui-menu ui-widget ui-widget-content ui-front" )
+			.hide()
+			.attr({
+				role: this.options.role,
+				"aria-hidden": "true",
+				"aria-expanded": "false"
+			})
+			.each(function() {
+				var menu = $( this ),
+					item = menu.parent(),
+					submenuCarat = $( "<span>" )
+						.addClass( "ui-menu-icon ui-icon " + icon )
+						.data( "ui-menu-submenu-carat", true );
+
+				item
+					.attr( "aria-haspopup", "true" )
+					.prepend( submenuCarat );
+				menu.attr( "aria-labelledby", item.attr( "id" ) );
+			});
+
+		menus = submenus.add( this.element );
+		items = menus.find( this.options.items );
+
+		// Initialize menu-items containing spaces and/or dashes only as dividers
+		items.not( ".ui-menu-item" ).each(function() {
+			var item = $( this );
+			if ( that._isDivider( item ) ) {
+				item.addClass( "ui-widget-content ui-menu-divider" );
+			}
+		});
+
+		// Don't refresh list items that are already adapted
+		items.not( ".ui-menu-item, .ui-menu-divider" )
+			.addClass( "ui-menu-item" )
+			.uniqueId()
+			.attr({
+				tabIndex: -1,
+				role: this._itemRole()
+			});
+
+		// Add aria-disabled attribute to any disabled menu item
+		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
+
+		// If the active item has been removed, blur the menu
+		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
+			this.blur();
+		}
+	},
+
+	_itemRole: function() {
+		return {
+			menu: "menuitem",
+			listbox: "option"
+		}[ this.options.role ];
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "icons" ) {
+			this.element.find( ".ui-menu-icon" )
+				.removeClass( this.options.icons.submenu )
+				.addClass( value.submenu );
+		}
+		if ( key === "disabled" ) {
+			this.element
+				.toggleClass( "ui-state-disabled", !!value )
+				.attr( "aria-disabled", value );
+		}
+		this._super( key, value );
+	},
+
+	focus: function( event, item ) {
+		var nested, focused;
+		this.blur( event, event && event.type === "focus" );
+
+		this._scrollIntoView( item );
+
+		this.active = item.first();
+		focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" );
+		// Only update aria-activedescendant if there's a role
+		// otherwise we assume focus is managed elsewhere
+		if ( this.options.role ) {
+			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
+		}
+
+		// Highlight active parent menu item, if any
+		this.active
+			.parent()
+			.closest( ".ui-menu-item" )
+			.addClass( "ui-state-active" );
+
+		if ( event && event.type === "keydown" ) {
+			this._close();
+		} else {
+			this.timer = this._delay(function() {
+				this._close();
+			}, this.delay );
+		}
+
+		nested = item.children( ".ui-menu" );
+		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
+			this._startOpening(nested);
+		}
+		this.activeMenu = item.parent();
+
+		this._trigger( "focus", event, { item: item } );
+	},
+
+	_scrollIntoView: function( item ) {
+		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+		if ( this._hasScroll() ) {
+			borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
+			paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
+			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+			scroll = this.activeMenu.scrollTop();
+			elementHeight = this.activeMenu.height();
+			itemHeight = item.outerHeight();
+
+			if ( offset < 0 ) {
+				this.activeMenu.scrollTop( scroll + offset );
+			} else if ( offset + itemHeight > elementHeight ) {
+				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+			}
+		}
+	},
+
+	blur: function( event, fromFocus ) {
+		if ( !fromFocus ) {
+			clearTimeout( this.timer );
+		}
+
+		if ( !this.active ) {
+			return;
+		}
+
+		this.active.removeClass( "ui-state-focus" );
+		this.active = null;
+
+		this._trigger( "blur", event, { item: this.active } );
+	},
+
+	_startOpening: function( submenu ) {
+		clearTimeout( this.timer );
+
+		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
+		// shift in the submenu position when mousing over the carat icon
+		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
+			return;
+		}
+
+		this.timer = this._delay(function() {
+			this._close();
+			this._open( submenu );
+		}, this.delay );
+	},
+
+	_open: function( submenu ) {
+		var position = $.extend({
+			of: this.active
+		}, this.options.position );
+
+		clearTimeout( this.timer );
+		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
+			.hide()
+			.attr( "aria-hidden", "true" );
+
+		submenu
+			.show()
+			.removeAttr( "aria-hidden" )
+			.attr( "aria-expanded", "true" )
+			.position( position );
+	},
+
+	collapseAll: function( event, all ) {
+		clearTimeout( this.timer );
+		this.timer = this._delay(function() {
+			// If we were passed an event, look for the submenu that contains the event
+			var currentMenu = all ? this.element :
+				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
+
+			// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
+			if ( !currentMenu.length ) {
+				currentMenu = this.element;
+			}
+
+			this._close( currentMenu );
+
+			this.blur( event );
+			this.activeMenu = currentMenu;
+		}, this.delay );
+	},
+
+	// With no arguments, closes the currently active menu - if nothing is active
+	// it closes all menus.  If passed an argument, it will search for menus BELOW
+	_close: function( startMenu ) {
+		if ( !startMenu ) {
+			startMenu = this.active ? this.active.parent() : this.element;
+		}
+
+		startMenu
+			.find( ".ui-menu" )
+				.hide()
+				.attr( "aria-hidden", "true" )
+				.attr( "aria-expanded", "false" )
+			.end()
+			.find( ".ui-state-active" ).not( ".ui-state-focus" )
+				.removeClass( "ui-state-active" );
+	},
+
+	_closeOnDocumentClick: function( event ) {
+		return !$( event.target ).closest( ".ui-menu" ).length;
+	},
+
+	_isDivider: function( item ) {
+
+		// Match hyphen, em dash, en dash
+		return !/[^\-\u2014\u2013\s]/.test( item.text() );
+	},
+
+	collapse: function( event ) {
+		var newItem = this.active &&
+			this.active.parent().closest( ".ui-menu-item", this.element );
+		if ( newItem && newItem.length ) {
+			this._close();
+			this.focus( event, newItem );
+		}
+	},
+
+	expand: function( event ) {
+		var newItem = this.active &&
+			this.active
+				.children( ".ui-menu " )
+				.find( this.options.items )
+				.first();
+
+		if ( newItem && newItem.length ) {
+			this._open( newItem.parent() );
+
+			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
+			this._delay(function() {
+				this.focus( event, newItem );
+			});
+		}
+	},
+
+	next: function( event ) {
+		this._move( "next", "first", event );
+	},
+
+	previous: function( event ) {
+		this._move( "prev", "last", event );
+	},
+
+	isFirstItem: function() {
+		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
+	},
+
+	isLastItem: function() {
+		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
+	},
+
+	_move: function( direction, filter, event ) {
+		var next;
+		if ( this.active ) {
+			if ( direction === "first" || direction === "last" ) {
+				next = this.active
+					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
+					.eq( -1 );
+			} else {
+				next = this.active
+					[ direction + "All" ]( ".ui-menu-item" )
+					.eq( 0 );
+			}
+		}
+		if ( !next || !next.length || !this.active ) {
+			next = this.activeMenu.find( this.options.items )[ filter ]();
+		}
+
+		this.focus( event, next );
+	},
+
+	nextPage: function( event ) {
+		var item, base, height;
+
+		if ( !this.active ) {
+			this.next( event );
+			return;
+		}
+		if ( this.isLastItem() ) {
+			return;
+		}
+		if ( this._hasScroll() ) {
+			base = this.active.offset().top;
+			height = this.element.height();
+			this.active.nextAll( ".ui-menu-item" ).each(function() {
+				item = $( this );
+				return item.offset().top - base - height < 0;
+			});
+
+			this.focus( event, item );
+		} else {
+			this.focus( event, this.activeMenu.find( this.options.items )
+				[ !this.active ? "first" : "last" ]() );
+		}
+	},
+
+	previousPage: function( event ) {
+		var item, base, height;
+		if ( !this.active ) {
+			this.next( event );
+			return;
+		}
+		if ( this.isFirstItem() ) {
+			return;
+		}
+		if ( this._hasScroll() ) {
+			base = this.active.offset().top;
+			height = this.element.height();
+			this.active.prevAll( ".ui-menu-item" ).each(function() {
+				item = $( this );
+				return item.offset().top - base + height > 0;
+			});
+
+			this.focus( event, item );
+		} else {
+			this.focus( event, this.activeMenu.find( this.options.items ).first() );
+		}
+	},
+
+	_hasScroll: function() {
+		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
+	},
+
+	select: function( event ) {
+		// TODO: It should never be possible to not have an active item at this
+		// point, but the tests don't trigger mouseenter before click.
+		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
+		var ui = { item: this.active };
+		if ( !this.active.has( ".ui-menu" ).length ) {
+			this.collapseAll( event, true );
+		}
+		this._trigger( "select", event, ui );
+	},
+
+	_filterMenuItems: function(character) {
+		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
+			regex = new RegExp( "^" + escapedCharacter, "i" );
+
+		return this.activeMenu
+			.find( this.options.items )
+
+			// Only match on items, not dividers or other content (#10571)
+			.filter( ".ui-menu-item" )
+			.filter(function() {
+				return regex.test( $.trim( $( this ).text() ) );
+			});
+	}
+});
+
+
+/*!
+ * jQuery UI Autocomplete 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/autocomplete/
+ */
+
+
+$.widget( "ui.autocomplete", {
+	version: "1.11.4",
+	defaultElement: "<input>",
+	options: {
+		appendTo: null,
+		autoFocus: false,
+		delay: 300,
+		minLength: 1,
+		position: {
+			my: "left top",
+			at: "left bottom",
+			collision: "none"
+		},
+		source: null,
+
+		// callbacks
+		change: null,
+		close: null,
+		focus: null,
+		open: null,
+		response: null,
+		search: null,
+		select: null
+	},
+
+	requestIndex: 0,
+	pending: 0,
+
+	_create: function() {
+		// Some browsers only repeat keydown events, not keypress events,
+		// so we use the suppressKeyPress flag to determine if we've already
+		// handled the keydown event. #7269
+		// Unfortunately the code for & in keypress is the same as the up arrow,
+		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
+		// events when we know the keydown event was used to modify the
+		// search term. #7799
+		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
+			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
+			isTextarea = nodeName === "textarea",
+			isInput = nodeName === "input";
+
+		this.isMultiLine =
+			// Textareas are always multi-line
+			isTextarea ? true :
+			// Inputs are always single-line, even if inside a contentEditable element
+			// IE also treats inputs as contentEditable
+			isInput ? false :
+			// All other element types are determined by whether or not they're contentEditable
+			this.element.prop( "isContentEditable" );
+
+		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
+		this.isNewMenu = true;
+
+		this.element
+			.addClass( "ui-autocomplete-input" )
+			.attr( "autocomplete", "off" );
+
+		this._on( this.element, {
+			keydown: function( event ) {
+				if ( this.element.prop( "readOnly" ) ) {
+					suppressKeyPress = true;
+					suppressInput = true;
+					suppressKeyPressRepeat = true;
+					return;
+				}
+
+				suppressKeyPress = false;
+				suppressInput = false;
+				suppressKeyPressRepeat = false;
+				var keyCode = $.ui.keyCode;
+				switch ( event.keyCode ) {
+				case keyCode.PAGE_UP:
+					suppressKeyPress = true;
+					this._move( "previousPage", event );
+					break;
+				case keyCode.PAGE_DOWN:
+					suppressKeyPress = true;
+					this._move( "nextPage", event );
+					break;
+				case keyCode.UP:
+					suppressKeyPress = true;
+					this._keyEvent( "previous", event );
+					break;
+				case keyCode.DOWN:
+					suppressKeyPress = true;
+					this._keyEvent( "next", event );
+					break;
+				case keyCode.ENTER:
+					// when menu is open and has focus
+					if ( this.menu.active ) {
+						// #6055 - Opera still allows the keypress to occur
+						// which causes forms to submit
+						suppressKeyPress = true;
+						event.preventDefault();
+						this.menu.select( event );
+					}
+					break;
+				case keyCode.TAB:
+					if ( this.menu.active ) {
+						this.menu.select( event );
+					}
+					break;
+				case keyCode.ESCAPE:
+					if ( this.menu.element.is( ":visible" ) ) {
+						if ( !this.isMultiLine ) {
+							this._value( this.term );
+						}
+						this.close( event );
+						// Different browsers have different default behavior for escape
+						// Single press can mean undo or clear
+						// Double press in IE means clear the whole form
+						event.preventDefault();
+					}
+					break;
+				default:
+					suppressKeyPressRepeat = true;
+					// search timeout should be triggered before the input value is changed
+					this._searchTimeout( event );
+					break;
+				}
+			},
+			keypress: function( event ) {
+				if ( suppressKeyPress ) {
+					suppressKeyPress = false;
+					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+						event.preventDefault();
+					}
+					return;
+				}
+				if ( suppressKeyPressRepeat ) {
+					return;
+				}
+
+				// replicate some key handlers to allow them to repeat in Firefox and Opera
+				var keyCode = $.ui.keyCode;
+				switch ( event.keyCode ) {
+				case keyCode.PAGE_UP:
+					this._move( "previousPage", event );
+					break;
+				case keyCode.PAGE_DOWN:
+					this._move( "nextPage", event );
+					break;
+				case keyCode.UP:
+					this._keyEvent( "previous", event );
+					break;
+				case keyCode.DOWN:
+					this._keyEvent( "next", event );
+					break;
+				}
+			},
+			input: function( event ) {
+				if ( suppressInput ) {
+					suppressInput = false;
+					event.preventDefault();
+					return;
+				}
+				this._searchTimeout( event );
+			},
+			focus: function() {
+				this.selectedItem = null;
+				this.previous = this._value();
+			},
+			blur: function( event ) {
+				if ( this.cancelBlur ) {
+					delete this.cancelBlur;
+					return;
+				}
+
+				clearTimeout( this.searching );
+				this.close( event );
+				this._change( event );
+			}
+		});
+
+		this._initSource();
+		this.menu = $( "<ul>" )
+			.addClass( "ui-autocomplete ui-front" )
+			.appendTo( this._appendTo() )
+			.menu({
+				// disable ARIA support, the live region takes care of that
+				role: null
+			})
+			.hide()
+			.menu( "instance" );
+
+		this._on( this.menu.element, {
+			mousedown: function( event ) {
+				// prevent moving focus out of the text field
+				event.preventDefault();
+
+				// IE doesn't prevent moving focus even with event.preventDefault()
+				// so we set a flag to know when we should ignore the blur event
+				this.cancelBlur = true;
+				this._delay(function() {
+					delete this.cancelBlur;
+				});
+
+				// clicking on the scrollbar causes focus to shift to the body
+				// but we can't detect a mouseup or a click immediately afterward
+				// so we have to track the next mousedown and close the menu if
+				// the user clicks somewhere outside of the autocomplete
+				var menuElement = this.menu.element[ 0 ];
+				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+					this._delay(function() {
+						var that = this;
+						this.document.one( "mousedown", function( event ) {
+							if ( event.target !== that.element[ 0 ] &&
+									event.target !== menuElement &&
+									!$.contains( menuElement, event.target ) ) {
+								that.close();
+							}
+						});
+					});
+				}
+			},
+			menufocus: function( event, ui ) {
+				var label, item;
+				// support: Firefox
+				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
+				if ( this.isNewMenu ) {
+					this.isNewMenu = false;
+					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
+						this.menu.blur();
+
+						this.document.one( "mousemove", function() {
+							$( event.target ).trigger( event.originalEvent );
+						});
+
+						return;
+					}
+				}
+
+				item = ui.item.data( "ui-autocomplete-item" );
+				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
+					// use value to match what will end up in the input, if it was a key event
+					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
+						this._value( item.value );
+					}
+				}
+
+				// Announce the value in the liveRegion
+				label = ui.item.attr( "aria-label" ) || item.value;
+				if ( label && $.trim( label ).length ) {
+					this.liveRegion.children().hide();
+					$( "<div>" ).text( label ).appendTo( this.liveRegion );
+				}
+			},
+			menuselect: function( event, ui ) {
+				var item = ui.item.data( "ui-autocomplete-item" ),
+					previous = this.previous;
+
+				// only trigger when focus was lost (click on menu)
+				if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
+					this.element.focus();
+					this.previous = previous;
+					// #6109 - IE triggers two focus events and the second
+					// is asynchronous, so we need to reset the previous
+					// term synchronously and asynchronously :-(
+					this._delay(function() {
+						this.previous = previous;
+						this.selectedItem = item;
+					});
+				}
+
+				if ( false !== this._trigger( "select", event, { item: item } ) ) {
+					this._value( item.value );
+				}
+				// reset the term after the select event
+				// this allows custom select handling to work properly
+				this.term = this._value();
+
+				this.close( event );
+				this.selectedItem = item;
+			}
+		});
+
+		this.liveRegion = $( "<span>", {
+				role: "status",
+				"aria-live": "assertive",
+				"aria-relevant": "additions"
+			})
+			.addClass( "ui-helper-hidden-accessible" )
+			.appendTo( this.document[ 0 ].body );
+
+		// turning off autocomplete prevents the browser from remembering the
+		// value when navigating through history, so we re-enable autocomplete
+		// if the page is unloaded before the widget is destroyed. #7790
+		this._on( this.window, {
+			beforeunload: function() {
+				this.element.removeAttr( "autocomplete" );
+			}
+		});
+	},
+
+	_destroy: function() {
+		clearTimeout( this.searching );
+		this.element
+			.removeClass( "ui-autocomplete-input" )
+			.removeAttr( "autocomplete" );
+		this.menu.element.remove();
+		this.liveRegion.remove();
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+		if ( key === "source" ) {
+			this._initSource();
+		}
+		if ( key === "appendTo" ) {
+			this.menu.element.appendTo( this._appendTo() );
+		}
+		if ( key === "disabled" && value && this.xhr ) {
+			this.xhr.abort();
+		}
+	},
+
+	_appendTo: function() {
+		var element = this.options.appendTo;
+
+		if ( element ) {
+			element = element.jquery || element.nodeType ?
+				$( element ) :
+				this.document.find( element ).eq( 0 );
+		}
+
+		if ( !element || !element[ 0 ] ) {
+			element = this.element.closest( ".ui-front" );
+		}
+
+		if ( !element.length ) {
+			element = this.document[ 0 ].body;
+		}
+
+		return element;
+	},
+
+	_initSource: function() {
+		var array, url,
+			that = this;
+		if ( $.isArray( this.options.source ) ) {
+			array = this.options.source;
+			this.source = function( request, response ) {
+				response( $.ui.autocomplete.filter( array, request.term ) );
+			};
+		} else if ( typeof this.options.source === "string" ) {
+			url = this.options.source;
+			this.source = function( request, response ) {
+				if ( that.xhr ) {
+					that.xhr.abort();
+				}
+				that.xhr = $.ajax({
+					url: url,
+					data: request,
+					dataType: "json",
+					success: function( data ) {
+						response( data );
+					},
+					error: function() {
+						response([]);
+					}
+				});
+			};
+		} else {
+			this.source = this.options.source;
+		}
+	},
+
+	_searchTimeout: function( event ) {
+		clearTimeout( this.searching );
+		this.searching = this._delay(function() {
+
+			// Search if the value has changed, or if the user retypes the same value (see #7434)
+			var equalValues = this.term === this._value(),
+				menuVisible = this.menu.element.is( ":visible" ),
+				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
+
+			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
+				this.selectedItem = null;
+				this.search( null, event );
+			}
+		}, this.options.delay );
+	},
+
+	search: function( value, event ) {
+		value = value != null ? value : this._value();
+
+		// always save the actual value, not the one passed as an argument
+		this.term = this._value();
+
+		if ( value.length < this.options.minLength ) {
+			return this.close( event );
+		}
+
+		if ( this._trigger( "search", event ) === false ) {
+			return;
+		}
+
+		return this._search( value );
+	},
+
+	_search: function( value ) {
+		this.pending++;
+		this.element.addClass( "ui-autocomplete-loading" );
+		this.cancelSearch = false;
+
+		this.source( { term: value }, this._response() );
+	},
+
+	_response: function() {
+		var index = ++this.requestIndex;
+
+		return $.proxy(function( content ) {
+			if ( index === this.requestIndex ) {
+				this.__response( content );
+			}
+
+			this.pending--;
+			if ( !this.pending ) {
+				this.element.removeClass( "ui-autocomplete-loading" );
+			}
+		}, this );
+	},
+
+	__response: function( content ) {
+		if ( content ) {
+			content = this._normalize( content );
+		}
+		this._trigger( "response", null, { content: content } );
+		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
+			this._suggest( content );
+			this._trigger( "open" );
+		} else {
+			// use ._close() instead of .close() so we don't cancel future searches
+			this._close();
+		}
+	},
+
+	close: function( event ) {
+		this.cancelSearch = true;
+		this._close( event );
+	},
+
+	_close: function( event ) {
+		if ( this.menu.element.is( ":visible" ) ) {
+			this.menu.element.hide();
+			this.menu.blur();
+			this.isNewMenu = true;
+			this._trigger( "close", event );
+		}
+	},
+
+	_change: function( event ) {
+		if ( this.previous !== this._value() ) {
+			this._trigger( "change", event, { item: this.selectedItem } );
+		}
+	},
+
+	_normalize: function( items ) {
+		// assume all items have the right format when the first item is complete
+		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
+			return items;
+		}
+		return $.map( items, function( item ) {
+			if ( typeof item === "string" ) {
+				return {
+					label: item,
+					value: item
+				};
+			}
+			return $.extend( {}, item, {
+				label: item.label || item.value,
+				value: item.value || item.label
+			});
+		});
+	},
+
+	_suggest: function( items ) {
+		var ul = this.menu.element.empty();
+		this._renderMenu( ul, items );
+		this.isNewMenu = true;
+		this.menu.refresh();
+
+		// size and position menu
+		ul.show();
+		this._resizeMenu();
+		ul.position( $.extend({
+			of: this.element
+		}, this.options.position ) );
+
+		if ( this.options.autoFocus ) {
+			this.menu.next();
+		}
+	},
+
+	_resizeMenu: function() {
+		var ul = this.menu.element;
+		ul.outerWidth( Math.max(
+			// Firefox wraps long text (possibly a rounding bug)
+			// so we add 1px to avoid the wrapping (#7513)
+			ul.width( "" ).outerWidth() + 1,
+			this.element.outerWidth()
+		) );
+	},
+
+	_renderMenu: function( ul, items ) {
+		var that = this;
+		$.each( items, function( index, item ) {
+			that._renderItemData( ul, item );
+		});
+	},
+
+	_renderItemData: function( ul, item ) {
+		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
+	},
+
+	_renderItem: function( ul, item ) {
+		return $( "<li>" ).text( item.label ).appendTo( ul );
+	},
+
+	_move: function( direction, event ) {
+		if ( !this.menu.element.is( ":visible" ) ) {
+			this.search( null, event );
+			return;
+		}
+		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
+				this.menu.isLastItem() && /^next/.test( direction ) ) {
+
+			if ( !this.isMultiLine ) {
+				this._value( this.term );
+			}
+
+			this.menu.blur();
+			return;
+		}
+		this.menu[ direction ]( event );
+	},
+
+	widget: function() {
+		return this.menu.element;
+	},
+
+	_value: function() {
+		return this.valueMethod.apply( this.element, arguments );
+	},
+
+	_keyEvent: function( keyEvent, event ) {
+		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+			this._move( keyEvent, event );
+
+			// prevents moving cursor to beginning/end of the text field in some browsers
+			event.preventDefault();
+		}
+	}
+});
+
+$.extend( $.ui.autocomplete, {
+	escapeRegex: function( value ) {
+		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
+	},
+	filter: function( array, term ) {
+		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
+		return $.grep( array, function( value ) {
+			return matcher.test( value.label || value.value || value );
+		});
+	}
+});
+
+// live region extension, adding a `messages` option
+// NOTE: This is an experimental API. We are still investigating
+// a full solution for string manipulation and internationalization.
+$.widget( "ui.autocomplete", $.ui.autocomplete, {
+	options: {
+		messages: {
+			noResults: "No search results.",
+			results: function( amount ) {
+				return amount + ( amount > 1 ? " results are" : " result is" ) +
+					" available, use up and down arrow keys to navigate.";
+			}
+		}
+	},
+
+	__response: function( content ) {
+		var message;
+		this._superApply( arguments );
+		if ( this.options.disabled || this.cancelSearch ) {
+			return;
+		}
+		if ( content && content.length ) {
+			message = this.options.messages.results( content.length );
+		} else {
+			message = this.options.messages.noResults;
+		}
+		this.liveRegion.children().hide();
+		$( "<div>" ).text( message ).appendTo( this.liveRegion );
+	}
+});
+
+var autocomplete = $.ui.autocomplete;
+
+
+/*!
+ * jQuery UI Button 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/button/
+ */
+
+
+var lastActive,
+	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+	formResetHandler = function() {
+		var form = $( this );
+		setTimeout(function() {
+			form.find( ":ui-button" ).button( "refresh" );
+		}, 1 );
+	},
+	radioGroup = function( radio ) {
+		var name = radio.name,
+			form = radio.form,
+			radios = $( [] );
+		if ( name ) {
+			name = name.replace( /'/g, "\\'" );
+			if ( form ) {
+				radios = $( form ).find( "[name='" + name + "'][type=radio]" );
+			} else {
+				radios = $( "[name='" + name + "'][type=radio]", radio.ownerDocument )
+					.filter(function() {
+						return !this.form;
+					});
+			}
+		}
+		return radios;
+	};
+
+$.widget( "ui.button", {
+	version: "1.11.4",
+	defaultElement: "<button>",
+	options: {
+		disabled: null,
+		text: true,
+		label: null,
+		icons: {
+			primary: null,
+			secondary: null
+		}
+	},
+	_create: function() {
+		this.element.closest( "form" )
+			.unbind( "reset" + this.eventNamespace )
+			.bind( "reset" + this.eventNamespace, formResetHandler );
+
+		if ( typeof this.options.disabled !== "boolean" ) {
+			this.options.disabled = !!this.element.prop( "disabled" );
+		} else {
+			this.element.prop( "disabled", this.options.disabled );
+		}
+
+		this._determineButtonType();
+		this.hasTitle = !!this.buttonElement.attr( "title" );
+
+		var that = this,
+			options = this.options,
+			toggleButton = this.type === "checkbox" || this.type === "radio",
+			activeClass = !toggleButton ? "ui-state-active" : "";
+
+		if ( options.label === null ) {
+			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
+		}
+
+		this._hoverable( this.buttonElement );
+
+		this.buttonElement
+			.addClass( baseClasses )
+			.attr( "role", "button" )
+			.bind( "mouseenter" + this.eventNamespace, function() {
+				if ( options.disabled ) {
+					return;
+				}
+				if ( this === lastActive ) {
+					$( this ).addClass( "ui-state-active" );
+				}
+			})
+			.bind( "mouseleave" + this.eventNamespace, function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( activeClass );
+			})
+			.bind( "click" + this.eventNamespace, function( event ) {
+				if ( options.disabled ) {
+					event.preventDefault();
+					event.stopImmediatePropagation();
+				}
+			});
+
+		// Can't use _focusable() because the element that receives focus
+		// and the element that gets the ui-state-focus class are different
+		this._on({
+			focus: function() {
+				this.buttonElement.addClass( "ui-state-focus" );
+			},
+			blur: function() {
+				this.buttonElement.removeClass( "ui-state-focus" );
+			}
+		});
+
+		if ( toggleButton ) {
+			this.element.bind( "change" + this.eventNamespace, function() {
+				that.refresh();
+			});
+		}
+
+		if ( this.type === "checkbox" ) {
+			this.buttonElement.bind( "click" + this.eventNamespace, function() {
+				if ( options.disabled ) {
+					return false;
+				}
+			});
+		} else if ( this.type === "radio" ) {
+			this.buttonElement.bind( "click" + this.eventNamespace, function() {
+				if ( options.disabled ) {
+					return false;
+				}
+				$( this ).addClass( "ui-state-active" );
+				that.buttonElement.attr( "aria-pressed", "true" );
+
+				var radio = that.element[ 0 ];
+				radioGroup( radio )
+					.not( radio )
+					.map(function() {
+						return $( this ).button( "widget" )[ 0 ];
+					})
+					.removeClass( "ui-state-active" )
+					.attr( "aria-pressed", "false" );
+			});
+		} else {
+			this.buttonElement
+				.bind( "mousedown" + this.eventNamespace, function() {
+					if ( options.disabled ) {
+						return false;
+					}
+					$( this ).addClass( "ui-state-active" );
+					lastActive = this;
+					that.document.one( "mouseup", function() {
+						lastActive = null;
+					});
+				})
+				.bind( "mouseup" + this.eventNamespace, function() {
+					if ( options.disabled ) {
+						return false;
+					}
+					$( this ).removeClass( "ui-state-active" );
+				})
+				.bind( "keydown" + this.eventNamespace, function(event) {
+					if ( options.disabled ) {
+						return false;
+					}
+					if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
+						$( this ).addClass( "ui-state-active" );
+					}
+				})
+				// see #8559, we bind to blur here in case the button element loses
+				// focus between keydown and keyup, it would be left in an "active" state
+				.bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
+					$( this ).removeClass( "ui-state-active" );
+				});
+
+			if ( this.buttonElement.is("a") ) {
+				this.buttonElement.keyup(function(event) {
+					if ( event.keyCode === $.ui.keyCode.SPACE ) {
+						// TODO pass through original event correctly (just as 2nd argument doesn't work)
+						$( this ).click();
+					}
+				});
+			}
+		}
+
+		this._setOption( "disabled", options.disabled );
+		this._resetButton();
+	},
+
+	_determineButtonType: function() {
+		var ancestor, labelSelector, checked;
+
+		if ( this.element.is("[type=checkbox]") ) {
+			this.type = "checkbox";
+		} else if ( this.element.is("[type=radio]") ) {
+			this.type = "radio";
+		} else if ( this.element.is("input") ) {
+			this.type = "input";
+		} else {
+			this.type = "button";
+		}
+
+		if ( this.type === "checkbox" || this.type === "radio" ) {
+			// we don't search against the document in case the element
+			// is disconnected from the DOM
+			ancestor = this.element.parents().last();
+			labelSelector = "label[for='" + this.element.attr("id") + "']";
+			this.buttonElement = ancestor.find( labelSelector );
+			if ( !this.buttonElement.length ) {
+				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
+				this.buttonElement = ancestor.filter( labelSelector );
+				if ( !this.buttonElement.length ) {
+					this.buttonElement = ancestor.find( labelSelector );
+				}
+			}
+			this.element.addClass( "ui-helper-hidden-accessible" );
+
+			checked = this.element.is( ":checked" );
+			if ( checked ) {
+				this.buttonElement.addClass( "ui-state-active" );
+			}
+			this.buttonElement.prop( "aria-pressed", checked );
+		} else {
+			this.buttonElement = this.element;
+		}
+	},
+
+	widget: function() {
+		return this.buttonElement;
+	},
+
+	_destroy: function() {
+		this.element
+			.removeClass( "ui-helper-hidden-accessible" );
+		this.buttonElement
+			.removeClass( baseClasses + " ui-state-active " + typeClasses )
+			.removeAttr( "role" )
+			.removeAttr( "aria-pressed" )
+			.html( this.buttonElement.find(".ui-button-text").html() );
+
+		if ( !this.hasTitle ) {
+			this.buttonElement.removeAttr( "title" );
+		}
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+		if ( key === "disabled" ) {
+			this.widget().toggleClass( "ui-state-disabled", !!value );
+			this.element.prop( "disabled", !!value );
+			if ( value ) {
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					this.buttonElement.removeClass( "ui-state-focus" );
+				} else {
+					this.buttonElement.removeClass( "ui-state-focus ui-state-active" );
+				}
+			}
+			return;
+		}
+		this._resetButton();
+	},
+
+	refresh: function() {
+		//See #8237 & #8828
+		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
+
+		if ( isDisabled !== this.options.disabled ) {
+			this._setOption( "disabled", isDisabled );
+		}
+		if ( this.type === "radio" ) {
+			radioGroup( this.element[0] ).each(function() {
+				if ( $( this ).is( ":checked" ) ) {
+					$( this ).button( "widget" )
+						.addClass( "ui-state-active" )
+						.attr( "aria-pressed", "true" );
+				} else {
+					$( this ).button( "widget" )
+						.removeClass( "ui-state-active" )
+						.attr( "aria-pressed", "false" );
+				}
+			});
+		} else if ( this.type === "checkbox" ) {
+			if ( this.element.is( ":checked" ) ) {
+				this.buttonElement
+					.addClass( "ui-state-active" )
+					.attr( "aria-pressed", "true" );
+			} else {
+				this.buttonElement
+					.removeClass( "ui-state-active" )
+					.attr( "aria-pressed", "false" );
+			}
+		}
+	},
+
+	_resetButton: function() {
+		if ( this.type === "input" ) {
+			if ( this.options.label ) {
+				this.element.val( this.options.label );
+			}
+			return;
+		}
+		var buttonElement = this.buttonElement.removeClass( typeClasses ),
+			buttonText = $( "<span></span>", this.document[0] )
+				.addClass( "ui-button-text" )
+				.html( this.options.label )
+				.appendTo( buttonElement.empty() )
+				.text(),
+			icons = this.options.icons,
+			multipleIcons = icons.primary && icons.secondary,
+			buttonClasses = [];
+
+		if ( icons.primary || icons.secondary ) {
+			if ( this.options.text ) {
+				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+			}
+
+			if ( icons.primary ) {
+				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+			}
+
+			if ( icons.secondary ) {
+				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+			}
+
+			if ( !this.options.text ) {
+				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
+
+				if ( !this.hasTitle ) {
+					buttonElement.attr( "title", $.trim( buttonText ) );
+				}
+			}
+		} else {
+			buttonClasses.push( "ui-button-text-only" );
+		}
+		buttonElement.addClass( buttonClasses.join( " " ) );
+	}
+});
+
+$.widget( "ui.buttonset", {
+	version: "1.11.4",
+	options: {
+		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
+	},
+
+	_create: function() {
+		this.element.addClass( "ui-buttonset" );
+	},
+
+	_init: function() {
+		this.refresh();
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "disabled" ) {
+			this.buttons.button( "option", key, value );
+		}
+
+		this._super( key, value );
+	},
+
+	refresh: function() {
+		var rtl = this.element.css( "direction" ) === "rtl",
+			allButtons = this.element.find( this.options.items ),
+			existingButtons = allButtons.filter( ":ui-button" );
+
+		// Initialize new buttons
+		allButtons.not( ":ui-button" ).button();
+
+		// Refresh existing buttons
+		existingButtons.button( "refresh" );
+
+		this.buttons = allButtons
+			.map(function() {
+				return $( this ).button( "widget" )[ 0 ];
+			})
+				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+				.filter( ":first" )
+					.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
+				.end()
+				.filter( ":last" )
+					.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
+				.end()
+			.end();
+	},
+
+	_destroy: function() {
+		this.element.removeClass( "ui-buttonset" );
+		this.buttons
+			.map(function() {
+				return $( this ).button( "widget" )[ 0 ];
+			})
+				.removeClass( "ui-corner-left ui-corner-right" )
+			.end()
+			.button( "destroy" );
+	}
+});
+
+var button = $.ui.button;
+
+
+/*!
+ * jQuery UI Dialog 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/dialog/
+ */
+
+
+var dialog = $.widget( "ui.dialog", {
+	version: "1.11.4",
+	options: {
+		appendTo: "body",
+		autoOpen: true,
+		buttons: [],
+		closeOnEscape: true,
+		closeText: "Close",
+		dialogClass: "",
+		draggable: true,
+		hide: null,
+		height: "auto",
+		maxHeight: null,
+		maxWidth: null,
+		minHeight: 150,
+		minWidth: 150,
+		modal: false,
+		position: {
+			my: "center",
+			at: "center",
+			of: window,
+			collision: "fit",
+			// Ensure the titlebar is always visible
+			using: function( pos ) {
+				var topOffset = $( this ).css( pos ).offset().top;
+				if ( topOffset < 0 ) {
+					$( this ).css( "top", pos.top - topOffset );
+				}
+			}
+		},
+		resizable: true,
+		show: null,
+		title: null,
+		width: 300,
+
+		// callbacks
+		beforeClose: null,
+		close: null,
+		drag: null,
+		dragStart: null,
+		dragStop: null,
+		focus: null,
+		open: null,
+		resize: null,
+		resizeStart: null,
+		resizeStop: null
+	},
+
+	sizeRelatedOptions: {
+		buttons: true,
+		height: true,
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true,
+		width: true
+	},
+
+	resizableRelatedOptions: {
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true
+	},
+
+	_create: function() {
+		this.originalCss = {
+			display: this.element[ 0 ].style.display,
+			width: this.element[ 0 ].style.width,
+			minHeight: this.element[ 0 ].style.minHeight,
+			maxHeight: this.element[ 0 ].style.maxHeight,
+			height: this.element[ 0 ].style.height
+		};
+		this.originalPosition = {
+			parent: this.element.parent(),
+			index: this.element.parent().children().index( this.element )
+		};
+		this.originalTitle = this.element.attr( "title" );
+		this.options.title = this.options.title || this.originalTitle;
+
+		this._createWrapper();
+
+		this.element
+			.show()
+			.removeAttr( "title" )
+			.addClass( "ui-dialog-content ui-widget-content" )
+			.appendTo( this.uiDialog );
+
+		this._createTitlebar();
+		this._createButtonPane();
+
+		if ( this.options.draggable && $.fn.draggable ) {
+			this._makeDraggable();
+		}
+		if ( this.options.resizable && $.fn.resizable ) {
+			this._makeResizable();
+		}
+
+		this._isOpen = false;
+
+		this._trackFocus();
+	},
+
+	_init: function() {
+		if ( this.options.autoOpen ) {
+			this.open();
+		}
+	},
+
+	_appendTo: function() {
+		var element = this.options.appendTo;
+		if ( element && (element.jquery || element.nodeType) ) {
+			return $( element );
+		}
+		return this.document.find( element || "body" ).eq( 0 );
+	},
+
+	_destroy: function() {
+		var next,
+			originalPosition = this.originalPosition;
+
+		this._untrackInstance();
+		this._destroyOverlay();
+
+		this.element
+			.removeUniqueId()
+			.removeClass( "ui-dialog-content ui-widget-content" )
+			.css( this.originalCss )
+			// Without detaching first, the following becomes really slow
+			.detach();
+
+		this.uiDialog.stop( true, true ).remove();
+
+		if ( this.originalTitle ) {
+			this.element.attr( "title", this.originalTitle );
+		}
+
+		next = originalPosition.parent.children().eq( originalPosition.index );
+		// Don't try to place the dialog next to itself (#8613)
+		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
+			next.before( this.element );
+		} else {
+			originalPosition.parent.append( this.element );
+		}
+	},
+
+	widget: function() {
+		return this.uiDialog;
+	},
+
+	disable: $.noop,
+	enable: $.noop,
+
+	close: function( event ) {
+		var activeElement,
+			that = this;
+
+		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
+			return;
+		}
+
+		this._isOpen = false;
+		this._focusedElement = null;
+		this._destroyOverlay();
+		this._untrackInstance();
+
+		if ( !this.opener.filter( ":focusable" ).focus().length ) {
+
+			// support: IE9
+			// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
+			try {
+				activeElement = this.document[ 0 ].activeElement;
+
+				// Support: IE9, IE10
+				// If the <body> is blurred, IE will switch windows, see #4520
+				if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) {
+
+					// Hiding a focused element doesn't trigger blur in WebKit
+					// so in case we have nothing to focus on, explicitly blur the active element
+					// https://bugs.webkit.org/show_bug.cgi?id=47182
+					$( activeElement ).blur();
+				}
+			} catch ( error ) {}
+		}
+
+		this._hide( this.uiDialog, this.options.hide, function() {
+			that._trigger( "close", event );
+		});
+	},
+
+	isOpen: function() {
+		return this._isOpen;
+	},
+
+	moveToTop: function() {
+		this._moveToTop();
+	},
+
+	_moveToTop: function( event, silent ) {
+		var moved = false,
+			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map(function() {
+				return +$( this ).css( "z-index" );
+			}).get(),
+			zIndexMax = Math.max.apply( null, zIndices );
+
+		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
+			this.uiDialog.css( "z-index", zIndexMax + 1 );
+			moved = true;
+		}
+
+		if ( moved && !silent ) {
+			this._trigger( "focus", event );
+		}
+		return moved;
+	},
+
+	open: function() {
+		var that = this;
+		if ( this._isOpen ) {
+			if ( this._moveToTop() ) {
+				this._focusTabbable();
+			}
+			return;
+		}
+
+		this._isOpen = true;
+		this.opener = $( this.document[ 0 ].activeElement );
+
+		this._size();
+		this._position();
+		this._createOverlay();
+		this._moveToTop( null, true );
+
+		// Ensure the overlay is moved to the top with the dialog, but only when
+		// opening. The overlay shouldn't move after the dialog is open so that
+		// modeless dialogs opened after the modal dialog stack properly.
+		if ( this.overlay ) {
+			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
+		}
+
+		this._show( this.uiDialog, this.options.show, function() {
+			that._focusTabbable();
+			that._trigger( "focus" );
+		});
+
+		// Track the dialog immediately upon openening in case a focus event
+		// somehow occurs outside of the dialog before an element inside the
+		// dialog is focused (#10152)
+		this._makeFocusTarget();
+
+		this._trigger( "open" );
+	},
+
+	_focusTabbable: function() {
+		// Set focus to the first match:
+		// 1. An element that was focused previously
+		// 2. First element inside the dialog matching [autofocus]
+		// 3. Tabbable element inside the content element
+		// 4. Tabbable element inside the buttonpane
+		// 5. The close button
+		// 6. The dialog itself
+		var hasFocus = this._focusedElement;
+		if ( !hasFocus ) {
+			hasFocus = this.element.find( "[autofocus]" );
+		}
+		if ( !hasFocus.length ) {
+			hasFocus = this.element.find( ":tabbable" );
+		}
+		if ( !hasFocus.length ) {
+			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
+		}
+		if ( !hasFocus.length ) {
+			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
+		}
+		if ( !hasFocus.length ) {
+			hasFocus = this.uiDialog;
+		}
+		hasFocus.eq( 0 ).focus();
+	},
+
+	_keepFocus: function( event ) {
+		function checkFocus() {
+			var activeElement = this.document[0].activeElement,
+				isActive = this.uiDialog[0] === activeElement ||
+					$.contains( this.uiDialog[0], activeElement );
+			if ( !isActive ) {
+				this._focusTabbable();
+			}
+		}
+		event.preventDefault();
+		checkFocus.call( this );
+		// support: IE
+		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
+		// so we check again later
+		this._delay( checkFocus );
+	},
+
+	_createWrapper: function() {
+		this.uiDialog = $("<div>")
+			.addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
+				this.options.dialogClass )
+			.hide()
+			.attr({
+				// Setting tabIndex makes the div focusable
+				tabIndex: -1,
+				role: "dialog"
+			})
+			.appendTo( this._appendTo() );
+
+		this._on( this.uiDialog, {
+			keydown: function( event ) {
+				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+						event.keyCode === $.ui.keyCode.ESCAPE ) {
+					event.preventDefault();
+					this.close( event );
+					return;
+				}
+
+				// prevent tabbing out of dialogs
+				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
+					return;
+				}
+				var tabbables = this.uiDialog.find( ":tabbable" ),
+					first = tabbables.filter( ":first" ),
+					last = tabbables.filter( ":last" );
+
+				if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
+					this._delay(function() {
+						first.focus();
+					});
+					event.preventDefault();
+				} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
+					this._delay(function() {
+						last.focus();
+					});
+					event.preventDefault();
+				}
+			},
+			mousedown: function( event ) {
+				if ( this._moveToTop( event ) ) {
+					this._focusTabbable();
+				}
+			}
+		});
+
+		// We assume that any existing aria-describedby attribute means
+		// that the dialog content is marked up properly
+		// otherwise we brute force the content as the description
+		if ( !this.element.find( "[aria-describedby]" ).length ) {
+			this.uiDialog.attr({
+				"aria-describedby": this.element.uniqueId().attr( "id" )
+			});
+		}
+	},
+
+	_createTitlebar: function() {
+		var uiDialogTitle;
+
+		this.uiDialogTitlebar = $( "<div>" )
+			.addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" )
+			.prependTo( this.uiDialog );
+		this._on( this.uiDialogTitlebar, {
+			mousedown: function( event ) {
+				// Don't prevent click on close button (#8838)
+				// Focusing a dialog that is partially scrolled out of view
+				// causes the browser to scroll it into view, preventing the click event
+				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
+					// Dialog isn't getting focus when dragging (#8063)
+					this.uiDialog.focus();
+				}
+			}
+		});
+
+		// support: IE
+		// Use type="button" to prevent enter keypresses in textboxes from closing the
+		// dialog in IE (#9312)
+		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
+			.button({
+				label: this.options.closeText,
+				icons: {
+					primary: "ui-icon-closethick"
+				},
+				text: false
+			})
+			.addClass( "ui-dialog-titlebar-close" )
+			.appendTo( this.uiDialogTitlebar );
+		this._on( this.uiDialogTitlebarClose, {
+			click: function( event ) {
+				event.preventDefault();
+				this.close( event );
+			}
+		});
+
+		uiDialogTitle = $( "<span>" )
+			.uniqueId()
+			.addClass( "ui-dialog-title" )
+			.prependTo( this.uiDialogTitlebar );
+		this._title( uiDialogTitle );
+
+		this.uiDialog.attr({
+			"aria-labelledby": uiDialogTitle.attr( "id" )
+		});
+	},
+
+	_title: function( title ) {
+		if ( !this.options.title ) {
+			title.html( " " );
+		}
+		title.text( this.options.title );
+	},
+
+	_createButtonPane: function() {
+		this.uiDialogButtonPane = $( "<div>" )
+			.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
+
+		this.uiButtonSet = $( "<div>" )
+			.addClass( "ui-dialog-buttonset" )
+			.appendTo( this.uiDialogButtonPane );
+
+		this._createButtons();
+	},
+
+	_createButtons: function() {
+		var that = this,
+			buttons = this.options.buttons;
+
+		// if we already have a button pane, remove it
+		this.uiDialogButtonPane.remove();
+		this.uiButtonSet.empty();
+
+		if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
+			this.uiDialog.removeClass( "ui-dialog-buttons" );
+			return;
+		}
+
+		$.each( buttons, function( name, props ) {
+			var click, buttonOptions;
+			props = $.isFunction( props ) ?
+				{ click: props, text: name } :
+				props;
+			// Default to a non-submitting button
+			props = $.extend( { type: "button" }, props );
+			// Change the context for the click callback to be the main element
+			click = props.click;
+			props.click = function() {
+				click.apply( that.element[ 0 ], arguments );
+			};
+			buttonOptions = {
+				icons: props.icons,
+				text: props.showText
+			};
+			delete props.icons;
+			delete props.showText;
+			$( "<button></button>", props )
+				.button( buttonOptions )
+				.appendTo( that.uiButtonSet );
+		});
+		this.uiDialog.addClass( "ui-dialog-buttons" );
+		this.uiDialogButtonPane.appendTo( this.uiDialog );
+	},
+
+	_makeDraggable: function() {
+		var that = this,
+			options = this.options;
+
+		function filteredUi( ui ) {
+			return {
+				position: ui.position,
+				offset: ui.offset
+			};
+		}
+
+		this.uiDialog.draggable({
+			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
+			handle: ".ui-dialog-titlebar",
+			containment: "document",
+			start: function( event, ui ) {
+				$( this ).addClass( "ui-dialog-dragging" );
+				that._blockFrames();
+				that._trigger( "dragStart", event, filteredUi( ui ) );
+			},
+			drag: function( event, ui ) {
+				that._trigger( "drag", event, filteredUi( ui ) );
+			},
+			stop: function( event, ui ) {
+				var left = ui.offset.left - that.document.scrollLeft(),
+					top = ui.offset.top - that.document.scrollTop();
+
+				options.position = {
+					my: "left top",
+					at: "left" + (left >= 0 ? "+" : "") + left + " " +
+						"top" + (top >= 0 ? "+" : "") + top,
+					of: that.window
+				};
+				$( this ).removeClass( "ui-dialog-dragging" );
+				that._unblockFrames();
+				that._trigger( "dragStop", event, filteredUi( ui ) );
+			}
+		});
+	},
+
+	_makeResizable: function() {
+		var that = this,
+			options = this.options,
+			handles = options.resizable,
+			// .ui-resizable has position: relative defined in the stylesheet
+			// but dialogs have to use absolute or fixed positioning
+			position = this.uiDialog.css("position"),
+			resizeHandles = typeof handles === "string" ?
+				handles	:
+				"n,e,s,w,se,sw,ne,nw";
+
+		function filteredUi( ui ) {
+			return {
+				originalPosition: ui.originalPosition,
+				originalSize: ui.originalSize,
+				position: ui.position,
+				size: ui.size
+			};
+		}
+
+		this.uiDialog.resizable({
+			cancel: ".ui-dialog-content",
+			containment: "document",
+			alsoResize: this.element,
+			maxWidth: options.maxWidth,
+			maxHeight: options.maxHeight,
+			minWidth: options.minWidth,
+			minHeight: this._minHeight(),
+			handles: resizeHandles,
+			start: function( event, ui ) {
+				$( this ).addClass( "ui-dialog-resizing" );
+				that._blockFrames();
+				that._trigger( "resizeStart", event, filteredUi( ui ) );
+			},
+			resize: function( event, ui ) {
+				that._trigger( "resize", event, filteredUi( ui ) );
+			},
+			stop: function( event, ui ) {
+				var offset = that.uiDialog.offset(),
+					left = offset.left - that.document.scrollLeft(),
+					top = offset.top - that.document.scrollTop();
+
+				options.height = that.uiDialog.height();
+				options.width = that.uiDialog.width();
+				options.position = {
+					my: "left top",
+					at: "left" + (left >= 0 ? "+" : "") + left + " " +
+						"top" + (top >= 0 ? "+" : "") + top,
+					of: that.window
+				};
+				$( this ).removeClass( "ui-dialog-resizing" );
+				that._unblockFrames();
+				that._trigger( "resizeStop", event, filteredUi( ui ) );
+			}
+		})
+		.css( "position", position );
+	},
+
+	_trackFocus: function() {
+		this._on( this.widget(), {
+			focusin: function( event ) {
+				this._makeFocusTarget();
+				this._focusedElement = $( event.target );
+			}
+		});
+	},
+
+	_makeFocusTarget: function() {
+		this._untrackInstance();
+		this._trackingInstances().unshift( this );
+	},
+
+	_untrackInstance: function() {
+		var instances = this._trackingInstances(),
+			exists = $.inArray( this, instances );
+		if ( exists !== -1 ) {
+			instances.splice( exists, 1 );
+		}
+	},
+
+	_trackingInstances: function() {
+		var instances = this.document.data( "ui-dialog-instances" );
+		if ( !instances ) {
+			instances = [];
+			this.document.data( "ui-dialog-instances", instances );
+		}
+		return instances;
+	},
+
+	_minHeight: function() {
+		var options = this.options;
+
+		return options.height === "auto" ?
+			options.minHeight :
+			Math.min( options.minHeight, options.height );
+	},
+
+	_position: function() {
+		// Need to show the dialog to get the actual offset in the position plugin
+		var isVisible = this.uiDialog.is( ":visible" );
+		if ( !isVisible ) {
+			this.uiDialog.show();
+		}
+		this.uiDialog.position( this.options.position );
+		if ( !isVisible ) {
+			this.uiDialog.hide();
+		}
+	},
+
+	_setOptions: function( options ) {
+		var that = this,
+			resize = false,
+			resizableOptions = {};
+
+		$.each( options, function( key, value ) {
+			that._setOption( key, value );
+
+			if ( key in that.sizeRelatedOptions ) {
+				resize = true;
+			}
+			if ( key in that.resizableRelatedOptions ) {
+				resizableOptions[ key ] = value;
+			}
+		});
+
+		if ( resize ) {
+			this._size();
+			this._position();
+		}
+		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
+			this.uiDialog.resizable( "option", resizableOptions );
+		}
+	},
+
+	_setOption: function( key, value ) {
+		var isDraggable, isResizable,
+			uiDialog = this.uiDialog;
+
+		if ( key === "dialogClass" ) {
+			uiDialog
+				.removeClass( this.options.dialogClass )
+				.addClass( value );
+		}
+
+		if ( key === "disabled" ) {
+			return;
+		}
+
+		this._super( key, value );
+
+		if ( key === "appendTo" ) {
+			this.uiDialog.appendTo( this._appendTo() );
+		}
+
+		if ( key === "buttons" ) {
+			this._createButtons();
+		}
+
+		if ( key === "closeText" ) {
+			this.uiDialogTitlebarClose.button({
+				// Ensure that we always pass a string
+				label: "" + value
+			});
+		}
+
+		if ( key === "draggable" ) {
+			isDraggable = uiDialog.is( ":data(ui-draggable)" );
+			if ( isDraggable && !value ) {
+				uiDialog.draggable( "destroy" );
+			}
+
+			if ( !isDraggable && value ) {
+				this._makeDraggable();
+			}
+		}
+
+		if ( key === "position" ) {
+			this._position();
+		}
+
+		if ( key === "resizable" ) {
+			// currently resizable, becoming non-resizable
+			isResizable = uiDialog.is( ":data(ui-resizable)" );
+			if ( isResizable && !value ) {
+				uiDialog.resizable( "destroy" );
+			}
+
+			// currently resizable, changing handles
+			if ( isResizable && typeof value === "string" ) {
+				uiDialog.resizable( "option", "handles", value );
+			}
+
+			// currently non-resizable, becoming resizable
+			if ( !isResizable && value !== false ) {
+				this._makeResizable();
+			}
+		}
+
+		if ( key === "title" ) {
+			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
+		}
+	},
+
+	_size: function() {
+		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+		// divs will both have width and height set, so we need to reset them
+		var nonContentHeight, minContentHeight, maxContentHeight,
+			options = this.options;
+
+		// Reset content sizing
+		this.element.show().css({
+			width: "auto",
+			minHeight: 0,
+			maxHeight: "none",
+			height: 0
+		});
+
+		if ( options.minWidth > options.width ) {
+			options.width = options.minWidth;
+		}
+
+		// reset wrapper sizing
+		// determine the height of all the non-content elements
+		nonContentHeight = this.uiDialog.css({
+				height: "auto",
+				width: options.width
+			})
+			.outerHeight();
+		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+		maxContentHeight = typeof options.maxHeight === "number" ?
+			Math.max( 0, options.maxHeight - nonContentHeight ) :
+			"none";
+
+		if ( options.height === "auto" ) {
+			this.element.css({
+				minHeight: minContentHeight,
+				maxHeight: maxContentHeight,
+				height: "auto"
+			});
+		} else {
+			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
+		}
+
+		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
+			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
+		}
+	},
+
+	_blockFrames: function() {
+		this.iframeBlocks = this.document.find( "iframe" ).map(function() {
+			var iframe = $( this );
+
+			return $( "<div>" )
+				.css({
+					position: "absolute",
+					width: iframe.outerWidth(),
+					height: iframe.outerHeight()
+				})
+				.appendTo( iframe.parent() )
+				.offset( iframe.offset() )[0];
+		});
+	},
+
+	_unblockFrames: function() {
+		if ( this.iframeBlocks ) {
+			this.iframeBlocks.remove();
+			delete this.iframeBlocks;
+		}
+	},
+
+	_allowInteraction: function( event ) {
+		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
+			return true;
+		}
+
+		// TODO: Remove hack when datepicker implements
+		// the .ui-front logic (#8989)
+		return !!$( event.target ).closest( ".ui-datepicker" ).length;
+	},
+
+	_createOverlay: function() {
+		if ( !this.options.modal ) {
+			return;
+		}
+
+		// We use a delay in case the overlay is created from an
+		// event that we're going to be cancelling (#2804)
+		var isOpening = true;
+		this._delay(function() {
+			isOpening = false;
+		});
+
+		if ( !this.document.data( "ui-dialog-overlays" ) ) {
+
+			// Prevent use of anchors and inputs
+			// Using _on() for an event handler shared across many instances is
+			// safe because the dialogs stack and must be closed in reverse order
+			this._on( this.document, {
+				focusin: function( event ) {
+					if ( isOpening ) {
+						return;
+					}
+
+					if ( !this._allowInteraction( event ) ) {
+						event.preventDefault();
+						this._trackingInstances()[ 0 ]._focusTabbable();
+					}
+				}
+			});
+		}
+
+		this.overlay = $( "<div>" )
+			.addClass( "ui-widget-overlay ui-front" )
+			.appendTo( this._appendTo() );
+		this._on( this.overlay, {
+			mousedown: "_keepFocus"
+		});
+		this.document.data( "ui-dialog-overlays",
+			(this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
+	},
+
+	_destroyOverlay: function() {
+		if ( !this.options.modal ) {
+			return;
+		}
+
+		if ( this.overlay ) {
+			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
+
+			if ( !overlays ) {
+				this.document
+					.unbind( "focusin" )
+					.removeData( "ui-dialog-overlays" );
+			} else {
+				this.document.data( "ui-dialog-overlays", overlays );
+			}
+
+			this.overlay.remove();
+			this.overlay = null;
+		}
+	}
+});
+
+
+/*!
+ * jQuery UI Progressbar 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/progressbar/
+ */
+
+
+var progressbar = $.widget( "ui.progressbar", {
+	version: "1.11.4",
+	options: {
+		max: 100,
+		value: 0,
+
+		change: null,
+		complete: null
+	},
+
+	min: 0,
+
+	_create: function() {
+		// Constrain initial value
+		this.oldValue = this.options.value = this._constrainedValue();
+
+		this.element
+			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.attr({
+				// Only set static values, aria-valuenow and aria-valuemax are
+				// set inside _refreshValue()
+				role: "progressbar",
+				"aria-valuemin": this.min
+			});
+
+		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+			.appendTo( this.element );
+
+		this._refreshValue();
+	},
+
+	_destroy: function() {
+		this.element
+			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-valuemin" )
+			.removeAttr( "aria-valuemax" )
+			.removeAttr( "aria-valuenow" );
+
+		this.valueDiv.remove();
+	},
+
+	value: function( newValue ) {
+		if ( newValue === undefined ) {
+			return this.options.value;
+		}
+
+		this.options.value = this._constrainedValue( newValue );
+		this._refreshValue();
+	},
+
+	_constrainedValue: function( newValue ) {
+		if ( newValue === undefined ) {
+			newValue = this.options.value;
+		}
+
+		this.indeterminate = newValue === false;
+
+		// sanitize value
+		if ( typeof newValue !== "number" ) {
+			newValue = 0;
+		}
+
+		return this.indeterminate ? false :
+			Math.min( this.options.max, Math.max( this.min, newValue ) );
+	},
+
+	_setOptions: function( options ) {
+		// Ensure "value" option is set after other values (like max)
+		var value = options.value;
+		delete options.value;
+
+		this._super( options );
+
+		this.options.value = this._constrainedValue( value );
+		this._refreshValue();
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "max" ) {
+			// Don't allow a max less than min
+			value = Math.max( this.min, value );
+		}
+		if ( key === "disabled" ) {
+			this.element
+				.toggleClass( "ui-state-disabled", !!value )
+				.attr( "aria-disabled", value );
+		}
+		this._super( key, value );
+	},
+
+	_percentage: function() {
+		return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
+	},
+
+	_refreshValue: function() {
+		var value = this.options.value,
+			percentage = this._percentage();
+
+		this.valueDiv
+			.toggle( this.indeterminate || value > this.min )
+			.toggleClass( "ui-corner-right", value === this.options.max )
+			.width( percentage.toFixed(0) + "%" );
+
+		this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
+
+		if ( this.indeterminate ) {
+			this.element.removeAttr( "aria-valuenow" );
+			if ( !this.overlayDiv ) {
+				this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
+			}
+		} else {
+			this.element.attr({
+				"aria-valuemax": this.options.max,
+				"aria-valuenow": value
+			});
+			if ( this.overlayDiv ) {
+				this.overlayDiv.remove();
+				this.overlayDiv = null;
+			}
+		}
+
+		if ( this.oldValue !== value ) {
+			this.oldValue = value;
+			this._trigger( "change" );
+		}
+		if ( value === this.options.max ) {
+			this._trigger( "complete" );
+		}
+	}
+});
+
+
+/*!
+ * jQuery UI Selectmenu 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/selectmenu
+ */
+
+
+var selectmenu = $.widget( "ui.selectmenu", {
+	version: "1.11.4",
+	defaultElement: "<select>",
+	options: {
+		appendTo: null,
+		disabled: null,
+		icons: {
+			button: "ui-icon-triangle-1-s"
+		},
+		position: {
+			my: "left top",
+			at: "left bottom",
+			collision: "none"
+		},
+		width: null,
+
+		// callbacks
+		change: null,
+		close: null,
+		focus: null,
+		open: null,
+		select: null
+	},
+
+	_create: function() {
+		var selectmenuId = this.element.uniqueId().attr( "id" );
+		this.ids = {
+			element: selectmenuId,
+			button: selectmenuId + "-button",
+			menu: selectmenuId + "-menu"
+		};
+
+		this._drawButton();
+		this._drawMenu();
+
+		if ( this.options.disabled ) {
+			this.disable();
+		}
+	},
+
+	_drawButton: function() {
+		var that = this;
+
+		// Associate existing label with the new button
+		this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button );
+		this._on( this.label, {
+			click: function( event ) {
+				this.button.focus();
+				event.preventDefault();
+			}
+		});
+
+		// Hide original select element
+		this.element.hide();
+
+		// Create button
+		this.button = $( "<span>", {
+			"class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all",
+			tabindex: this.options.disabled ? -1 : 0,
+			id: this.ids.button,
+			role: "combobox",
+			"aria-expanded": "false",
+			"aria-autocomplete": "list",
+			"aria-owns": this.ids.menu,
+			"aria-haspopup": "true"
+		})
+			.insertAfter( this.element );
+
+		$( "<span>", {
+			"class": "ui-icon " + this.options.icons.button
+		})
+			.prependTo( this.button );
+
+		this.buttonText = $( "<span>", {
+			"class": "ui-selectmenu-text"
+		})
+			.appendTo( this.button );
+
+		this._setText( this.buttonText, this.element.find( "option:selected" ).text() );
+		this._resizeButton();
+
+		this._on( this.button, this._buttonEvents );
+		this.button.one( "focusin", function() {
+
+			// Delay rendering the menu items until the button receives focus.
+			// The menu may have already been rendered via a programmatic open.
+			if ( !that.menuItems ) {
+				that._refreshMenu();
+			}
+		});
+		this._hoverable( this.button );
+		this._focusable( this.button );
+	},
+
+	_drawMenu: function() {
+		var that = this;
+
+		// Create menu
+		this.menu = $( "<ul>", {
+			"aria-hidden": "true",
+			"aria-labelledby": this.ids.button,
+			id: this.ids.menu
+		});
+
+		// Wrap menu
+		this.menuWrap = $( "<div>", {
+			"class": "ui-selectmenu-menu ui-front"
+		})
+			.append( this.menu )
+			.appendTo( this._appendTo() );
+
+		// Initialize menu widget
+		this.menuInstance = this.menu
+			.menu({
+				role: "listbox",
+				select: function( event, ui ) {
+					event.preventDefault();
+
+					// support: IE8
+					// If the item was selected via a click, the text selection
+					// will be destroyed in IE
+					that._setSelection();
+
+					that._select( ui.item.data( "ui-selectmenu-item" ), event );
+				},
+				focus: function( event, ui ) {
+					var item = ui.item.data( "ui-selectmenu-item" );
+
+					// Prevent inital focus from firing and check if its a newly focused item
+					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
+						that._trigger( "focus", event, { item: item } );
+						if ( !that.isOpen ) {
+							that._select( item, event );
+						}
+					}
+					that.focusIndex = item.index;
+
+					that.button.attr( "aria-activedescendant",
+						that.menuItems.eq( item.index ).attr( "id" ) );
+				}
+			})
+			.menu( "instance" );
+
+		// Adjust menu styles to dropdown
+		this.menu
+			.addClass( "ui-corner-bottom" )
+			.removeClass( "ui-corner-all" );
+
+		// Don't close the menu on mouseleave
+		this.menuInstance._off( this.menu, "mouseleave" );
+
+		// Cancel the menu's collapseAll on document click
+		this.menuInstance._closeOnDocumentClick = function() {
+			return false;
+		};
+
+		// Selects often contain empty items, but never contain dividers
+		this.menuInstance._isDivider = function() {
+			return false;
+		};
+	},
+
+	refresh: function() {
+		this._refreshMenu();
+		this._setText( this.buttonText, this._getSelectedItem().text() );
+		if ( !this.options.width ) {
+			this._resizeButton();
+		}
+	},
+
+	_refreshMenu: function() {
+		this.menu.empty();
+
+		var item,
+			options = this.element.find( "option" );
+
+		if ( !options.length ) {
+			return;
+		}
+
+		this._parseOptions( options );
+		this._renderMenu( this.menu, this.items );
+
+		this.menuInstance.refresh();
+		this.menuItems = this.menu.find( "li" ).not( ".ui-selectmenu-optgroup" );
+
+		item = this._getSelectedItem();
+
+		// Update the menu to have the correct item focused
+		this.menuInstance.focus( null, item );
+		this._setAria( item.data( "ui-selectmenu-item" ) );
+
+		// Set disabled state
+		this._setOption( "disabled", this.element.prop( "disabled" ) );
+	},
+
+	open: function( event ) {
+		if ( this.options.disabled ) {
+			return;
+		}
+
+		// If this is the first time the menu is being opened, render the items
+		if ( !this.menuItems ) {
+			this._refreshMenu();
+		} else {
+
+			// Menu clears focus on close, reset focus to selected item
+			this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus" );
+			this.menuInstance.focus( null, this._getSelectedItem() );
+		}
+
+		this.isOpen = true;
+		this._toggleAttr();
+		this._resizeMenu();
+		this._position();
+
+		this._on( this.document, this._documentClick );
+
+		this._trigger( "open", event );
+	},
+
+	_position: function() {
+		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
+	},
+
+	close: function( event ) {
+		if ( !this.isOpen ) {
+			return;
+		}
+
+		this.isOpen = false;
+		this._toggleAttr();
+
+		this.range = null;
+		this._off( this.document );
+
+		this._trigger( "close", event );
+	},
+
+	widget: function() {
+		return this.button;
+	},
+
+	menuWidget: function() {
+		return this.menu;
+	},
+
+	_renderMenu: function( ul, items ) {
+		var that = this,
+			currentOptgroup = "";
+
+		$.each( items, function( index, item ) {
+			if ( item.optgroup !== currentOptgroup ) {
+				$( "<li>", {
+					"class": "ui-selectmenu-optgroup ui-menu-divider" +
+						( item.element.parent( "optgroup" ).prop( "disabled" ) ?
+							" ui-state-disabled" :
+							"" ),
+					text: item.optgroup
+				})
+					.appendTo( ul );
+
+				currentOptgroup = item.optgroup;
+			}
+
+			that._renderItemData( ul, item );
+		});
+	},
+
+	_renderItemData: function( ul, item ) {
+		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
+	},
+
+	_renderItem: function( ul, item ) {
+		var li = $( "<li>" );
+
+		if ( item.disabled ) {
+			li.addClass( "ui-state-disabled" );
+		}
+		this._setText( li, item.label );
+
+		return li.appendTo( ul );
+	},
+
+	_setText: function( element, value ) {
+		if ( value ) {
+			element.text( value );
+		} else {
+			element.html( " " );
+		}
+	},
+
+	_move: function( direction, event ) {
+		var item, next,
+			filter = ".ui-menu-item";
+
+		if ( this.isOpen ) {
+			item = this.menuItems.eq( this.focusIndex );
+		} else {
+			item = this.menuItems.eq( this.element[ 0 ].selectedIndex );
+			filter += ":not(.ui-state-disabled)";
+		}
+
+		if ( direction === "first" || direction === "last" ) {
+			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
+		} else {
+			next = item[ direction + "All" ]( filter ).eq( 0 );
+		}
+
+		if ( next.length ) {
+			this.menuInstance.focus( event, next );
+		}
+	},
+
+	_getSelectedItem: function() {
+		return this.menuItems.eq( this.element[ 0 ].selectedIndex );
+	},
+
+	_toggle: function( event ) {
+		this[ this.isOpen ? "close" : "open" ]( event );
+	},
+
+	_setSelection: function() {
+		var selection;
+
+		if ( !this.range ) {
+			return;
+		}
+
+		if ( window.getSelection ) {
+			selection = window.getSelection();
+			selection.removeAllRanges();
+			selection.addRange( this.range );
+
+		// support: IE8
+		} else {
+			this.range.select();
+		}
+
+		// support: IE
+		// Setting the text selection kills the button focus in IE, but
+		// restoring the focus doesn't kill the selection.
+		this.button.focus();
+	},
+
+	_documentClick: {
+		mousedown: function( event ) {
+			if ( !this.isOpen ) {
+				return;
+			}
+
+			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button ).length ) {
+				this.close( event );
+			}
+		}
+	},
+
+	_buttonEvents: {
+
+		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
+		mousedown: function() {
+			var selection;
+
+			if ( window.getSelection ) {
+				selection = window.getSelection();
+				if ( selection.rangeCount ) {
+					this.range = selection.getRangeAt( 0 );
+				}
+
+			// support: IE8
+			} else {
+				this.range = document.selection.createRange();
+			}
+		},
+
+		click: function( event ) {
+			this._setSelection();
+			this._toggle( event );
+		},
+
+		keydown: function( event ) {
+			var preventDefault = true;
+			switch ( event.keyCode ) {
+				case $.ui.keyCode.TAB:
+				case $.ui.keyCode.ESCAPE:
+					this.close( event );
+					preventDefault = false;
+					break;
+				case $.ui.keyCode.ENTER:
+					if ( this.isOpen ) {
+						this._selectFocusedItem( event );
+					}
+					break;
+				case $.ui.keyCode.UP:
+					if ( event.altKey ) {
+						this._toggle( event );
+					} else {
+						this._move( "prev", event );
+					}
+					break;
+				case $.ui.keyCode.DOWN:
+					if ( event.altKey ) {
+						this._toggle( event );
+					} else {
+						this._move( "next", event );
+					}
+					break;
+				case $.ui.keyCode.SPACE:
+					if ( this.isOpen ) {
+						this._selectFocusedItem( event );
+					} else {
+						this._toggle( event );
+					}
+					break;
+				case $.ui.keyCode.LEFT:
+					this._move( "prev", event );
+					break;
+				case $.ui.keyCode.RIGHT:
+					this._move( "next", event );
+					break;
+				case $.ui.keyCode.HOME:
+				case $.ui.keyCode.PAGE_UP:
+					this._move( "first", event );
+					break;
+				case $.ui.keyCode.END:
+				case $.ui.keyCode.PAGE_DOWN:
+					this._move( "last", event );
+					break;
+				default:
+					this.menu.trigger( event );
+					preventDefault = false;
+			}
+
+			if ( preventDefault ) {
+				event.preventDefault();
+			}
+		}
+	},
+
+	_selectFocusedItem: function( event ) {
+		var item = this.menuItems.eq( this.focusIndex );
+		if ( !item.hasClass( "ui-state-disabled" ) ) {
+			this._select( item.data( "ui-selectmenu-item" ), event );
+		}
+	},
+
+	_select: function( item, event ) {
+		var oldIndex = this.element[ 0 ].selectedIndex;
+
+		// Change native select element
+		this.element[ 0 ].selectedIndex = item.index;
+		this._setText( this.buttonText, item.label );
+		this._setAria( item );
+		this._trigger( "select", event, { item: item } );
+
+		if ( item.index !== oldIndex ) {
+			this._trigger( "change", event, { item: item } );
+		}
+
+		this.close( event );
+	},
+
+	_setAria: function( item ) {
+		var id = this.menuItems.eq( item.index ).attr( "id" );
+
+		this.button.attr({
+			"aria-labelledby": id,
+			"aria-activedescendant": id
+		});
+		this.menu.attr( "aria-activedescendant", id );
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "icons" ) {
+			this.button.find( "span.ui-icon" )
+				.removeClass( this.options.icons.button )
+				.addClass( value.button );
+		}
+
+		this._super( key, value );
+
+		if ( key === "appendTo" ) {
+			this.menuWrap.appendTo( this._appendTo() );
+		}
+
+		if ( key === "disabled" ) {
+			this.menuInstance.option( "disabled", value );
+			this.button
+				.toggleClass( "ui-state-disabled", value )
+				.attr( "aria-disabled", value );
+
+			this.element.prop( "disabled", value );
+			if ( value ) {
+				this.button.attr( "tabindex", -1 );
+				this.close();
+			} else {
+				this.button.attr( "tabindex", 0 );
+			}
+		}
+
+		if ( key === "width" ) {
+			this._resizeButton();
+		}
+	},
+
+	_appendTo: function() {
+		var element = this.options.appendTo;
+
+		if ( element ) {
+			element = element.jquery || element.nodeType ?
+				$( element ) :
+				this.document.find( element ).eq( 0 );
+		}
+
+		if ( !element || !element[ 0 ] ) {
+			element = this.element.closest( ".ui-front" );
+		}
+
+		if ( !element.length ) {
+			element = this.document[ 0 ].body;
+		}
+
+		return element;
+	},
+
+	_toggleAttr: function() {
+		this.button
+			.toggleClass( "ui-corner-top", this.isOpen )
+			.toggleClass( "ui-corner-all", !this.isOpen )
+			.attr( "aria-expanded", this.isOpen );
+		this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
+		this.menu.attr( "aria-hidden", !this.isOpen );
+	},
+
+	_resizeButton: function() {
+		var width = this.options.width;
+
+		if ( !width ) {
+			width = this.element.show().outerWidth();
+			this.element.hide();
+		}
+
+		this.button.outerWidth( width );
+	},
+
+	_resizeMenu: function() {
+		this.menu.outerWidth( Math.max(
+			this.button.outerWidth(),
+
+			// support: IE10
+			// IE10 wraps long text (possibly a rounding bug)
+			// so we add 1px to avoid the wrapping
+			this.menu.width( "" ).outerWidth() + 1
+		) );
+	},
+
+	_getCreateOptions: function() {
+		return { disabled: this.element.prop( "disabled" ) };
+	},
+
+	_parseOptions: function( options ) {
+		var data = [];
+		options.each(function( index, item ) {
+			var option = $( item ),
+				optgroup = option.parent( "optgroup" );
+			data.push({
+				element: option,
+				index: index,
+				value: option.val(),
+				label: option.text(),
+				optgroup: optgroup.attr( "label" ) || "",
+				disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
+			});
+		});
+		this.items = data;
+	},
+
+	_destroy: function() {
+		this.menuWrap.remove();
+		this.button.remove();
+		this.element.show();
+		this.element.removeUniqueId();
+		this.label.attr( "for", this.ids.element );
+	}
+});
+
+
+/*!
+ * jQuery UI Slider 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/slider/
+ */
+
+
+var slider = $.widget( "ui.slider", $.ui.mouse, {
+	version: "1.11.4",
+	widgetEventPrefix: "slide",
+
+	options: {
+		animate: false,
+		distance: 0,
+		max: 100,
+		min: 0,
+		orientation: "horizontal",
+		range: false,
+		step: 1,
+		value: 0,
+		values: null,
+
+		// callbacks
+		change: null,
+		slide: null,
+		start: null,
+		stop: null
+	},
+
+	// number of pages in a slider
+	// (how many times can you page up/down to go through the whole range)
+	numPages: 5,
+
+	_create: function() {
+		this._keySliding = false;
+		this._mouseSliding = false;
+		this._animateOff = true;
+		this._handleIndex = null;
+		this._detectOrientation();
+		this._mouseInit();
+		this._calculateNewMax();
+
+		this.element
+			.addClass( "ui-slider" +
+				" ui-slider-" + this.orientation +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all");
+
+		this._refresh();
+		this._setOption( "disabled", this.options.disabled );
+
+		this._animateOff = false;
+	},
+
+	_refresh: function() {
+		this._createRange();
+		this._createHandles();
+		this._setupEvents();
+		this._refreshValue();
+	},
+
+	_createHandles: function() {
+		var i, handleCount,
+			options = this.options,
+			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
+			handle = "<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",
+			handles = [];
+
+		handleCount = ( options.values && options.values.length ) || 1;
+
+		if ( existingHandles.length > handleCount ) {
+			existingHandles.slice( handleCount ).remove();
+			existingHandles = existingHandles.slice( 0, handleCount );
+		}
+
+		for ( i = existingHandles.length; i < handleCount; i++ ) {
+			handles.push( handle );
+		}
+
+		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
+
+		this.handle = this.handles.eq( 0 );
+
+		this.handles.each(function( i ) {
+			$( this ).data( "ui-slider-handle-index", i );
+		});
+	},
+
+	_createRange: function() {
+		var options = this.options,
+			classes = "";
+
+		if ( options.range ) {
+			if ( options.range === true ) {
+				if ( !options.values ) {
+					options.values = [ this._valueMin(), this._valueMin() ];
+				} else if ( options.values.length && options.values.length !== 2 ) {
+					options.values = [ options.values[0], options.values[0] ];
+				} else if ( $.isArray( options.values ) ) {
+					options.values = options.values.slice(0);
+				}
+			}
+
+			if ( !this.range || !this.range.length ) {
+				this.range = $( "<div></div>" )
+					.appendTo( this.element );
+
+				classes = "ui-slider-range" +
+				// note: this isn't the most fittingly semantic framework class for this element,
+				// but worked best visually with a variety of themes
+				" ui-widget-header ui-corner-all";
+			} else {
+				this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
+					// Handle range switching from true to min/max
+					.css({
+						"left": "",
+						"bottom": ""
+					});
+			}
+
+			this.range.addClass( classes +
+				( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
+		} else {
+			if ( this.range ) {
+				this.range.remove();
+			}
+			this.range = null;
+		}
+	},
+
+	_setupEvents: function() {
+		this._off( this.handles );
+		this._on( this.handles, this._handleEvents );
+		this._hoverable( this.handles );
+		this._focusable( this.handles );
+	},
+
+	_destroy: function() {
+		this.handles.remove();
+		if ( this.range ) {
+			this.range.remove();
+		}
+
+		this.element
+			.removeClass( "ui-slider" +
+				" ui-slider-horizontal" +
+				" ui-slider-vertical" +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all" );
+
+		this._mouseDestroy();
+	},
+
+	_mouseCapture: function( event ) {
+		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
+			that = this,
+			o = this.options;
+
+		if ( o.disabled ) {
+			return false;
+		}
+
+		this.elementSize = {
+			width: this.element.outerWidth(),
+			height: this.element.outerHeight()
+		};
+		this.elementOffset = this.element.offset();
+
+		position = { x: event.pageX, y: event.pageY };
+		normValue = this._normValueFromMouse( position );
+		distance = this._valueMax() - this._valueMin() + 1;
+		this.handles.each(function( i ) {
+			var thisDistance = Math.abs( normValue - that.values(i) );
+			if (( distance > thisDistance ) ||
+				( distance === thisDistance &&
+					(i === that._lastChangedValue || that.values(i) === o.min ))) {
+				distance = thisDistance;
+				closestHandle = $( this );
+				index = i;
+			}
+		});
+
+		allowed = this._start( event, index );
+		if ( allowed === false ) {
+			return false;
+		}
+		this._mouseSliding = true;
+
+		this._handleIndex = index;
+
+		closestHandle
+			.addClass( "ui-state-active" )
+			.focus();
+
+		offset = closestHandle.offset();
+		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
+		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+			top: event.pageY - offset.top -
+				( closestHandle.height() / 2 ) -
+				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+		};
+
+		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+			this._slide( event, index, normValue );
+		}
+		this._animateOff = true;
+		return true;
+	},
+
+	_mouseStart: function() {
+		return true;
+	},
+
+	_mouseDrag: function( event ) {
+		var position = { x: event.pageX, y: event.pageY },
+			normValue = this._normValueFromMouse( position );
+
+		this._slide( event, this._handleIndex, normValue );
+
+		return false;
+	},
+
+	_mouseStop: function( event ) {
+		this.handles.removeClass( "ui-state-active" );
+		this._mouseSliding = false;
+
+		this._stop( event, this._handleIndex );
+		this._change( event, this._handleIndex );
+
+		this._handleIndex = null;
+		this._clickOffset = null;
+		this._animateOff = false;
+
+		return false;
+	},
+
+	_detectOrientation: function() {
+		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+	},
+
+	_normValueFromMouse: function( position ) {
+		var pixelTotal,
+			pixelMouse,
+			percentMouse,
+			valueTotal,
+			valueMouse;
+
+		if ( this.orientation === "horizontal" ) {
+			pixelTotal = this.elementSize.width;
+			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+		} else {
+			pixelTotal = this.elementSize.height;
+			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+		}
+
+		percentMouse = ( pixelMouse / pixelTotal );
+		if ( percentMouse > 1 ) {
+			percentMouse = 1;
+		}
+		if ( percentMouse < 0 ) {
+			percentMouse = 0;
+		}
+		if ( this.orientation === "vertical" ) {
+			percentMouse = 1 - percentMouse;
+		}
+
+		valueTotal = this._valueMax() - this._valueMin();
+		valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+		return this._trimAlignValue( valueMouse );
+	},
+
+	_start: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+		return this._trigger( "start", event, uiHash );
+	},
+
+	_slide: function( event, index, newVal ) {
+		var otherVal,
+			newValues,
+			allowed;
+
+		if ( this.options.values && this.options.values.length ) {
+			otherVal = this.values( index ? 0 : 1 );
+
+			if ( ( this.options.values.length === 2 && this.options.range === true ) &&
+					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+				) {
+				newVal = otherVal;
+			}
+
+			if ( newVal !== this.values( index ) ) {
+				newValues = this.values();
+				newValues[ index ] = newVal;
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal,
+					values: newValues
+				} );
+				otherVal = this.values( index ? 0 : 1 );
+				if ( allowed !== false ) {
+					this.values( index, newVal );
+				}
+			}
+		} else {
+			if ( newVal !== this.value() ) {
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal
+				} );
+				if ( allowed !== false ) {
+					this.value( newVal );
+				}
+			}
+		}
+	},
+
+	_stop: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+
+		this._trigger( "stop", event, uiHash );
+	},
+
+	_change: function( event, index ) {
+		if ( !this._keySliding && !this._mouseSliding ) {
+			var uiHash = {
+				handle: this.handles[ index ],
+				value: this.value()
+			};
+			if ( this.options.values && this.options.values.length ) {
+				uiHash.value = this.values( index );
+				uiHash.values = this.values();
+			}
+
+			//store the last changed value index for reference when handles overlap
+			this._lastChangedValue = index;
+
+			this._trigger( "change", event, uiHash );
+		}
+	},
+
+	value: function( newValue ) {
+		if ( arguments.length ) {
+			this.options.value = this._trimAlignValue( newValue );
+			this._refreshValue();
+			this._change( null, 0 );
+			return;
+		}
+
+		return this._value();
+	},
+
+	values: function( index, newValue ) {
+		var vals,
+			newValues,
+			i;
+
+		if ( arguments.length > 1 ) {
+			this.options.values[ index ] = this._trimAlignValue( newValue );
+			this._refreshValue();
+			this._change( null, index );
+			return;
+		}
+
+		if ( arguments.length ) {
+			if ( $.isArray( arguments[ 0 ] ) ) {
+				vals = this.options.values;
+				newValues = arguments[ 0 ];
+				for ( i = 0; i < vals.length; i += 1 ) {
+					vals[ i ] = this._trimAlignValue( newValues[ i ] );
+					this._change( null, i );
+				}
+				this._refreshValue();
+			} else {
+				if ( this.options.values && this.options.values.length ) {
+					return this._values( index );
+				} else {
+					return this.value();
+				}
+			}
+		} else {
+			return this._values();
+		}
+	},
+
+	_setOption: function( key, value ) {
+		var i,
+			valsLength = 0;
+
+		if ( key === "range" && this.options.range === true ) {
+			if ( value === "min" ) {
+				this.options.value = this._values( 0 );
+				this.options.values = null;
+			} else if ( value === "max" ) {
+				this.options.value = this._values( this.options.values.length - 1 );
+				this.options.values = null;
+			}
+		}
+
+		if ( $.isArray( this.options.values ) ) {
+			valsLength = this.options.values.length;
+		}
+
+		if ( key === "disabled" ) {
+			this.element.toggleClass( "ui-state-disabled", !!value );
+		}
+
+		this._super( key, value );
+
+		switch ( key ) {
+			case "orientation":
+				this._detectOrientation();
+				this.element
+					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
+					.addClass( "ui-slider-" + this.orientation );
+				this._refreshValue();
+
+				// Reset positioning from previous orientation
+				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
+				break;
+			case "value":
+				this._animateOff = true;
+				this._refreshValue();
+				this._change( null, 0 );
+				this._animateOff = false;
+				break;
+			case "values":
+				this._animateOff = true;
+				this._refreshValue();
+				for ( i = 0; i < valsLength; i += 1 ) {
+					this._change( null, i );
+				}
+				this._animateOff = false;
+				break;
+			case "step":
+			case "min":
+			case "max":
+				this._animateOff = true;
+				this._calculateNewMax();
+				this._refreshValue();
+				this._animateOff = false;
+				break;
+			case "range":
+				this._animateOff = true;
+				this._refresh();
+				this._animateOff = false;
+				break;
+		}
+	},
+
+	//internal value getter
+	// _value() returns value trimmed by min and max, aligned by step
+	_value: function() {
+		var val = this.options.value;
+		val = this._trimAlignValue( val );
+
+		return val;
+	},
+
+	//internal values getter
+	// _values() returns array of values trimmed by min and max, aligned by step
+	// _values( index ) returns single value trimmed by min and max, aligned by step
+	_values: function( index ) {
+		var val,
+			vals,
+			i;
+
+		if ( arguments.length ) {
+			val = this.options.values[ index ];
+			val = this._trimAlignValue( val );
+
+			return val;
+		} else if ( this.options.values && this.options.values.length ) {
+			// .slice() creates a copy of the array
+			// this copy gets trimmed by min and max and then returned
+			vals = this.options.values.slice();
+			for ( i = 0; i < vals.length; i += 1) {
+				vals[ i ] = this._trimAlignValue( vals[ i ] );
+			}
+
+			return vals;
+		} else {
+			return [];
+		}
+	},
+
+	// returns the step-aligned value that val is closest to, between (inclusive) min and max
+	_trimAlignValue: function( val ) {
+		if ( val <= this._valueMin() ) {
+			return this._valueMin();
+		}
+		if ( val >= this._valueMax() ) {
+			return this._valueMax();
+		}
+		var step = ( this.options.step > 0 ) ? this.options.step : 1,
+			valModStep = (val - this._valueMin()) % step,
+			alignValue = val - valModStep;
+
+		if ( Math.abs(valModStep) * 2 >= step ) {
+			alignValue += ( valModStep > 0 ) ? step : ( -step );
+		}
+
+		// Since JavaScript has problems with large floats, round
+		// the final value to 5 digits after the decimal point (see #4124)
+		return parseFloat( alignValue.toFixed(5) );
+	},
+
+	_calculateNewMax: function() {
+		var max = this.options.max,
+			min = this._valueMin(),
+			step = this.options.step,
+			aboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step;
+		max = aboveMin + min;
+		this.max = parseFloat( max.toFixed( this._precision() ) );
+	},
+
+	_precision: function() {
+		var precision = this._precisionOf( this.options.step );
+		if ( this.options.min !== null ) {
+			precision = Math.max( precision, this._precisionOf( this.options.min ) );
+		}
+		return precision;
+	},
+
+	_precisionOf: function( num ) {
+		var str = num.toString(),
+			decimal = str.indexOf( "." );
+		return decimal === -1 ? 0 : str.length - decimal - 1;
+	},
+
+	_valueMin: function() {
+		return this.options.min;
+	},
+
+	_valueMax: function() {
+		return this.max;
+	},
+
+	_refreshValue: function() {
+		var lastValPercent, valPercent, value, valueMin, valueMax,
+			oRange = this.options.range,
+			o = this.options,
+			that = this,
+			animate = ( !this._animateOff ) ? o.animate : false,
+			_set = {};
+
+		if ( this.options.values && this.options.values.length ) {
+			this.handles.each(function( i ) {
+				valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
+				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+				if ( that.options.range === true ) {
+					if ( that.orientation === "horizontal" ) {
+						if ( i === 0 ) {
+							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+						}
+						if ( i === 1 ) {
+							that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+						}
+					} else {
+						if ( i === 0 ) {
+							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+						}
+						if ( i === 1 ) {
+							that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+						}
+					}
+				}
+				lastValPercent = valPercent;
+			});
+		} else {
+			value = this.value();
+			valueMin = this._valueMin();
+			valueMax = this._valueMax();
+			valPercent = ( valueMax !== valueMin ) ?
+					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+					0;
+			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+			if ( oRange === "min" && this.orientation === "horizontal" ) {
+				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+			}
+			if ( oRange === "max" && this.orientation === "horizontal" ) {
+				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+			}
+			if ( oRange === "min" && this.orientation === "vertical" ) {
+				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+			}
+			if ( oRange === "max" && this.orientation === "vertical" ) {
+				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+			}
+		}
+	},
+
+	_handleEvents: {
+		keydown: function( event ) {
+			var allowed, curVal, newVal, step,
+				index = $( event.target ).data( "ui-slider-handle-index" );
+
+			switch ( event.keyCode ) {
+				case $.ui.keyCode.HOME:
+				case $.ui.keyCode.END:
+				case $.ui.keyCode.PAGE_UP:
+				case $.ui.keyCode.PAGE_DOWN:
+				case $.ui.keyCode.UP:
+				case $.ui.keyCode.RIGHT:
+				case $.ui.keyCode.DOWN:
+				case $.ui.keyCode.LEFT:
+					event.preventDefault();
+					if ( !this._keySliding ) {
+						this._keySliding = true;
+						$( event.target ).addClass( "ui-state-active" );
+						allowed = this._start( event, index );
+						if ( allowed === false ) {
+							return;
+						}
+					}
+					break;
+			}
+
+			step = this.options.step;
+			if ( this.options.values && this.options.values.length ) {
+				curVal = newVal = this.values( index );
+			} else {
+				curVal = newVal = this.value();
+			}
+
+			switch ( event.keyCode ) {
+				case $.ui.keyCode.HOME:
+					newVal = this._valueMin();
+					break;
+				case $.ui.keyCode.END:
+					newVal = this._valueMax();
+					break;
+				case $.ui.keyCode.PAGE_UP:
+					newVal = this._trimAlignValue(
+						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
+					);
+					break;
+				case $.ui.keyCode.PAGE_DOWN:
+					newVal = this._trimAlignValue(
+						curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );
+					break;
+				case $.ui.keyCode.UP:
+				case $.ui.keyCode.RIGHT:
+					if ( curVal === this._valueMax() ) {
+						return;
+					}
+					newVal = this._trimAlignValue( curVal + step );
+					break;
+				case $.ui.keyCode.DOWN:
+				case $.ui.keyCode.LEFT:
+					if ( curVal === this._valueMin() ) {
+						return;
+					}
+					newVal = this._trimAlignValue( curVal - step );
+					break;
+			}
+
+			this._slide( event, index, newVal );
+		},
+		keyup: function( event ) {
+			var index = $( event.target ).data( "ui-slider-handle-index" );
+
+			if ( this._keySliding ) {
+				this._keySliding = false;
+				this._stop( event, index );
+				this._change( event, index );
+				$( event.target ).removeClass( "ui-state-active" );
+			}
+		}
+	}
+});
+
+
+/*!
+ * jQuery UI Spinner 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/spinner/
+ */
+
+
+function spinner_modifier( fn ) {
+	return function() {
+		var previous = this.element.val();
+		fn.apply( this, arguments );
+		this._refresh();
+		if ( previous !== this.element.val() ) {
+			this._trigger( "change" );
+		}
+	};
+}
+
+var spinner = $.widget( "ui.spinner", {
+	version: "1.11.4",
+	defaultElement: "<input>",
+	widgetEventPrefix: "spin",
+	options: {
+		culture: null,
+		icons: {
+			down: "ui-icon-triangle-1-s",
+			up: "ui-icon-triangle-1-n"
+		},
+		incremental: true,
+		max: null,
+		min: null,
+		numberFormat: null,
+		page: 10,
+		step: 1,
+
+		change: null,
+		spin: null,
+		start: null,
+		stop: null
+	},
+
+	_create: function() {
+		// handle string values that need to be parsed
+		this._setOption( "max", this.options.max );
+		this._setOption( "min", this.options.min );
+		this._setOption( "step", this.options.step );
+
+		// Only format if there is a value, prevents the field from being marked
+		// as invalid in Firefox, see #9573.
+		if ( this.value() !== "" ) {
+			// Format the value, but don't constrain.
+			this._value( this.element.val(), true );
+		}
+
+		this._draw();
+		this._on( this._events );
+		this._refresh();
+
+		// turning off autocomplete prevents the browser from remembering the
+		// value when navigating through history, so we re-enable autocomplete
+		// if the page is unloaded before the widget is destroyed. #7790
+		this._on( this.window, {
+			beforeunload: function() {
+				this.element.removeAttr( "autocomplete" );
+			}
+		});
+	},
+
+	_getCreateOptions: function() {
+		var options = {},
+			element = this.element;
+
+		$.each( [ "min", "max", "step" ], function( i, option ) {
+			var value = element.attr( option );
+			if ( value !== undefined && value.length ) {
+				options[ option ] = value;
+			}
+		});
+
+		return options;
+	},
+
+	_events: {
+		keydown: function( event ) {
+			if ( this._start( event ) && this._keydown( event ) ) {
+				event.preventDefault();
+			}
+		},
+		keyup: "_stop",
+		focus: function() {
+			this.previous = this.element.val();
+		},
+		blur: function( event ) {
+			if ( this.cancelBlur ) {
+				delete this.cancelBlur;
+				return;
+			}
+
+			this._stop();
+			this._refresh();
+			if ( this.previous !== this.element.val() ) {
+				this._trigger( "change", event );
+			}
+		},
+		mousewheel: function( event, delta ) {
+			if ( !delta ) {
+				return;
+			}
+			if ( !this.spinning && !this._start( event ) ) {
+				return false;
+			}
+
+			this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
+			clearTimeout( this.mousewheelTimer );
+			this.mousewheelTimer = this._delay(function() {
+				if ( this.spinning ) {
+					this._stop( event );
+				}
+			}, 100 );
+			event.preventDefault();
+		},
+		"mousedown .ui-spinner-button": function( event ) {
+			var previous;
+
+			// We never want the buttons to have focus; whenever the user is
+			// interacting with the spinner, the focus should be on the input.
+			// If the input is focused then this.previous is properly set from
+			// when the input first received focus. If the input is not focused
+			// then we need to set this.previous based on the value before spinning.
+			previous = this.element[0] === this.document[0].activeElement ?
+				this.previous : this.element.val();
+			function checkFocus() {
+				var isActive = this.element[0] === this.document[0].activeElement;
+				if ( !isActive ) {
+					this.element.focus();
+					this.previous = previous;
+					// support: IE
+					// IE sets focus asynchronously, so we need to check if focus
+					// moved off of the input because the user clicked on the button.
+					this._delay(function() {
+						this.previous = previous;
+					});
+				}
+			}
+
+			// ensure focus is on (or stays on) the text field
+			event.preventDefault();
+			checkFocus.call( this );
+
+			// support: IE
+			// IE doesn't prevent moving focus even with event.preventDefault()
+			// so we set a flag to know when we should ignore the blur event
+			// and check (again) if focus moved off of the input.
+			this.cancelBlur = true;
+			this._delay(function() {
+				delete this.cancelBlur;
+				checkFocus.call( this );
+			});
+
+			if ( this._start( event ) === false ) {
+				return;
+			}
+
+			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
+		},
+		"mouseup .ui-spinner-button": "_stop",
+		"mouseenter .ui-spinner-button": function( event ) {
+			// button will add ui-state-active if mouse was down while mouseleave and kept down
+			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
+				return;
+			}
+
+			if ( this._start( event ) === false ) {
+				return false;
+			}
+			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
+		},
+		// TODO: do we really want to consider this a stop?
+		// shouldn't we just stop the repeater and wait until mouseup before
+		// we trigger the stop event?
+		"mouseleave .ui-spinner-button": "_stop"
+	},
+
+	_draw: function() {
+		var uiSpinner = this.uiSpinner = this.element
+			.addClass( "ui-spinner-input" )
+			.attr( "autocomplete", "off" )
+			.wrap( this._uiSpinnerHtml() )
+			.parent()
+				// add buttons
+				.append( this._buttonHtml() );
+
+		this.element.attr( "role", "spinbutton" );
+
+		// button bindings
+		this.buttons = uiSpinner.find( ".ui-spinner-button" )
+			.attr( "tabIndex", -1 )
+			.button()
+			.removeClass( "ui-corner-all" );
+
+		// IE 6 doesn't understand height: 50% for the buttons
+		// unless the wrapper has an explicit height
+		if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
+				uiSpinner.height() > 0 ) {
+			uiSpinner.height( uiSpinner.height() );
+		}
+
+		// disable spinner if element was already disabled
+		if ( this.options.disabled ) {
+			this.disable();
+		}
+	},
+
+	_keydown: function( event ) {
+		var options = this.options,
+			keyCode = $.ui.keyCode;
+
+		switch ( event.keyCode ) {
+		case keyCode.UP:
+			this._repeat( null, 1, event );
+			return true;
+		case keyCode.DOWN:
+			this._repeat( null, -1, event );
+			return true;
+		case keyCode.PAGE_UP:
+			this._repeat( null, options.page, event );
+			return true;
+		case keyCode.PAGE_DOWN:
+			this._repeat( null, -options.page, event );
+			return true;
+		}
+
+		return false;
+	},
+
+	_uiSpinnerHtml: function() {
+		return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
+	},
+
+	_buttonHtml: function() {
+		return "" +
+			"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
+				"<span class='ui-icon " + this.options.icons.up + "'>▲</span>" +
+			"</a>" +
+			"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
+				"<span class='ui-icon " + this.options.icons.down + "'>▼</span>" +
+			"</a>";
+	},
+
+	_start: function( event ) {
+		if ( !this.spinning && this._trigger( "start", event ) === false ) {
+			return false;
+		}
+
+		if ( !this.counter ) {
+			this.counter = 1;
+		}
+		this.spinning = true;
+		return true;
+	},
+
+	_repeat: function( i, steps, event ) {
+		i = i || 500;
+
+		clearTimeout( this.timer );
+		this.timer = this._delay(function() {
+			this._repeat( 40, steps, event );
+		}, i );
+
+		this._spin( steps * this.options.step, event );
+	},
+
+	_spin: function( step, event ) {
+		var value = this.value() || 0;
+
+		if ( !this.counter ) {
+			this.counter = 1;
+		}
+
+		value = this._adjustValue( value + step * this._increment( this.counter ) );
+
+		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
+			this._value( value );
+			this.counter++;
+		}
+	},
+
+	_increment: function( i ) {
+		var incremental = this.options.incremental;
+
+		if ( incremental ) {
+			return $.isFunction( incremental ) ?
+				incremental( i ) :
+				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
+		}
+
+		return 1;
+	},
+
+	_precision: function() {
+		var precision = this._precisionOf( this.options.step );
+		if ( this.options.min !== null ) {
+			precision = Math.max( precision, this._precisionOf( this.options.min ) );
+		}
+		return precision;
+	},
+
+	_precisionOf: function( num ) {
+		var str = num.toString(),
+			decimal = str.indexOf( "." );
+		return decimal === -1 ? 0 : str.length - decimal - 1;
+	},
+
+	_adjustValue: function( value ) {
+		var base, aboveMin,
+			options = this.options;
+
+		// make sure we're at a valid step
+		// - find out where we are relative to the base (min or 0)
+		base = options.min !== null ? options.min : 0;
+		aboveMin = value - base;
+		// - round to the nearest step
+		aboveMin = Math.round(aboveMin / options.step) * options.step;
+		// - rounding is based on 0, so adjust back to our base
+		value = base + aboveMin;
+
+		// fix precision from bad JS floating point math
+		value = parseFloat( value.toFixed( this._precision() ) );
+
+		// clamp the value
+		if ( options.max !== null && value > options.max) {
+			return options.max;
+		}
+		if ( options.min !== null && value < options.min ) {
+			return options.min;
+		}
+
+		return value;
+	},
+
+	_stop: function( event ) {
+		if ( !this.spinning ) {
+			return;
+		}
+
+		clearTimeout( this.timer );
+		clearTimeout( this.mousewheelTimer );
+		this.counter = 0;
+		this.spinning = false;
+		this._trigger( "stop", event );
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "culture" || key === "numberFormat" ) {
+			var prevValue = this._parse( this.element.val() );
+			this.options[ key ] = value;
+			this.element.val( this._format( prevValue ) );
+			return;
+		}
+
+		if ( key === "max" || key === "min" || key === "step" ) {
+			if ( typeof value === "string" ) {
+				value = this._parse( value );
+			}
+		}
+		if ( key === "icons" ) {
+			this.buttons.first().find( ".ui-icon" )
+				.removeClass( this.options.icons.up )
+				.addClass( value.up );
+			this.buttons.last().find( ".ui-icon" )
+				.removeClass( this.options.icons.down )
+				.addClass( value.down );
+		}
+
+		this._super( key, value );
+
+		if ( key === "disabled" ) {
+			this.widget().toggleClass( "ui-state-disabled", !!value );
+			this.element.prop( "disabled", !!value );
+			this.buttons.button( value ? "disable" : "enable" );
+		}
+	},
+
+	_setOptions: spinner_modifier(function( options ) {
+		this._super( options );
+	}),
+
+	_parse: function( val ) {
+		if ( typeof val === "string" && val !== "" ) {
+			val = window.Globalize && this.options.numberFormat ?
+				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
+		}
+		return val === "" || isNaN( val ) ? null : val;
+	},
+
+	_format: function( value ) {
+		if ( value === "" ) {
+			return "";
+		}
+		return window.Globalize && this.options.numberFormat ?
+			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
+			value;
+	},
+
+	_refresh: function() {
+		this.element.attr({
+			"aria-valuemin": this.options.min,
+			"aria-valuemax": this.options.max,
+			// TODO: what should we do with values that can't be parsed?
+			"aria-valuenow": this._parse( this.element.val() )
+		});
+	},
+
+	isValid: function() {
+		var value = this.value();
+
+		// null is invalid
+		if ( value === null ) {
+			return false;
+		}
+
+		// if value gets adjusted, it's invalid
+		return value === this._adjustValue( value );
+	},
+
+	// update the value without triggering change
+	_value: function( value, allowAny ) {
+		var parsed;
+		if ( value !== "" ) {
+			parsed = this._parse( value );
+			if ( parsed !== null ) {
+				if ( !allowAny ) {
+					parsed = this._adjustValue( parsed );
+				}
+				value = this._format( parsed );
+			}
+		}
+		this.element.val( value );
+		this._refresh();
+	},
+
+	_destroy: function() {
+		this.element
+			.removeClass( "ui-spinner-input" )
+			.prop( "disabled", false )
+			.removeAttr( "autocomplete" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-valuemin" )
+			.removeAttr( "aria-valuemax" )
+			.removeAttr( "aria-valuenow" );
+		this.uiSpinner.replaceWith( this.element );
+	},
+
+	stepUp: spinner_modifier(function( steps ) {
+		this._stepUp( steps );
+	}),
+	_stepUp: function( steps ) {
+		if ( this._start() ) {
+			this._spin( (steps || 1) * this.options.step );
+			this._stop();
+		}
+	},
+
+	stepDown: spinner_modifier(function( steps ) {
+		this._stepDown( steps );
+	}),
+	_stepDown: function( steps ) {
+		if ( this._start() ) {
+			this._spin( (steps || 1) * -this.options.step );
+			this._stop();
+		}
+	},
+
+	pageUp: spinner_modifier(function( pages ) {
+		this._stepUp( (pages || 1) * this.options.page );
+	}),
+
+	pageDown: spinner_modifier(function( pages ) {
+		this._stepDown( (pages || 1) * this.options.page );
+	}),
+
+	value: function( newVal ) {
+		if ( !arguments.length ) {
+			return this._parse( this.element.val() );
+		}
+		spinner_modifier( this._value ).call( this, newVal );
+	},
+
+	widget: function() {
+		return this.uiSpinner;
+	}
+});
+
+
+/*!
+ * jQuery UI Tabs 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/tabs/
+ */
+
+
+var tabs = $.widget( "ui.tabs", {
+	version: "1.11.4",
+	delay: 300,
+	options: {
+		active: null,
+		collapsible: false,
+		event: "click",
+		heightStyle: "content",
+		hide: null,
+		show: null,
+
+		// callbacks
+		activate: null,
+		beforeActivate: null,
+		beforeLoad: null,
+		load: null
+	},
+
+	_isLocal: (function() {
+		var rhash = /#.*$/;
+
+		return function( anchor ) {
+			var anchorUrl, locationUrl;
+
+			// support: IE7
+			// IE7 doesn't normalize the href property when set via script (#9317)
+			anchor = anchor.cloneNode( false );
+
+			anchorUrl = anchor.href.replace( rhash, "" );
+			locationUrl = location.href.replace( rhash, "" );
+
+			// decoding may throw an error if the URL isn't UTF-8 (#9518)
+			try {
+				anchorUrl = decodeURIComponent( anchorUrl );
+			} catch ( error ) {}
+			try {
+				locationUrl = decodeURIComponent( locationUrl );
+			} catch ( error ) {}
+
+			return anchor.hash.length > 1 && anchorUrl === locationUrl;
+		};
+	})(),
+
+	_create: function() {
+		var that = this,
+			options = this.options;
+
+		this.running = false;
+
+		this.element
+			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
+			.toggleClass( "ui-tabs-collapsible", options.collapsible );
+
+		this._processTabs();
+		options.active = this._initialActive();
+
+		// Take disabling tabs via class attribute from HTML
+		// into account and update option properly.
+		if ( $.isArray( options.disabled ) ) {
+			options.disabled = $.unique( options.disabled.concat(
+				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
+					return that.tabs.index( li );
+				})
+			) ).sort();
+		}
+
+		// check for length avoids error when initializing empty list
+		if ( this.options.active !== false && this.anchors.length ) {
+			this.active = this._findActive( options.active );
+		} else {
+			this.active = $();
+		}
+
+		this._refresh();
+
+		if ( this.active.length ) {
+			this.load( options.active );
+		}
+	},
+
+	_initialActive: function() {
+		var active = this.options.active,
+			collapsible = this.options.collapsible,
+			locationHash = location.hash.substring( 1 );
+
+		if ( active === null ) {
+			// check the fragment identifier in the URL
+			if ( locationHash ) {
+				this.tabs.each(function( i, tab ) {
+					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
+						active = i;
+						return false;
+					}
+				});
+			}
+
+			// check for a tab marked active via a class
+			if ( active === null ) {
+				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
+			}
+
+			// no active tab, set to false
+			if ( active === null || active === -1 ) {
+				active = this.tabs.length ? 0 : false;
+			}
+		}
+
+		// handle numbers: negative, out of range
+		if ( active !== false ) {
+			active = this.tabs.index( this.tabs.eq( active ) );
+			if ( active === -1 ) {
+				active = collapsible ? false : 0;
+			}
+		}
+
+		// don't allow collapsible: false and active: false
+		if ( !collapsible && active === false && this.anchors.length ) {
+			active = 0;
+		}
+
+		return active;
+	},
+
+	_getCreateEventData: function() {
+		return {
+			tab: this.active,
+			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
+		};
+	},
+
+	_tabKeydown: function( event ) {
+		var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
+			selectedIndex = this.tabs.index( focusedTab ),
+			goingForward = true;
+
+		if ( this._handlePageNav( event ) ) {
+			return;
+		}
+
+		switch ( event.keyCode ) {
+			case $.ui.keyCode.RIGHT:
+			case $.ui.keyCode.DOWN:
+				selectedIndex++;
+				break;
+			case $.ui.keyCode.UP:
+			case $.ui.keyCode.LEFT:
+				goingForward = false;
+				selectedIndex--;
+				break;
+			case $.ui.keyCode.END:
+				selectedIndex = this.anchors.length - 1;
+				break;
+			case $.ui.keyCode.HOME:
+				selectedIndex = 0;
+				break;
+			case $.ui.keyCode.SPACE:
+				// Activate only, no collapsing
+				event.preventDefault();
+				clearTimeout( this.activating );
+				this._activate( selectedIndex );
+				return;
+			case $.ui.keyCode.ENTER:
+				// Toggle (cancel delayed activation, allow collapsing)
+				event.preventDefault();
+				clearTimeout( this.activating );
+				// Determine if we should collapse or activate
+				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
+				return;
+			default:
+				return;
+		}
+
+		// Focus the appropriate tab, based on which key was pressed
+		event.preventDefault();
+		clearTimeout( this.activating );
+		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
+
+		// Navigating with control/command key will prevent automatic activation
+		if ( !event.ctrlKey && !event.metaKey ) {
+
+			// Update aria-selected immediately so that AT think the tab is already selected.
+			// Otherwise AT may confuse the user by stating that they need to activate the tab,
+			// but the tab will already be activated by the time the announcement finishes.
+			focusedTab.attr( "aria-selected", "false" );
+			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
+
+			this.activating = this._delay(function() {
+				this.option( "active", selectedIndex );
+			}, this.delay );
+		}
+	},
+
+	_panelKeydown: function( event ) {
+		if ( this._handlePageNav( event ) ) {
+			return;
+		}
+
+		// Ctrl+up moves focus to the current tab
+		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
+			event.preventDefault();
+			this.active.focus();
+		}
+	},
+
+	// Alt+page up/down moves focus to the previous/next tab (and activates)
+	_handlePageNav: function( event ) {
+		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
+			this._activate( this._focusNextTab( this.options.active - 1, false ) );
+			return true;
+		}
+		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
+			this._activate( this._focusNextTab( this.options.active + 1, true ) );
+			return true;
+		}
+	},
+
+	_findNextTab: function( index, goingForward ) {
+		var lastTabIndex = this.tabs.length - 1;
+
+		function constrain() {
+			if ( index > lastTabIndex ) {
+				index = 0;
+			}
+			if ( index < 0 ) {
+				index = lastTabIndex;
+			}
+			return index;
+		}
+
+		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
+			index = goingForward ? index + 1 : index - 1;
+		}
+
+		return index;
+	},
+
+	_focusNextTab: function( index, goingForward ) {
+		index = this._findNextTab( index, goingForward );
+		this.tabs.eq( index ).focus();
+		return index;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "active" ) {
+			// _activate() will handle invalid values and update this.options
+			this._activate( value );
+			return;
+		}
+
+		if ( key === "disabled" ) {
+			// don't use the widget factory's disabled handling
+			this._setupDisabled( value );
+			return;
+		}
+
+		this._super( key, value);
+
+		if ( key === "collapsible" ) {
+			this.element.toggleClass( "ui-tabs-collapsible", value );
+			// Setting collapsible: false while collapsed; open first panel
+			if ( !value && this.options.active === false ) {
+				this._activate( 0 );
+			}
+		}
+
+		if ( key === "event" ) {
+			this._setupEvents( value );
+		}
+
+		if ( key === "heightStyle" ) {
+			this._setupHeightStyle( value );
+		}
+	},
+
+	_sanitizeSelector: function( hash ) {
+		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
+	},
+
+	refresh: function() {
+		var options = this.options,
+			lis = this.tablist.children( ":has(a[href])" );
+
+		// get disabled tabs from class attribute from HTML
+		// this will get converted to a boolean if needed in _refresh()
+		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
+			return lis.index( tab );
+		});
+
+		this._processTabs();
+
+		// was collapsed or no tabs
+		if ( options.active === false || !this.anchors.length ) {
+			options.active = false;
+			this.active = $();
+		// was active, but active tab is gone
+		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
+			// all remaining tabs are disabled
+			if ( this.tabs.length === options.disabled.length ) {
+				options.active = false;
+				this.active = $();
+			// activate previous tab
+			} else {
+				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
+			}
+		// was active, active tab still exists
+		} else {
+			// make sure active index is correct
+			options.active = this.tabs.index( this.active );
+		}
+
+		this._refresh();
+	},
+
+	_refresh: function() {
+		this._setupDisabled( this.options.disabled );
+		this._setupEvents( this.options.event );
+		this._setupHeightStyle( this.options.heightStyle );
+
+		this.tabs.not( this.active ).attr({
+			"aria-selected": "false",
+			"aria-expanded": "false",
+			tabIndex: -1
+		});
+		this.panels.not( this._getPanelForTab( this.active ) )
+			.hide()
+			.attr({
+				"aria-hidden": "true"
+			});
+
+		// Make sure one tab is in the tab order
+		if ( !this.active.length ) {
+			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
+		} else {
+			this.active
+				.addClass( "ui-tabs-active ui-state-active" )
+				.attr({
+					"aria-selected": "true",
+					"aria-expanded": "true",
+					tabIndex: 0
+				});
+			this._getPanelForTab( this.active )
+				.show()
+				.attr({
+					"aria-hidden": "false"
+				});
+		}
+	},
+
+	_processTabs: function() {
+		var that = this,
+			prevTabs = this.tabs,
+			prevAnchors = this.anchors,
+			prevPanels = this.panels;
+
+		this.tablist = this._getList()
+			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+			.attr( "role", "tablist" )
+
+			// Prevent users from focusing disabled tabs via click
+			.delegate( "> li", "mousedown" + this.eventNamespace, function( event ) {
+				if ( $( this ).is( ".ui-state-disabled" ) ) {
+					event.preventDefault();
+				}
+			})
+
+			// support: IE <9
+			// Preventing the default action in mousedown doesn't prevent IE
+			// from focusing the element, so if the anchor gets focused, blur.
+			// We don't have to worry about focusing the previously focused
+			// element since clicking on a non-focusable element should focus
+			// the body anyway.
+			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
+				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
+					this.blur();
+				}
+			});
+
+		this.tabs = this.tablist.find( "> li:has(a[href])" )
+			.addClass( "ui-state-default ui-corner-top" )
+			.attr({
+				role: "tab",
+				tabIndex: -1
+			});
+
+		this.anchors = this.tabs.map(function() {
+				return $( "a", this )[ 0 ];
+			})
+			.addClass( "ui-tabs-anchor" )
+			.attr({
+				role: "presentation",
+				tabIndex: -1
+			});
+
+		this.panels = $();
+
+		this.anchors.each(function( i, anchor ) {
+			var selector, panel, panelId,
+				anchorId = $( anchor ).uniqueId().attr( "id" ),
+				tab = $( anchor ).closest( "li" ),
+				originalAriaControls = tab.attr( "aria-controls" );
+
+			// inline tab
+			if ( that._isLocal( anchor ) ) {
+				selector = anchor.hash;
+				panelId = selector.substring( 1 );
+				panel = that.element.find( that._sanitizeSelector( selector ) );
+			// remote tab
+			} else {
+				// If the tab doesn't already have aria-controls,
+				// generate an id by using a throw-away element
+				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
+				selector = "#" + panelId;
+				panel = that.element.find( selector );
+				if ( !panel.length ) {
+					panel = that._createPanel( panelId );
+					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
+				}
+				panel.attr( "aria-live", "polite" );
+			}
+
+			if ( panel.length) {
+				that.panels = that.panels.add( panel );
+			}
+			if ( originalAriaControls ) {
+				tab.data( "ui-tabs-aria-controls", originalAriaControls );
+			}
+			tab.attr({
+				"aria-controls": panelId,
+				"aria-labelledby": anchorId
+			});
+			panel.attr( "aria-labelledby", anchorId );
+		});
+
+		this.panels
+			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+			.attr( "role", "tabpanel" );
+
+		// Avoid memory leaks (#10056)
+		if ( prevTabs ) {
+			this._off( prevTabs.not( this.tabs ) );
+			this._off( prevAnchors.not( this.anchors ) );
+			this._off( prevPanels.not( this.panels ) );
+		}
+	},
+
+	// allow overriding how to find the list for rare usage scenarios (#7715)
+	_getList: function() {
+		return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
+	},
+
+	_createPanel: function( id ) {
+		return $( "<div>" )
+			.attr( "id", id )
+			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+			.data( "ui-tabs-destroy", true );
+	},
+
+	_setupDisabled: function( disabled ) {
+		if ( $.isArray( disabled ) ) {
+			if ( !disabled.length ) {
+				disabled = false;
+			} else if ( disabled.length === this.anchors.length ) {
+				disabled = true;
+			}
+		}
+
+		// disable tabs
+		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
+			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
+				$( li )
+					.addClass( "ui-state-disabled" )
+					.attr( "aria-disabled", "true" );
+			} else {
+				$( li )
+					.removeClass( "ui-state-disabled" )
+					.removeAttr( "aria-disabled" );
+			}
+		}
+
+		this.options.disabled = disabled;
+	},
+
+	_setupEvents: function( event ) {
+		var events = {};
+		if ( event ) {
+			$.each( event.split(" "), function( index, eventName ) {
+				events[ eventName ] = "_eventHandler";
+			});
+		}
+
+		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
+		// Always prevent the default action, even when disabled
+		this._on( true, this.anchors, {
+			click: function( event ) {
+				event.preventDefault();
+			}
+		});
+		this._on( this.anchors, events );
+		this._on( this.tabs, { keydown: "_tabKeydown" } );
+		this._on( this.panels, { keydown: "_panelKeydown" } );
+
+		this._focusable( this.tabs );
+		this._hoverable( this.tabs );
+	},
+
+	_setupHeightStyle: function( heightStyle ) {
+		var maxHeight,
+			parent = this.element.parent();
+
+		if ( heightStyle === "fill" ) {
+			maxHeight = parent.height();
+			maxHeight -= this.element.outerHeight() - this.element.height();
+
+			this.element.siblings( ":visible" ).each(function() {
+				var elem = $( this ),
+					position = elem.css( "position" );
+
+				if ( position === "absolute" || position === "fixed" ) {
+					return;
+				}
+				maxHeight -= elem.outerHeight( true );
+			});
+
+			this.element.children().not( this.panels ).each(function() {
+				maxHeight -= $( this ).outerHeight( true );
+			});
+
+			this.panels.each(function() {
+				$( this ).height( Math.max( 0, maxHeight -
+					$( this ).innerHeight() + $( this ).height() ) );
+			})
+			.css( "overflow", "auto" );
+		} else if ( heightStyle === "auto" ) {
+			maxHeight = 0;
+			this.panels.each(function() {
+				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+			}).height( maxHeight );
+		}
+	},
+
+	_eventHandler: function( event ) {
+		var options = this.options,
+			active = this.active,
+			anchor = $( event.currentTarget ),
+			tab = anchor.closest( "li" ),
+			clickedIsActive = tab[ 0 ] === active[ 0 ],
+			collapsing = clickedIsActive && options.collapsible,
+			toShow = collapsing ? $() : this._getPanelForTab( tab ),
+			toHide = !active.length ? $() : this._getPanelForTab( active ),
+			eventData = {
+				oldTab: active,
+				oldPanel: toHide,
+				newTab: collapsing ? $() : tab,
+				newPanel: toShow
+			};
+
+		event.preventDefault();
+
+		if ( tab.hasClass( "ui-state-disabled" ) ||
+				// tab is already loading
+				tab.hasClass( "ui-tabs-loading" ) ||
+				// can't switch durning an animation
+				this.running ||
+				// click on active header, but not collapsible
+				( clickedIsActive && !options.collapsible ) ||
+				// allow canceling activation
+				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+			return;
+		}
+
+		options.active = collapsing ? false : this.tabs.index( tab );
+
+		this.active = clickedIsActive ? $() : tab;
+		if ( this.xhr ) {
+			this.xhr.abort();
+		}
+
+		if ( !toHide.length && !toShow.length ) {
+			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
+		}
+
+		if ( toShow.length ) {
+			this.load( this.tabs.index( tab ), event );
+		}
+		this._toggle( event, eventData );
+	},
+
+	// handles show/hide for selecting tabs
+	_toggle: function( event, eventData ) {
+		var that = this,
+			toShow = eventData.newPanel,
+			toHide = eventData.oldPanel;
+
+		this.running = true;
+
+		function complete() {
+			that.running = false;
+			that._trigger( "activate", event, eventData );
+		}
+
+		function show() {
+			eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
+
+			if ( toShow.length && that.options.show ) {
+				that._show( toShow, that.options.show, complete );
+			} else {
+				toShow.show();
+				complete();
+			}
+		}
+
+		// start out by hiding, then showing, then completing
+		if ( toHide.length && this.options.hide ) {
+			this._hide( toHide, this.options.hide, function() {
+				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+				show();
+			});
+		} else {
+			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+			toHide.hide();
+			show();
+		}
+
+		toHide.attr( "aria-hidden", "true" );
+		eventData.oldTab.attr({
+			"aria-selected": "false",
+			"aria-expanded": "false"
+		});
+		// If we're switching tabs, remove the old tab from the tab order.
+		// If we're opening from collapsed state, remove the previous tab from the tab order.
+		// If we're collapsing, then keep the collapsing tab in the tab order.
+		if ( toShow.length && toHide.length ) {
+			eventData.oldTab.attr( "tabIndex", -1 );
+		} else if ( toShow.length ) {
+			this.tabs.filter(function() {
+				return $( this ).attr( "tabIndex" ) === 0;
+			})
+			.attr( "tabIndex", -1 );
+		}
+
+		toShow.attr( "aria-hidden", "false" );
+		eventData.newTab.attr({
+			"aria-selected": "true",
+			"aria-expanded": "true",
+			tabIndex: 0
+		});
+	},
+
+	_activate: function( index ) {
+		var anchor,
+			active = this._findActive( index );
+
+		// trying to activate the already active panel
+		if ( active[ 0 ] === this.active[ 0 ] ) {
+			return;
+		}
+
+		// trying to collapse, simulate a click on the current active header
+		if ( !active.length ) {
+			active = this.active;
+		}
+
+		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
+		this._eventHandler({
+			target: anchor,
+			currentTarget: anchor,
+			preventDefault: $.noop
+		});
+	},
+
+	_findActive: function( index ) {
+		return index === false ? $() : this.tabs.eq( index );
+	},
+
+	_getIndex: function( index ) {
+		// meta-function to give users option to provide a href string instead of a numerical index.
+		if ( typeof index === "string" ) {
+			index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
+		}
+
+		return index;
+	},
+
+	_destroy: function() {
+		if ( this.xhr ) {
+			this.xhr.abort();
+		}
+
+		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
+
+		this.tablist
+			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+			.removeAttr( "role" );
+
+		this.anchors
+			.removeClass( "ui-tabs-anchor" )
+			.removeAttr( "role" )
+			.removeAttr( "tabIndex" )
+			.removeUniqueId();
+
+		this.tablist.unbind( this.eventNamespace );
+
+		this.tabs.add( this.panels ).each(function() {
+			if ( $.data( this, "ui-tabs-destroy" ) ) {
+				$( this ).remove();
+			} else {
+				$( this )
+					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
+						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
+					.removeAttr( "tabIndex" )
+					.removeAttr( "aria-live" )
+					.removeAttr( "aria-busy" )
+					.removeAttr( "aria-selected" )
+					.removeAttr( "aria-labelledby" )
+					.removeAttr( "aria-hidden" )
+					.removeAttr( "aria-expanded" )
+					.removeAttr( "role" );
+			}
+		});
+
+		this.tabs.each(function() {
+			var li = $( this ),
+				prev = li.data( "ui-tabs-aria-controls" );
+			if ( prev ) {
+				li
+					.attr( "aria-controls", prev )
+					.removeData( "ui-tabs-aria-controls" );
+			} else {
+				li.removeAttr( "aria-controls" );
+			}
+		});
+
+		this.panels.show();
+
+		if ( this.options.heightStyle !== "content" ) {
+			this.panels.css( "height", "" );
+		}
+	},
+
+	enable: function( index ) {
+		var disabled = this.options.disabled;
+		if ( disabled === false ) {
+			return;
+		}
+
+		if ( index === undefined ) {
+			disabled = false;
+		} else {
+			index = this._getIndex( index );
+			if ( $.isArray( disabled ) ) {
+				disabled = $.map( disabled, function( num ) {
+					return num !== index ? num : null;
+				});
+			} else {
+				disabled = $.map( this.tabs, function( li, num ) {
+					return num !== index ? num : null;
+				});
+			}
+		}
+		this._setupDisabled( disabled );
+	},
+
+	disable: function( index ) {
+		var disabled = this.options.disabled;
+		if ( disabled === true ) {
+			return;
+		}
+
+		if ( index === undefined ) {
+			disabled = true;
+		} else {
+			index = this._getIndex( index );
+			if ( $.inArray( index, disabled ) !== -1 ) {
+				return;
+			}
+			if ( $.isArray( disabled ) ) {
+				disabled = $.merge( [ index ], disabled ).sort();
+			} else {
+				disabled = [ index ];
+			}
+		}
+		this._setupDisabled( disabled );
+	},
+
+	load: function( index, event ) {
+		index = this._getIndex( index );
+		var that = this,
+			tab = this.tabs.eq( index ),
+			anchor = tab.find( ".ui-tabs-anchor" ),
+			panel = this._getPanelForTab( tab ),
+			eventData = {
+				tab: tab,
+				panel: panel
+			},
+			complete = function( jqXHR, status ) {
+				if ( status === "abort" ) {
+					that.panels.stop( false, true );
+				}
+
+				tab.removeClass( "ui-tabs-loading" );
+				panel.removeAttr( "aria-busy" );
+
+				if ( jqXHR === that.xhr ) {
+					delete that.xhr;
+				}
+			};
+
+		// not remote
+		if ( this._isLocal( anchor[ 0 ] ) ) {
+			return;
+		}
+
+		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
+
+		// support: jQuery <1.8
+		// jQuery <1.8 returns false if the request is canceled in beforeSend,
+		// but as of 1.8, $.ajax() always returns a jqXHR object.
+		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
+			tab.addClass( "ui-tabs-loading" );
+			panel.attr( "aria-busy", "true" );
+
+			this.xhr
+				.done(function( response, status, jqXHR ) {
+					// support: jQuery <1.8
+					// http://bugs.jquery.com/ticket/11778
+					setTimeout(function() {
+						panel.html( response );
+						that._trigger( "load", event, eventData );
+
+						complete( jqXHR, status );
+					}, 1 );
+				})
+				.fail(function( jqXHR, status ) {
+					// support: jQuery <1.8
+					// http://bugs.jquery.com/ticket/11778
+					setTimeout(function() {
+						complete( jqXHR, status );
+					}, 1 );
+				});
+		}
+	},
+
+	_ajaxSettings: function( anchor, event, eventData ) {
+		var that = this;
+		return {
+			url: anchor.attr( "href" ),
+			beforeSend: function( jqXHR, settings ) {
+				return that._trigger( "beforeLoad", event,
+					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
+			}
+		};
+	},
+
+	_getPanelForTab: function( tab ) {
+		var id = $( tab ).attr( "aria-controls" );
+		return this.element.find( this._sanitizeSelector( "#" + id ) );
+	}
+});
+
+
+/*!
+ * jQuery UI Tooltip 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/tooltip/
+ */
+
+
+var tooltip = $.widget( "ui.tooltip", {
+	version: "1.11.4",
+	options: {
+		content: function() {
+			// support: IE<9, Opera in jQuery <1.7
+			// .text() can't accept undefined, so coerce to a string
+			var title = $( this ).attr( "title" ) || "";
+			// Escape title, since we're going from an attribute to raw HTML
+			return $( "<a>" ).text( title ).html();
+		},
+		hide: true,
+		// Disabled elements have inconsistent behavior across browsers (#8661)
+		items: "[title]:not([disabled])",
+		position: {
+			my: "left top+15",
+			at: "left bottom",
+			collision: "flipfit flip"
+		},
+		show: true,
+		tooltipClass: null,
+		track: false,
+
+		// callbacks
+		close: null,
+		open: null
+	},
+
+	_addDescribedBy: function( elem, id ) {
+		var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
+		describedby.push( id );
+		elem
+			.data( "ui-tooltip-id", id )
+			.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
+	},
+
+	_removeDescribedBy: function( elem ) {
+		var id = elem.data( "ui-tooltip-id" ),
+			describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
+			index = $.inArray( id, describedby );
+
+		if ( index !== -1 ) {
+			describedby.splice( index, 1 );
+		}
+
+		elem.removeData( "ui-tooltip-id" );
+		describedby = $.trim( describedby.join( " " ) );
+		if ( describedby ) {
+			elem.attr( "aria-describedby", describedby );
+		} else {
+			elem.removeAttr( "aria-describedby" );
+		}
+	},
+
+	_create: function() {
+		this._on({
+			mouseover: "open",
+			focusin: "open"
+		});
+
+		// IDs of generated tooltips, needed for destroy
+		this.tooltips = {};
+
+		// IDs of parent tooltips where we removed the title attribute
+		this.parents = {};
+
+		if ( this.options.disabled ) {
+			this._disable();
+		}
+
+		// Append the aria-live region so tooltips announce correctly
+		this.liveRegion = $( "<div>" )
+			.attr({
+				role: "log",
+				"aria-live": "assertive",
+				"aria-relevant": "additions"
+			})
+			.addClass( "ui-helper-hidden-accessible" )
+			.appendTo( this.document[ 0 ].body );
+	},
+
+	_setOption: function( key, value ) {
+		var that = this;
+
+		if ( key === "disabled" ) {
+			this[ value ? "_disable" : "_enable" ]();
+			this.options[ key ] = value;
+			// disable element style changes
+			return;
+		}
+
+		this._super( key, value );
+
+		if ( key === "content" ) {
+			$.each( this.tooltips, function( id, tooltipData ) {
+				that._updateContent( tooltipData.element );
+			});
+		}
+	},
+
+	_disable: function() {
+		var that = this;
+
+		// close open tooltips
+		$.each( this.tooltips, function( id, tooltipData ) {
+			var event = $.Event( "blur" );
+			event.target = event.currentTarget = tooltipData.element[ 0 ];
+			that.close( event, true );
+		});
+
+		// remove title attributes to prevent native tooltips
+		this.element.find( this.options.items ).addBack().each(function() {
+			var element = $( this );
+			if ( element.is( "[title]" ) ) {
+				element
+					.data( "ui-tooltip-title", element.attr( "title" ) )
+					.removeAttr( "title" );
+			}
+		});
+	},
+
+	_enable: function() {
+		// restore title attributes
+		this.element.find( this.options.items ).addBack().each(function() {
+			var element = $( this );
+			if ( element.data( "ui-tooltip-title" ) ) {
+				element.attr( "title", element.data( "ui-tooltip-title" ) );
+			}
+		});
+	},
+
+	open: function( event ) {
+		var that = this,
+			target = $( event ? event.target : this.element )
+				// we need closest here due to mouseover bubbling,
+				// but always pointing at the same event target
+				.closest( this.options.items );
+
+		// No element to show a tooltip for or the tooltip is already open
+		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
+			return;
+		}
+
+		if ( target.attr( "title" ) ) {
+			target.data( "ui-tooltip-title", target.attr( "title" ) );
+		}
+
+		target.data( "ui-tooltip-open", true );
+
+		// kill parent tooltips, custom or native, for hover
+		if ( event && event.type === "mouseover" ) {
+			target.parents().each(function() {
+				var parent = $( this ),
+					blurEvent;
+				if ( parent.data( "ui-tooltip-open" ) ) {
+					blurEvent = $.Event( "blur" );
+					blurEvent.target = blurEvent.currentTarget = this;
+					that.close( blurEvent, true );
+				}
+				if ( parent.attr( "title" ) ) {
+					parent.uniqueId();
+					that.parents[ this.id ] = {
+						element: this,
+						title: parent.attr( "title" )
+					};
+					parent.attr( "title", "" );
+				}
+			});
+		}
+
+		this._registerCloseHandlers( event, target );
+		this._updateContent( target, event );
+	},
+
+	_updateContent: function( target, event ) {
+		var content,
+			contentOption = this.options.content,
+			that = this,
+			eventType = event ? event.type : null;
+
+		if ( typeof contentOption === "string" ) {
+			return this._open( event, target, contentOption );
+		}
+
+		content = contentOption.call( target[0], function( response ) {
+
+			// IE may instantly serve a cached response for ajax requests
+			// delay this call to _open so the other call to _open runs first
+			that._delay(function() {
+
+				// Ignore async response if tooltip was closed already
+				if ( !target.data( "ui-tooltip-open" ) ) {
+					return;
+				}
+
+				// jQuery creates a special event for focusin when it doesn't
+				// exist natively. To improve performance, the native event
+				// object is reused and the type is changed. Therefore, we can't
+				// rely on the type being correct after the event finished
+				// bubbling, so we set it back to the previous value. (#8740)
+				if ( event ) {
+					event.type = eventType;
+				}
+				this._open( event, target, response );
+			});
+		});
+		if ( content ) {
+			this._open( event, target, content );
+		}
+	},
+
+	_open: function( event, target, content ) {
+		var tooltipData, tooltip, delayedShow, a11yContent,
+			positionOption = $.extend( {}, this.options.position );
+
+		if ( !content ) {
+			return;
+		}
+
+		// Content can be updated multiple times. If the tooltip already
+		// exists, then just update the content and bail.
+		tooltipData = this._find( target );
+		if ( tooltipData ) {
+			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
+			return;
+		}
+
+		// if we have a title, clear it to prevent the native tooltip
+		// we have to check first to avoid defining a title if none exists
+		// (we don't want to cause an element to start matching [title])
+		//
+		// We use removeAttr only for key events, to allow IE to export the correct
+		// accessible attributes. For mouse events, set to empty string to avoid
+		// native tooltip showing up (happens only when removing inside mouseover).
+		if ( target.is( "[title]" ) ) {
+			if ( event && event.type === "mouseover" ) {
+				target.attr( "title", "" );
+			} else {
+				target.removeAttr( "title" );
+			}
+		}
+
+		tooltipData = this._tooltip( target );
+		tooltip = tooltipData.tooltip;
+		this._addDescribedBy( target, tooltip.attr( "id" ) );
+		tooltip.find( ".ui-tooltip-content" ).html( content );
+
+		// Support: Voiceover on OS X, JAWS on IE <= 9
+		// JAWS announces deletions even when aria-relevant="additions"
+		// Voiceover will sometimes re-read the entire log region's contents from the beginning
+		this.liveRegion.children().hide();
+		if ( content.clone ) {
+			a11yContent = content.clone();
+			a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
+		} else {
+			a11yContent = content;
+		}
+		$( "<div>" ).html( a11yContent ).appendTo( this.liveRegion );
+
+		function position( event ) {
+			positionOption.of = event;
+			if ( tooltip.is( ":hidden" ) ) {
+				return;
+			}
+			tooltip.position( positionOption );
+		}
+		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
+			this._on( this.document, {
+				mousemove: position
+			});
+			// trigger once to override element-relative positioning
+			position( event );
+		} else {
+			tooltip.position( $.extend({
+				of: target
+			}, this.options.position ) );
+		}
+
+		tooltip.hide();
+
+		this._show( tooltip, this.options.show );
+		// Handle tracking tooltips that are shown with a delay (#8644). As soon
+		// as the tooltip is visible, position the tooltip using the most recent
+		// event.
+		if ( this.options.show && this.options.show.delay ) {
+			delayedShow = this.delayedShow = setInterval(function() {
+				if ( tooltip.is( ":visible" ) ) {
+					position( positionOption.of );
+					clearInterval( delayedShow );
+				}
+			}, $.fx.interval );
+		}
+
+		this._trigger( "open", event, { tooltip: tooltip } );
+	},
+
+	_registerCloseHandlers: function( event, target ) {
+		var events = {
+			keyup: function( event ) {
+				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
+					var fakeEvent = $.Event(event);
+					fakeEvent.currentTarget = target[0];
+					this.close( fakeEvent, true );
+				}
+			}
+		};
+
+		// Only bind remove handler for delegated targets. Non-delegated
+		// tooltips will handle this in destroy.
+		if ( target[ 0 ] !== this.element[ 0 ] ) {
+			events.remove = function() {
+				this._removeTooltip( this._find( target ).tooltip );
+			};
+		}
+
+		if ( !event || event.type === "mouseover" ) {
+			events.mouseleave = "close";
+		}
+		if ( !event || event.type === "focusin" ) {
+			events.focusout = "close";
+		}
+		this._on( true, target, events );
+	},
+
+	close: function( event ) {
+		var tooltip,
+			that = this,
+			target = $( event ? event.currentTarget : this.element ),
+			tooltipData = this._find( target );
+
+		// The tooltip may already be closed
+		if ( !tooltipData ) {
+
+			// We set ui-tooltip-open immediately upon open (in open()), but only set the
+			// additional data once there's actually content to show (in _open()). So even if the
+			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
+			// the period between open() and _open().
+			target.removeData( "ui-tooltip-open" );
+			return;
+		}
+
+		tooltip = tooltipData.tooltip;
+
+		// disabling closes the tooltip, so we need to track when we're closing
+		// to avoid an infinite loop in case the tooltip becomes disabled on close
+		if ( tooltipData.closing ) {
+			return;
+		}
+
+		// Clear the interval for delayed tracking tooltips
+		clearInterval( this.delayedShow );
+
+		// only set title if we had one before (see comment in _open())
+		// If the title attribute has changed since open(), don't restore
+		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
+			target.attr( "title", target.data( "ui-tooltip-title" ) );
+		}
+
+		this._removeDescribedBy( target );
+
+		tooltipData.hiding = true;
+		tooltip.stop( true );
+		this._hide( tooltip, this.options.hide, function() {
+			that._removeTooltip( $( this ) );
+		});
+
+		target.removeData( "ui-tooltip-open" );
+		this._off( target, "mouseleave focusout keyup" );
+
+		// Remove 'remove' binding only on delegated targets
+		if ( target[ 0 ] !== this.element[ 0 ] ) {
+			this._off( target, "remove" );
+		}
+		this._off( this.document, "mousemove" );
+
+		if ( event && event.type === "mouseleave" ) {
+			$.each( this.parents, function( id, parent ) {
+				$( parent.element ).attr( "title", parent.title );
+				delete that.parents[ id ];
+			});
+		}
+
+		tooltipData.closing = true;
+		this._trigger( "close", event, { tooltip: tooltip } );
+		if ( !tooltipData.hiding ) {
+			tooltipData.closing = false;
+		}
+	},
+
+	_tooltip: function( element ) {
+		var tooltip = $( "<div>" )
+				.attr( "role", "tooltip" )
+				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
+					( this.options.tooltipClass || "" ) ),
+			id = tooltip.uniqueId().attr( "id" );
+
+		$( "<div>" )
+			.addClass( "ui-tooltip-content" )
+			.appendTo( tooltip );
+
+		tooltip.appendTo( this.document[0].body );
+
+		return this.tooltips[ id ] = {
+			element: element,
+			tooltip: tooltip
+		};
+	},
+
+	_find: function( target ) {
+		var id = target.data( "ui-tooltip-id" );
+		return id ? this.tooltips[ id ] : null;
+	},
+
+	_removeTooltip: function( tooltip ) {
+		tooltip.remove();
+		delete this.tooltips[ tooltip.attr( "id" ) ];
+	},
+
+	_destroy: function() {
+		var that = this;
+
+		// close open tooltips
+		$.each( this.tooltips, function( id, tooltipData ) {
+			// Delegate to close method to handle common cleanup
+			var event = $.Event( "blur" ),
+				element = tooltipData.element;
+			event.target = event.currentTarget = element[ 0 ];
+			that.close( event, true );
+
+			// Remove immediately; destroying an open tooltip doesn't use the
+			// hide animation
+			$( "#" + id ).remove();
+
+			// Restore the title
+			if ( element.data( "ui-tooltip-title" ) ) {
+				// If the title attribute has changed since open(), don't restore
+				if ( !element.attr( "title" ) ) {
+					element.attr( "title", element.data( "ui-tooltip-title" ) );
+				}
+				element.removeData( "ui-tooltip-title" );
+			}
+		});
+		this.liveRegion.remove();
+	}
+});
+
+
+/*!
+ * jQuery UI Effects 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/effects-core/
+ */
+
+
+var dataSpace = "ui-effects-",
+
+	// Create a local jQuery because jQuery Color relies on it and the
+	// global may not exist with AMD and a custom build (#10199)
+	jQuery = $;
+
+$.effects = {
+	effect: {}
+};
+
+/*!
+ * jQuery Color Animations v2.1.2
+ * https://github.com/jquery/jquery-color
+ *
+ * Copyright 2014 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * Date: Wed Jan 16 08:47:09 2013 -0600
+ */
+(function( jQuery, undefined ) {
+
+	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
+
+	// plusequals test for += 100 -= 100
+	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
+	// a set of RE's that can match strings and generate color tuples.
+	stringParsers = [ {
+			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+			parse: function( execResult ) {
+				return [
+					execResult[ 1 ],
+					execResult[ 2 ],
+					execResult[ 3 ],
+					execResult[ 4 ]
+				];
+			}
+		}, {
+			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+			parse: function( execResult ) {
+				return [
+					execResult[ 1 ] * 2.55,
+					execResult[ 2 ] * 2.55,
+					execResult[ 3 ] * 2.55,
+					execResult[ 4 ]
+				];
+			}
+		}, {
+			// this regex ignores A-F because it's compared against an already lowercased string
+			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
+			parse: function( execResult ) {
+				return [
+					parseInt( execResult[ 1 ], 16 ),
+					parseInt( execResult[ 2 ], 16 ),
+					parseInt( execResult[ 3 ], 16 )
+				];
+			}
+		}, {
+			// this regex ignores A-F because it's compared against an already lowercased string
+			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
+			parse: function( execResult ) {
+				return [
+					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
+					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
+					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
+				];
+			}
+		}, {
+			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
+			space: "hsla",
+			parse: function( execResult ) {
+				return [
+					execResult[ 1 ],
+					execResult[ 2 ] / 100,
+					execResult[ 3 ] / 100,
+					execResult[ 4 ]
+				];
+			}
+		} ],
+
+	// jQuery.Color( )
+	color = jQuery.Color = function( color, green, blue, alpha ) {
+		return new jQuery.Color.fn.parse( color, green, blue, alpha );
+	},
+	spaces = {
+		rgba: {
+			props: {
+				red: {
+					idx: 0,
+					type: "byte"
+				},
+				green: {
+					idx: 1,
+					type: "byte"
+				},
+				blue: {
+					idx: 2,
+					type: "byte"
+				}
+			}
+		},
+
+		hsla: {
+			props: {
+				hue: {
+					idx: 0,
+					type: "degrees"
+				},
+				saturation: {
+					idx: 1,
+					type: "percent"
+				},
+				lightness: {
+					idx: 2,
+					type: "percent"
+				}
+			}
+		}
+	},
+	propTypes = {
+		"byte": {
+			floor: true,
+			max: 255
+		},
+		"percent": {
+			max: 1
+		},
+		"degrees": {
+			mod: 360,
+			floor: true
+		}
+	},
+	support = color.support = {},
+
+	// element for support tests
+	supportElem = jQuery( "<p>" )[ 0 ],
+
+	// colors = jQuery.Color.names
+	colors,
+
+	// local aliases of functions called often
+	each = jQuery.each;
+
+// determine rgba support immediately
+supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
+support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
+
+// define cache name and alpha properties
+// for rgba and hsla spaces
+each( spaces, function( spaceName, space ) {
+	space.cache = "_" + spaceName;
+	space.props.alpha = {
+		idx: 3,
+		type: "percent",
+		def: 1
+	};
+});
+
+function clamp( value, prop, allowEmpty ) {
+	var type = propTypes[ prop.type ] || {};
+
+	if ( value == null ) {
+		return (allowEmpty || !prop.def) ? null : prop.def;
+	}
+
+	// ~~ is an short way of doing floor for positive numbers
+	value = type.floor ? ~~value : parseFloat( value );
+
+	// IE will pass in empty strings as value for alpha,
+	// which will hit this case
+	if ( isNaN( value ) ) {
+		return prop.def;
+	}
+
+	if ( type.mod ) {
+		// we add mod before modding to make sure that negatives values
+		// get converted properly: -10 -> 350
+		return (value + type.mod) % type.mod;
+	}
+
+	// for now all property types without mod have min and max
+	return 0 > value ? 0 : type.max < value ? type.max : value;
+}
+
+function stringParse( string ) {
+	var inst = color(),
+		rgba = inst._rgba = [];
+
+	string = string.toLowerCase();
+
+	each( stringParsers, function( i, parser ) {
+		var parsed,
+			match = parser.re.exec( string ),
+			values = match && parser.parse( match ),
+			spaceName = parser.space || "rgba";
+
+		if ( values ) {
+			parsed = inst[ spaceName ]( values );
+
+			// if this was an rgba parse the assignment might happen twice
+			// oh well....
+			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
+			rgba = inst._rgba = parsed._rgba;
+
+			// exit each( stringParsers ) here because we matched
+			return false;
+		}
+	});
+
+	// Found a stringParser that handled it
+	if ( rgba.length ) {
+
+		// if this came from a parsed string, force "transparent" when alpha is 0
+		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
+		if ( rgba.join() === "0,0,0,0" ) {
+			jQuery.extend( rgba, colors.transparent );
+		}
+		return inst;
+	}
+
+	// named colors
+	return colors[ string ];
+}
+
+color.fn = jQuery.extend( color.prototype, {
+	parse: function( red, green, blue, alpha ) {
+		if ( red === undefined ) {
+			this._rgba = [ null, null, null, null ];
+			return this;
+		}
+		if ( red.jquery || red.nodeType ) {
+			red = jQuery( red ).css( green );
+			green = undefined;
+		}
+
+		var inst = this,
+			type = jQuery.type( red ),
+			rgba = this._rgba = [];
+
+		// more than 1 argument specified - assume ( red, green, blue, alpha )
+		if ( green !== undefined ) {
+			red = [ red, green, blue, alpha ];
+			type = "array";
+		}
+
+		if ( type === "string" ) {
+			return this.parse( stringParse( red ) || colors._default );
+		}
+
+		if ( type === "array" ) {
+			each( spaces.rgba.props, function( key, prop ) {
+				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
+			});
+			return this;
+		}
+
+		if ( type === "object" ) {
+			if ( red instanceof color ) {
+				each( spaces, function( spaceName, space ) {
+					if ( red[ space.cache ] ) {
+						inst[ space.cache ] = red[ space.cache ].slice();
+					}
+				});
+			} else {
+				each( spaces, function( spaceName, space ) {
+					var cache = space.cache;
+					each( space.props, function( key, prop ) {
+
+						// if the cache doesn't exist, and we know how to convert
+						if ( !inst[ cache ] && space.to ) {
+
+							// if the value was null, we don't need to copy it
+							// if the key was alpha, we don't need to copy it either
+							if ( key === "alpha" || red[ key ] == null ) {
+								return;
+							}
+							inst[ cache ] = space.to( inst._rgba );
+						}
+
+						// this is the only case where we allow nulls for ALL properties.
+						// call clamp with alwaysAllowEmpty
+						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
+					});
+
+					// everything defined but alpha?
+					if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
+						// use the default of 1
+						inst[ cache ][ 3 ] = 1;
+						if ( space.from ) {
+							inst._rgba = space.from( inst[ cache ] );
+						}
+					}
+				});
+			}
+			return this;
+		}
+	},
+	is: function( compare ) {
+		var is = color( compare ),
+			same = true,
+			inst = this;
+
+		each( spaces, function( _, space ) {
+			var localCache,
+				isCache = is[ space.cache ];
+			if (isCache) {
+				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
+				each( space.props, function( _, prop ) {
+					if ( isCache[ prop.idx ] != null ) {
+						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
+						return same;
+					}
+				});
+			}
+			return same;
+		});
+		return same;
+	},
+	_space: function() {
+		var used = [],
+			inst = this;
+		each( spaces, function( spaceName, space ) {
+			if ( inst[ space.cache ] ) {
+				used.push( spaceName );
+			}
+		});
+		return used.pop();
+	},
+	transition: function( other, distance ) {
+		var end = color( other ),
+			spaceName = end._space(),
+			space = spaces[ spaceName ],
+			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
+			start = startColor[ space.cache ] || space.to( startColor._rgba ),
+			result = start.slice();
+
+		end = end[ space.cache ];
+		each( space.props, function( key, prop ) {
+			var index = prop.idx,
+				startValue = start[ index ],
+				endValue = end[ index ],
+				type = propTypes[ prop.type ] || {};
+
+			// if null, don't override start value
+			if ( endValue === null ) {
+				return;
+			}
+			// if null - use end
+			if ( startValue === null ) {
+				result[ index ] = endValue;
+			} else {
+				if ( type.mod ) {
+					if ( endValue - startValue > type.mod / 2 ) {
+						startValue += type.mod;
+					} else if ( startValue - endValue > type.mod / 2 ) {
+						startValue -= type.mod;
+					}
+				}
+				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
+			}
+		});
+		return this[ spaceName ]( result );
+	},
+	blend: function( opaque ) {
+		// if we are already opaque - return ourself
+		if ( this._rgba[ 3 ] === 1 ) {
+			return this;
+		}
+
+		var rgb = this._rgba.slice(),
+			a = rgb.pop(),
+			blend = color( opaque )._rgba;
+
+		return color( jQuery.map( rgb, function( v, i ) {
+			return ( 1 - a ) * blend[ i ] + a * v;
+		}));
+	},
+	toRgbaString: function() {
+		var prefix = "rgba(",
+			rgba = jQuery.map( this._rgba, function( v, i ) {
+				return v == null ? ( i > 2 ? 1 : 0 ) : v;
+			});
+
+		if ( rgba[ 3 ] === 1 ) {
+			rgba.pop();
+			prefix = "rgb(";
+		}
+
+		return prefix + rgba.join() + ")";
+	},
+	toHslaString: function() {
+		var prefix = "hsla(",
+			hsla = jQuery.map( this.hsla(), function( v, i ) {
+				if ( v == null ) {
+					v = i > 2 ? 1 : 0;
+				}
+
+				// catch 1 and 2
+				if ( i && i < 3 ) {
+					v = Math.round( v * 100 ) + "%";
+				}
+				return v;
+			});
+
+		if ( hsla[ 3 ] === 1 ) {
+			hsla.pop();
+			prefix = "hsl(";
+		}
+		return prefix + hsla.join() + ")";
+	},
+	toHexString: function( includeAlpha ) {
+		var rgba = this._rgba.slice(),
+			alpha = rgba.pop();
+
+		if ( includeAlpha ) {
+			rgba.push( ~~( alpha * 255 ) );
+		}
+
+		return "#" + jQuery.map( rgba, function( v ) {
+
+			// default to 0 when nulls exist
+			v = ( v || 0 ).toString( 16 );
+			return v.length === 1 ? "0" + v : v;
+		}).join("");
+	},
+	toString: function() {
+		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
+	}
+});
+color.fn.parse.prototype = color.fn;
+
+// hsla conversions adapted from:
+// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
+
+function hue2rgb( p, q, h ) {
+	h = ( h + 1 ) % 1;
+	if ( h * 6 < 1 ) {
+		return p + ( q - p ) * h * 6;
+	}
+	if ( h * 2 < 1) {
+		return q;
+	}
+	if ( h * 3 < 2 ) {
+		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
+	}
+	return p;
+}
+
+spaces.hsla.to = function( rgba ) {
+	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
+		return [ null, null, null, rgba[ 3 ] ];
+	}
+	var r = rgba[ 0 ] / 255,
+		g = rgba[ 1 ] / 255,
+		b = rgba[ 2 ] / 255,
+		a = rgba[ 3 ],
+		max = Math.max( r, g, b ),
+		min = Math.min( r, g, b ),
+		diff = max - min,
+		add = max + min,
+		l = add * 0.5,
+		h, s;
+
+	if ( min === max ) {
+		h = 0;
+	} else if ( r === max ) {
+		h = ( 60 * ( g - b ) / diff ) + 360;
+	} else if ( g === max ) {
+		h = ( 60 * ( b - r ) / diff ) + 120;
+	} else {
+		h = ( 60 * ( r - g ) / diff ) + 240;
+	}
+
+	// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
+	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
+	if ( diff === 0 ) {
+		s = 0;
+	} else if ( l <= 0.5 ) {
+		s = diff / add;
+	} else {
+		s = diff / ( 2 - add );
+	}
+	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
+};
+
+spaces.hsla.from = function( hsla ) {
+	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
+		return [ null, null, null, hsla[ 3 ] ];
+	}
+	var h = hsla[ 0 ] / 360,
+		s = hsla[ 1 ],
+		l = hsla[ 2 ],
+		a = hsla[ 3 ],
+		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
+		p = 2 * l - q;
+
+	return [
+		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
+		Math.round( hue2rgb( p, q, h ) * 255 ),
+		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
+		a
+	];
+};
+
+each( spaces, function( spaceName, space ) {
+	var props = space.props,
+		cache = space.cache,
+		to = space.to,
+		from = space.from;
+
+	// makes rgba() and hsla()
+	color.fn[ spaceName ] = function( value ) {
+
+		// generate a cache for this space if it doesn't exist
+		if ( to && !this[ cache ] ) {
+			this[ cache ] = to( this._rgba );
+		}
+		if ( value === undefined ) {
+			return this[ cache ].slice();
+		}
+
+		var ret,
+			type = jQuery.type( value ),
+			arr = ( type === "array" || type === "object" ) ? value : arguments,
+			local = this[ cache ].slice();
+
+		each( props, function( key, prop ) {
+			var val = arr[ type === "object" ? key : prop.idx ];
+			if ( val == null ) {
+				val = local[ prop.idx ];
+			}
+			local[ prop.idx ] = clamp( val, prop );
+		});
+
+		if ( from ) {
+			ret = color( from( local ) );
+			ret[ cache ] = local;
+			return ret;
+		} else {
+			return color( local );
+		}
+	};
+
+	// makes red() green() blue() alpha() hue() saturation() lightness()
+	each( props, function( key, prop ) {
+		// alpha is included in more than one space
+		if ( color.fn[ key ] ) {
+			return;
+		}
+		color.fn[ key ] = function( value ) {
+			var vtype = jQuery.type( value ),
+				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
+				local = this[ fn ](),
+				cur = local[ prop.idx ],
+				match;
+
+			if ( vtype === "undefined" ) {
+				return cur;
+			}
+
+			if ( vtype === "function" ) {
+				value = value.call( this, cur );
+				vtype = jQuery.type( value );
+			}
+			if ( value == null && prop.empty ) {
+				return this;
+			}
+			if ( vtype === "string" ) {
+				match = rplusequals.exec( value );
+				if ( match ) {
+					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
+				}
+			}
+			local[ prop.idx ] = value;
+			return this[ fn ]( local );
+		};
+	});
+});
+
+// add cssHook and .fx.step function for each named hook.
+// accept a space separated string of properties
+color.hook = function( hook ) {
+	var hooks = hook.split( " " );
+	each( hooks, function( i, hook ) {
+		jQuery.cssHooks[ hook ] = {
+			set: function( elem, value ) {
+				var parsed, curElem,
+					backgroundColor = "";
+
+				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
+					value = color( parsed || value );
+					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
+						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
+						while (
+							(backgroundColor === "" || backgroundColor === "transparent") &&
+							curElem && curElem.style
+						) {
+							try {
+								backgroundColor = jQuery.css( curElem, "backgroundColor" );
+								curElem = curElem.parentNode;
+							} catch ( e ) {
+							}
+						}
+
+						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
+							backgroundColor :
+							"_default" );
+					}
+
+					value = value.toRgbaString();
+				}
+				try {
+					elem.style[ hook ] = value;
+				} catch ( e ) {
+					// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
+				}
+			}
+		};
+		jQuery.fx.step[ hook ] = function( fx ) {
+			if ( !fx.colorInit ) {
+				fx.start = color( fx.elem, hook );
+				fx.end = color( fx.end );
+				fx.colorInit = true;
+			}
+			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
+		};
+	});
+
+};
+
+color.hook( stepHooks );
+
+jQuery.cssHooks.borderColor = {
+	expand: function( value ) {
+		var expanded = {};
+
+		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
+			expanded[ "border" + part + "Color" ] = value;
+		});
+		return expanded;
+	}
+};
+
+// Basic color names only.
+// Usage of any of the other color names requires adding yourself or including
+// jquery.color.svg-names.js.
+colors = jQuery.Color.names = {
+	// 4.1. Basic color keywords
+	aqua: "#00ffff",
+	black: "#000000",
+	blue: "#0000ff",
+	fuchsia: "#ff00ff",
+	gray: "#808080",
+	green: "#008000",
+	lime: "#00ff00",
+	maroon: "#800000",
+	navy: "#000080",
+	olive: "#808000",
+	purple: "#800080",
+	red: "#ff0000",
+	silver: "#c0c0c0",
+	teal: "#008080",
+	white: "#ffffff",
+	yellow: "#ffff00",
+
+	// 4.2.3. "transparent" color keyword
+	transparent: [ null, null, null, 0 ],
+
+	_default: "#ffffff"
+};
+
+})( jQuery );
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+(function() {
+
+var classAnimationActions = [ "add", "remove", "toggle" ],
+	shorthandStyles = {
+		border: 1,
+		borderBottom: 1,
+		borderColor: 1,
+		borderLeft: 1,
+		borderRight: 1,
+		borderTop: 1,
+		borderWidth: 1,
+		margin: 1,
+		padding: 1
+	};
+
+$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
+	$.fx.step[ prop ] = function( fx ) {
+		if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
+			jQuery.style( fx.elem, prop, fx.end );
+			fx.setAttr = true;
+		}
+	};
+});
+
+function getElementStyles( elem ) {
+	var key, len,
+		style = elem.ownerDocument.defaultView ?
+			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
+			elem.currentStyle,
+		styles = {};
+
+	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
+		len = style.length;
+		while ( len-- ) {
+			key = style[ len ];
+			if ( typeof style[ key ] === "string" ) {
+				styles[ $.camelCase( key ) ] = style[ key ];
+			}
+		}
+	// support: Opera, IE <9
+	} else {
+		for ( key in style ) {
+			if ( typeof style[ key ] === "string" ) {
+				styles[ key ] = style[ key ];
+			}
+		}
+	}
+
+	return styles;
+}
+
+function styleDifference( oldStyle, newStyle ) {
+	var diff = {},
+		name, value;
+
+	for ( name in newStyle ) {
+		value = newStyle[ name ];
+		if ( oldStyle[ name ] !== value ) {
+			if ( !shorthandStyles[ name ] ) {
+				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
+					diff[ name ] = value;
+				}
+			}
+		}
+	}
+
+	return diff;
+}
+
+// support: jQuery <1.8
+if ( !$.fn.addBack ) {
+	$.fn.addBack = function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	};
+}
+
+$.effects.animateClass = function( value, duration, easing, callback ) {
+	var o = $.speed( duration, easing, callback );
+
+	return this.queue( function() {
+		var animated = $( this ),
+			baseClass = animated.attr( "class" ) || "",
+			applyClassChange,
+			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
+
+		// map the animated objects to store the original styles.
+		allAnimations = allAnimations.map(function() {
+			var el = $( this );
+			return {
+				el: el,
+				start: getElementStyles( this )
+			};
+		});
+
+		// apply class change
+		applyClassChange = function() {
+			$.each( classAnimationActions, function(i, action) {
+				if ( value[ action ] ) {
+					animated[ action + "Class" ]( value[ action ] );
+				}
+			});
+		};
+		applyClassChange();
+
+		// map all animated objects again - calculate new styles and diff
+		allAnimations = allAnimations.map(function() {
+			this.end = getElementStyles( this.el[ 0 ] );
+			this.diff = styleDifference( this.start, this.end );
+			return this;
+		});
+
+		// apply original class
+		animated.attr( "class", baseClass );
+
+		// map all animated objects again - this time collecting a promise
+		allAnimations = allAnimations.map(function() {
+			var styleInfo = this,
+				dfd = $.Deferred(),
+				opts = $.extend({}, o, {
+					queue: false,
+					complete: function() {
+						dfd.resolve( styleInfo );
+					}
+				});
+
+			this.el.animate( this.diff, opts );
+			return dfd.promise();
+		});
+
+		// once all animations have completed:
+		$.when.apply( $, allAnimations.get() ).done(function() {
+
+			// set the final class
+			applyClassChange();
+
+			// for each animated element,
+			// clear all css properties that were animated
+			$.each( arguments, function() {
+				var el = this.el;
+				$.each( this.diff, function(key) {
+					el.css( key, "" );
+				});
+			});
+
+			// this is guarnteed to be there if you use jQuery.speed()
+			// it also handles dequeuing the next anim...
+			o.complete.call( animated[ 0 ] );
+		});
+	});
+};
+
+$.fn.extend({
+	addClass: (function( orig ) {
+		return function( classNames, speed, easing, callback ) {
+			return speed ?
+				$.effects.animateClass.call( this,
+					{ add: classNames }, speed, easing, callback ) :
+				orig.apply( this, arguments );
+		};
+	})( $.fn.addClass ),
+
+	removeClass: (function( orig ) {
+		return function( classNames, speed, easing, callback ) {
+			return arguments.length > 1 ?
+				$.effects.animateClass.call( this,
+					{ remove: classNames }, speed, easing, callback ) :
+				orig.apply( this, arguments );
+		};
+	})( $.fn.removeClass ),
+
+	toggleClass: (function( orig ) {
+		return function( classNames, force, speed, easing, callback ) {
+			if ( typeof force === "boolean" || force === undefined ) {
+				if ( !speed ) {
+					// without speed parameter
+					return orig.apply( this, arguments );
+				} else {
+					return $.effects.animateClass.call( this,
+						(force ? { add: classNames } : { remove: classNames }),
+						speed, easing, callback );
+				}
+			} else {
+				// without force parameter
+				return $.effects.animateClass.call( this,
+					{ toggle: classNames }, force, speed, easing );
+			}
+		};
+	})( $.fn.toggleClass ),
+
+	switchClass: function( remove, add, speed, easing, callback) {
+		return $.effects.animateClass.call( this, {
+			add: add,
+			remove: remove
+		}, speed, easing, callback );
+	}
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+(function() {
+
+$.extend( $.effects, {
+	version: "1.11.4",
+
+	// Saves a set of properties in a data storage
+	save: function( element, set ) {
+		for ( var i = 0; i < set.length; i++ ) {
+			if ( set[ i ] !== null ) {
+				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
+			}
+		}
+	},
+
+	// Restores a set of previously saved properties from a data storage
+	restore: function( element, set ) {
+		var val, i;
+		for ( i = 0; i < set.length; i++ ) {
+			if ( set[ i ] !== null ) {
+				val = element.data( dataSpace + set[ i ] );
+				// support: jQuery 1.6.2
+				// http://bugs.jquery.com/ticket/9917
+				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
+				// We can't differentiate between "" and 0 here, so we just assume
+				// empty string since it's likely to be a more common value...
+				if ( val === undefined ) {
+					val = "";
+				}
+				element.css( set[ i ], val );
+			}
+		}
+	},
+
+	setMode: function( el, mode ) {
+		if (mode === "toggle") {
+			mode = el.is( ":hidden" ) ? "show" : "hide";
+		}
+		return mode;
+	},
+
+	// Translates a [top,left] array into a baseline value
+	// this should be a little more flexible in the future to handle a string & hash
+	getBaseline: function( origin, original ) {
+		var y, x;
+		switch ( origin[ 0 ] ) {
+			case "top": y = 0; break;
+			case "middle": y = 0.5; break;
+			case "bottom": y = 1; break;
+			default: y = origin[ 0 ] / original.height;
+		}
+		switch ( origin[ 1 ] ) {
+			case "left": x = 0; break;
+			case "center": x = 0.5; break;
+			case "right": x = 1; break;
+			default: x = origin[ 1 ] / original.width;
+		}
+		return {
+			x: x,
+			y: y
+		};
+	},
+
+	// Wraps the element around a wrapper that copies position properties
+	createWrapper: function( element ) {
+
+		// if the element is already wrapped, return it
+		if ( element.parent().is( ".ui-effects-wrapper" )) {
+			return element.parent();
+		}
+
+		// wrap the element
+		var props = {
+				width: element.outerWidth(true),
+				height: element.outerHeight(true),
+				"float": element.css( "float" )
+			},
+			wrapper = $( "<div></div>" )
+				.addClass( "ui-effects-wrapper" )
+				.css({
+					fontSize: "100%",
+					background: "transparent",
+					border: "none",
+					margin: 0,
+					padding: 0
+				}),
+			// Store the size in case width/height are defined in % - Fixes #5245
+			size = {
+				width: element.width(),
+				height: element.height()
+			},
+			active = document.activeElement;
+
+		// support: Firefox
+		// Firefox incorrectly exposes anonymous content
+		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
+		try {
+			active.id;
+		} catch ( e ) {
+			active = document.body;
+		}
+
+		element.wrap( wrapper );
+
+		// Fixes #7595 - Elements lose focus when wrapped.
+		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+			$( active ).focus();
+		}
+
+		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
+
+		// transfer positioning properties to the wrapper
+		if ( element.css( "position" ) === "static" ) {
+			wrapper.css({ position: "relative" });
+			element.css({ position: "relative" });
+		} else {
+			$.extend( props, {
+				position: element.css( "position" ),
+				zIndex: element.css( "z-index" )
+			});
+			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
+				props[ pos ] = element.css( pos );
+				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
+					props[ pos ] = "auto";
+				}
+			});
+			element.css({
+				position: "relative",
+				top: 0,
+				left: 0,
+				right: "auto",
+				bottom: "auto"
+			});
+		}
+		element.css(size);
+
+		return wrapper.css( props ).show();
+	},
+
+	removeWrapper: function( element ) {
+		var active = document.activeElement;
+
+		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
+			element.parent().replaceWith( element );
+
+			// Fixes #7595 - Elements lose focus when wrapped.
+			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+				$( active ).focus();
+			}
+		}
+
+		return element;
+	},
+
+	setTransition: function( element, list, factor, value ) {
+		value = value || {};
+		$.each( list, function( i, x ) {
+			var unit = element.cssUnit( x );
+			if ( unit[ 0 ] > 0 ) {
+				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
+			}
+		});
+		return value;
+	}
+});
+
+// return an effect options object for the given parameters:
+function _normalizeArguments( effect, options, speed, callback ) {
+
+	// allow passing all options as the first parameter
+	if ( $.isPlainObject( effect ) ) {
+		options = effect;
+		effect = effect.effect;
+	}
+
+	// convert to an object
+	effect = { effect: effect };
+
+	// catch (effect, null, ...)
+	if ( options == null ) {
+		options = {};
+	}
+
+	// catch (effect, callback)
+	if ( $.isFunction( options ) ) {
+		callback = options;
+		speed = null;
+		options = {};
+	}
+
+	// catch (effect, speed, ?)
+	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
+		callback = speed;
+		speed = options;
+		options = {};
+	}
+
+	// catch (effect, options, callback)
+	if ( $.isFunction( speed ) ) {
+		callback = speed;
+		speed = null;
+	}
+
+	// add options to effect
+	if ( options ) {
+		$.extend( effect, options );
+	}
+
+	speed = speed || options.duration;
+	effect.duration = $.fx.off ? 0 :
+		typeof speed === "number" ? speed :
+		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
+		$.fx.speeds._default;
+
+	effect.complete = callback || options.complete;
+
+	return effect;
+}
+
+function standardAnimationOption( option ) {
+	// Valid standard speeds (nothing, number, named speed)
+	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
+		return true;
+	}
+
+	// Invalid strings - treat as "normal" speed
+	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
+		return true;
+	}
+
+	// Complete callback
+	if ( $.isFunction( option ) ) {
+		return true;
+	}
+
+	// Options hash (but not naming an effect)
+	if ( typeof option === "object" && !option.effect ) {
+		return true;
+	}
+
+	// Didn't match any standard API
+	return false;
+}
+
+$.fn.extend({
+	effect: function( /* effect, options, speed, callback */ ) {
+		var args = _normalizeArguments.apply( this, arguments ),
+			mode = args.mode,
+			queue = args.queue,
+			effectMethod = $.effects.effect[ args.effect ];
+
+		if ( $.fx.off || !effectMethod ) {
+			// delegate to the original method (e.g., .show()) if possible
+			if ( mode ) {
+				return this[ mode ]( args.duration, args.complete );
+			} else {
+				return this.each( function() {
+					if ( args.complete ) {
+						args.complete.call( this );
+					}
+				});
+			}
+		}
+
+		function run( next ) {
+			var elem = $( this ),
+				complete = args.complete,
+				mode = args.mode;
+
+			function done() {
+				if ( $.isFunction( complete ) ) {
+					complete.call( elem[0] );
+				}
+				if ( $.isFunction( next ) ) {
+					next();
+				}
+			}
+
+			// If the element already has the correct final state, delegate to
+			// the core methods so the internal tracking of "olddisplay" works.
+			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
+				elem[ mode ]();
+				done();
+			} else {
+				effectMethod.call( elem[0], args, done );
+			}
+		}
+
+		return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
+	},
+
+	show: (function( orig ) {
+		return function( option ) {
+			if ( standardAnimationOption( option ) ) {
+				return orig.apply( this, arguments );
+			} else {
+				var args = _normalizeArguments.apply( this, arguments );
+				args.mode = "show";
+				return this.effect.call( this, args );
+			}
+		};
+	})( $.fn.show ),
+
+	hide: (function( orig ) {
+		return function( option ) {
+			if ( standardAnimationOption( option ) ) {
+				return orig.apply( this, arguments );
+			} else {
+				var args = _normalizeArguments.apply( this, arguments );
+				args.mode = "hide";
+				return this.effect.call( this, args );
+			}
+		};
+	})( $.fn.hide ),
+
+	toggle: (function( orig ) {
+		return function( option ) {
+			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
+				return orig.apply( this, arguments );
+			} else {
+				var args = _normalizeArguments.apply( this, arguments );
+				args.mode = "toggle";
+				return this.effect.call( this, args );
+			}
+		};
+	})( $.fn.toggle ),
+
+	// helper functions
+	cssUnit: function(key) {
+		var style = this.css( key ),
+			val = [];
+
+		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
+			if ( style.indexOf( unit ) > 0 ) {
+				val = [ parseFloat( style ), unit ];
+			}
+		});
+		return val;
+	}
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+(function() {
+
+// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
+
+var baseEasings = {};
+
+$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
+	baseEasings[ name ] = function( p ) {
+		return Math.pow( p, i + 2 );
+	};
+});
+
+$.extend( baseEasings, {
+	Sine: function( p ) {
+		return 1 - Math.cos( p * Math.PI / 2 );
+	},
+	Circ: function( p ) {
+		return 1 - Math.sqrt( 1 - p * p );
+	},
+	Elastic: function( p ) {
+		return p === 0 || p === 1 ? p :
+			-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
+	},
+	Back: function( p ) {
+		return p * p * ( 3 * p - 2 );
+	},
+	Bounce: function( p ) {
+		var pow2,
+			bounce = 4;
+
+		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
+	}
+});
+
+$.each( baseEasings, function( name, easeIn ) {
+	$.easing[ "easeIn" + name ] = easeIn;
+	$.easing[ "easeOut" + name ] = function( p ) {
+		return 1 - easeIn( 1 - p );
+	};
+	$.easing[ "easeInOut" + name ] = function( p ) {
+		return p < 0.5 ?
+			easeIn( p * 2 ) / 2 :
+			1 - easeIn( p * -2 + 2 ) / 2;
+	};
+});
+
+})();
+
+var effect = $.effects;
+
+
+/*!
+ * jQuery UI Effects Blind 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/blind-effect/
+ */
+
+
+var effectBlind = $.effects.effect.blind = function( o, done ) {
+	// Create element
+	var el = $( this ),
+		rvertical = /up|down|vertical/,
+		rpositivemotion = /up|left|vertical|horizontal/,
+		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+		mode = $.effects.setMode( el, o.mode || "hide" ),
+		direction = o.direction || "up",
+		vertical = rvertical.test( direction ),
+		ref = vertical ? "height" : "width",
+		ref2 = vertical ? "top" : "left",
+		motion = rpositivemotion.test( direction ),
+		animation = {},
+		show = mode === "show",
+		wrapper, distance, margin;
+
+	// if already wrapped, the wrapper's properties are my property. #6245
+	if ( el.parent().is( ".ui-effects-wrapper" ) ) {
+		$.effects.save( el.parent(), props );
+	} else {
+		$.effects.save( el, props );
+	}
+	el.show();
+	wrapper = $.effects.createWrapper( el ).css({
+		overflow: "hidden"
+	});
+
+	distance = wrapper[ ref ]();
+	margin = parseFloat( wrapper.css( ref2 ) ) || 0;
+
+	animation[ ref ] = show ? distance : 0;
+	if ( !motion ) {
+		el
+			.css( vertical ? "bottom" : "right", 0 )
+			.css( vertical ? "top" : "left", "auto" )
+			.css({ position: "absolute" });
+
+		animation[ ref2 ] = show ? margin : distance + margin;
+	}
+
+	// start at 0 if we are showing
+	if ( show ) {
+		wrapper.css( ref, 0 );
+		if ( !motion ) {
+			wrapper.css( ref2, margin + distance );
+		}
+	}
+
+	// Animate
+	wrapper.animate( animation, {
+		duration: o.duration,
+		easing: o.easing,
+		queue: false,
+		complete: function() {
+			if ( mode === "hide" ) {
+				el.hide();
+			}
+			$.effects.restore( el, props );
+			$.effects.removeWrapper( el );
+			done();
+		}
+	});
+};
+
+
+/*!
+ * jQuery UI Effects Bounce 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/bounce-effect/
+ */
+
+
+var effectBounce = $.effects.effect.bounce = function( o, done ) {
+	var el = $( this ),
+		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+
+		// defaults:
+		mode = $.effects.setMode( el, o.mode || "effect" ),
+		hide = mode === "hide",
+		show = mode === "show",
+		direction = o.direction || "up",
+		distance = o.distance,
+		times = o.times || 5,
+
+		// number of internal animations
+		anims = times * 2 + ( show || hide ? 1 : 0 ),
+		speed = o.duration / anims,
+		easing = o.easing,
+
+		// utility:
+		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
+		motion = ( direction === "up" || direction === "left" ),
+		i,
+		upAnim,
+		downAnim,
+
+		// we will need to re-assemble the queue to stack our animations in place
+		queue = el.queue(),
+		queuelen = queue.length;
+
+	// Avoid touching opacity to prevent clearType and PNG issues in IE
+	if ( show || hide ) {
+		props.push( "opacity" );
+	}
+
+	$.effects.save( el, props );
+	el.show();
+	$.effects.createWrapper( el ); // Create Wrapper
+
+	// default distance for the BIGGEST bounce is the outer Distance / 3
+	if ( !distance ) {
+		distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
+	}
+
+	if ( show ) {
+		downAnim = { opacity: 1 };
+		downAnim[ ref ] = 0;
+
+		// if we are showing, force opacity 0 and set the initial position
+		// then do the "first" animation
+		el.css( "opacity", 0 )
+			.css( ref, motion ? -distance * 2 : distance * 2 )
+			.animate( downAnim, speed, easing );
+	}
+
+	// start at the smallest distance if we are hiding
+	if ( hide ) {
+		distance = distance / Math.pow( 2, times - 1 );
+	}
+
+	downAnim = {};
+	downAnim[ ref ] = 0;
+	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
+	for ( i = 0; i < times; i++ ) {
+		upAnim = {};
+		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+		el.animate( upAnim, speed, easing )
+			.animate( downAnim, speed, easing );
+
+		distance = hide ? distance * 2 : distance / 2;
+	}
+
+	// Last Bounce when Hiding
+	if ( hide ) {
+		upAnim = { opacity: 0 };
+		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+		el.animate( upAnim, speed, easing );
+	}
+
+	el.queue(function() {
+		if ( hide ) {
+			el.hide();
+		}
+		$.effects.restore( el, props );
+		$.effects.removeWrapper( el );
+		done();
+	});
+
+	// inject all the animations we just queued to be first in line (after "inprogress")
+	if ( queuelen > 1) {
+		queue.splice.apply( queue,
+			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+	}
+	el.dequeue();
+
+};
+
+
+/*!
+ * jQuery UI Effects Clip 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/clip-effect/
+ */
+
+
+var effectClip = $.effects.effect.clip = function( o, done ) {
+	// Create element
+	var el = $( this ),
+		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+		mode = $.effects.setMode( el, o.mode || "hide" ),
+		show = mode === "show",
+		direction = o.direction || "vertical",
+		vert = direction === "vertical",
+		size = vert ? "height" : "width",
+		position = vert ? "top" : "left",
+		animation = {},
+		wrapper, animate, distance;
+
+	// Save & Show
+	$.effects.save( el, props );
+	el.show();
+
+	// Create Wrapper
+	wrapper = $.effects.createWrapper( el ).css({
+		overflow: "hidden"
+	});
+	animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
+	distance = animate[ size ]();
+
+	// Shift
+	if ( show ) {
+		animate.css( size, 0 );
+		animate.css( position, distance / 2 );
+	}
+
+	// Create Animation Object:
+	animation[ size ] = show ? distance : 0;
+	animation[ position ] = show ? 0 : distance / 2;
+
+	// Animate
+	animate.animate( animation, {
+		queue: false,
+		duration: o.duration,
+		easing: o.easing,
+		complete: function() {
+			if ( !show ) {
+				el.hide();
+			}
+			$.effects.restore( el, props );
+			$.effects.removeWrapper( el );
+			done();
+		}
+	});
+
+};
+
+
+/*!
+ * jQuery UI Effects Drop 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/drop-effect/
+ */
+
+
+var effectDrop = $.effects.effect.drop = function( o, done ) {
+
+	var el = $( this ),
+		props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
+		mode = $.effects.setMode( el, o.mode || "hide" ),
+		show = mode === "show",
+		direction = o.direction || "left",
+		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
+		motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
+		animation = {
+			opacity: show ? 1 : 0
+		},
+		distance;
+
+	// Adjust
+	$.effects.save( el, props );
+	el.show();
+	$.effects.createWrapper( el );
+
+	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
+
+	if ( show ) {
+		el
+			.css( "opacity", 0 )
+			.css( ref, motion === "pos" ? -distance : distance );
+	}
+
+	// Animation
+	animation[ ref ] = ( show ?
+		( motion === "pos" ? "+=" : "-=" ) :
+		( motion === "pos" ? "-=" : "+=" ) ) +
+		distance;
+
+	// Animate
+	el.animate( animation, {
+		queue: false,
+		duration: o.duration,
+		easing: o.easing,
+		complete: function() {
+			if ( mode === "hide" ) {
+				el.hide();
+			}
+			$.effects.restore( el, props );
+			$.effects.removeWrapper( el );
+			done();
+		}
+	});
+};
+
+
+/*!
+ * jQuery UI Effects Explode 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/explode-effect/
+ */
+
+
+var effectExplode = $.effects.effect.explode = function( o, done ) {
+
+	var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
+		cells = rows,
+		el = $( this ),
+		mode = $.effects.setMode( el, o.mode || "hide" ),
+		show = mode === "show",
+
+		// show and then visibility:hidden the element before calculating offset
+		offset = el.show().css( "visibility", "hidden" ).offset(),
+
+		// width and height of a piece
+		width = Math.ceil( el.outerWidth() / cells ),
+		height = Math.ceil( el.outerHeight() / rows ),
+		pieces = [],
+
+		// loop
+		i, j, left, top, mx, my;
+
+	// children animate complete:
+	function childComplete() {
+		pieces.push( this );
+		if ( pieces.length === rows * cells ) {
+			animComplete();
+		}
+	}
+
+	// clone the element for each row and cell.
+	for ( i = 0; i < rows ; i++ ) { // ===>
+		top = offset.top + i * height;
+		my = i - ( rows - 1 ) / 2 ;
+
+		for ( j = 0; j < cells ; j++ ) { // |||
+			left = offset.left + j * width;
+			mx = j - ( cells - 1 ) / 2 ;
+
+			// Create a clone of the now hidden main element that will be absolute positioned
+			// within a wrapper div off the -left and -top equal to size of our pieces
+			el
+				.clone()
+				.appendTo( "body" )
+				.wrap( "<div></div>" )
+				.css({
+					position: "absolute",
+					visibility: "visible",
+					left: -j * width,
+					top: -i * height
+				})
+
+			// select the wrapper - make it overflow: hidden and absolute positioned based on
+			// where the original was located +left and +top equal to the size of pieces
+				.parent()
+				.addClass( "ui-effects-explode" )
+				.css({
+					position: "absolute",
+					overflow: "hidden",
+					width: width,
+					height: height,
+					left: left + ( show ? mx * width : 0 ),
+					top: top + ( show ? my * height : 0 ),
+					opacity: show ? 0 : 1
+				}).animate({
+					left: left + ( show ? 0 : mx * width ),
+					top: top + ( show ? 0 : my * height ),
+					opacity: show ? 1 : 0
+				}, o.duration || 500, o.easing, childComplete );
+		}
+	}
+
+	function animComplete() {
+		el.css({
+			visibility: "visible"
+		});
+		$( pieces ).remove();
+		if ( !show ) {
+			el.hide();
+		}
+		done();
+	}
+};
+
+
+/*!
+ * jQuery UI Effects Fade 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/fade-effect/
+ */
+
+
+var effectFade = $.effects.effect.fade = function( o, done ) {
+	var el = $( this ),
+		mode = $.effects.setMode( el, o.mode || "toggle" );
+
+	el.animate({
+		opacity: mode
+	}, {
+		queue: false,
+		duration: o.duration,
+		easing: o.easing,
+		complete: done
+	});
+};
+
+
+/*!
+ * jQuery UI Effects Fold 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/fold-effect/
+ */
+
+
+var effectFold = $.effects.effect.fold = function( o, done ) {
+
+	// Create element
+	var el = $( this ),
+		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+		mode = $.effects.setMode( el, o.mode || "hide" ),
+		show = mode === "show",
+		hide = mode === "hide",
+		size = o.size || 15,
+		percent = /([0-9]+)%/.exec( size ),
+		horizFirst = !!o.horizFirst,
+		widthFirst = show !== horizFirst,
+		ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
+		duration = o.duration / 2,
+		wrapper, distance,
+		animation1 = {},
+		animation2 = {};
+
+	$.effects.save( el, props );
+	el.show();
+
+	// Create Wrapper
+	wrapper = $.effects.createWrapper( el ).css({
+		overflow: "hidden"
+	});
+	distance = widthFirst ?
+		[ wrapper.width(), wrapper.height() ] :
+		[ wrapper.height(), wrapper.width() ];
+
+	if ( percent ) {
+		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
+	}
+	if ( show ) {
+		wrapper.css( horizFirst ? {
+			height: 0,
+			width: size
+		} : {
+			height: size,
+			width: 0
+		});
+	}
+
+	// Animation
+	animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
+	animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
+
+	// Animate
+	wrapper
+		.animate( animation1, duration, o.easing )
+		.animate( animation2, duration, o.easing, function() {
+			if ( hide ) {
+				el.hide();
+			}
+			$.effects.restore( el, props );
+			$.effects.removeWrapper( el );
+			done();
+		});
+
+};
+
+
+/*!
+ * jQuery UI Effects Highlight 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/highlight-effect/
+ */
+
+
+var effectHighlight = $.effects.effect.highlight = function( o, done ) {
+	var elem = $( this ),
+		props = [ "backgroundImage", "backgroundColor", "opacity" ],
+		mode = $.effects.setMode( elem, o.mode || "show" ),
+		animation = {
+			backgroundColor: elem.css( "backgroundColor" )
+		};
+
+	if (mode === "hide") {
+		animation.opacity = 0;
+	}
+
+	$.effects.save( elem, props );
+
+	elem
+		.show()
+		.css({
+			backgroundImage: "none",
+			backgroundColor: o.color || "#ffff99"
+		})
+		.animate( animation, {
+			queue: false,
+			duration: o.duration,
+			easing: o.easing,
+			complete: function() {
+				if ( mode === "hide" ) {
+					elem.hide();
+				}
+				$.effects.restore( elem, props );
+				done();
+			}
+		});
+};
+
+
+/*!
+ * jQuery UI Effects Size 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/size-effect/
+ */
+
+
+var effectSize = $.effects.effect.size = function( o, done ) {
+
+	// Create element
+	var original, baseline, factor,
+		el = $( this ),
+		props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
+
+		// Always restore
+		props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
+
+		// Copy for children
+		props2 = [ "width", "height", "overflow" ],
+		cProps = [ "fontSize" ],
+		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
+		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
+
+		// Set options
+		mode = $.effects.setMode( el, o.mode || "effect" ),
+		restore = o.restore || mode !== "effect",
+		scale = o.scale || "both",
+		origin = o.origin || [ "middle", "center" ],
+		position = el.css( "position" ),
+		props = restore ? props0 : props1,
+		zero = {
+			height: 0,
+			width: 0,
+			outerHeight: 0,
+			outerWidth: 0
+		};
+
+	if ( mode === "show" ) {
+		el.show();
+	}
+	original = {
+		height: el.height(),
+		width: el.width(),
+		outerHeight: el.outerHeight(),
+		outerWidth: el.outerWidth()
+	};
+
+	if ( o.mode === "toggle" && mode === "show" ) {
+		el.from = o.to || zero;
+		el.to = o.from || original;
+	} else {
+		el.from = o.from || ( mode === "show" ? zero : original );
+		el.to = o.to || ( mode === "hide" ? zero : original );
+	}
+
+	// Set scaling factor
+	factor = {
+		from: {
+			y: el.from.height / original.height,
+			x: el.from.width / original.width
+		},
+		to: {
+			y: el.to.height / original.height,
+			x: el.to.width / original.width
+		}
+	};
+
+	// Scale the css box
+	if ( scale === "box" || scale === "both" ) {
+
+		// Vertical props scaling
+		if ( factor.from.y !== factor.to.y ) {
+			props = props.concat( vProps );
+			el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
+			el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
+		}
+
+		// Horizontal props scaling
+		if ( factor.from.x !== factor.to.x ) {
+			props = props.concat( hProps );
+			el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
+			el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
+		}
+	}
+
+	// Scale the content
+	if ( scale === "content" || scale === "both" ) {
+
+		// Vertical props scaling
+		if ( factor.from.y !== factor.to.y ) {
+			props = props.concat( cProps ).concat( props2 );
+			el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
+			el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
+		}
+	}
+
+	$.effects.save( el, props );
+	el.show();
+	$.effects.createWrapper( el );
+	el.css( "overflow", "hidden" ).css( el.from );
+
+	// Adjust
+	if (origin) { // Calculate baseline shifts
+		baseline = $.effects.getBaseline( origin, original );
+		el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
+		el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
+		el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
+		el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
+	}
+	el.css( el.from ); // set top & left
+
+	// Animate
+	if ( scale === "content" || scale === "both" ) { // Scale the children
+
+		// Add margins/font-size
+		vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
+		hProps = hProps.concat([ "marginLeft", "marginRight" ]);
+		props2 = props0.concat(vProps).concat(hProps);
+
+		el.find( "*[width]" ).each( function() {
+			var child = $( this ),
+				c_original = {
+					height: child.height(),
+					width: child.width(),
+					outerHeight: child.outerHeight(),
+					outerWidth: child.outerWidth()
+				};
+			if (restore) {
+				$.effects.save(child, props2);
+			}
+
+			child.from = {
+				height: c_original.height * factor.from.y,
+				width: c_original.width * factor.from.x,
+				outerHeight: c_original.outerHeight * factor.from.y,
+				outerWidth: c_original.outerWidth * factor.from.x
+			};
+			child.to = {
+				height: c_original.height * factor.to.y,
+				width: c_original.width * factor.to.x,
+				outerHeight: c_original.height * factor.to.y,
+				outerWidth: c_original.width * factor.to.x
+			};
+
+			// Vertical props scaling
+			if ( factor.from.y !== factor.to.y ) {
+				child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
+				child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
+			}
+
+			// Horizontal props scaling
+			if ( factor.from.x !== factor.to.x ) {
+				child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
+				child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
+			}
+
+			// Animate children
+			child.css( child.from );
+			child.animate( child.to, o.duration, o.easing, function() {
+
+				// Restore children
+				if ( restore ) {
+					$.effects.restore( child, props2 );
+				}
+			});
+		});
+	}
+
+	// Animate
+	el.animate( el.to, {
+		queue: false,
+		duration: o.duration,
+		easing: o.easing,
+		complete: function() {
+			if ( el.to.opacity === 0 ) {
+				el.css( "opacity", el.from.opacity );
+			}
+			if ( mode === "hide" ) {
+				el.hide();
+			}
+			$.effects.restore( el, props );
+			if ( !restore ) {
+
+				// we need to calculate our new positioning based on the scaling
+				if ( position === "static" ) {
+					el.css({
+						position: "relative",
+						top: el.to.top,
+						left: el.to.left
+					});
+				} else {
+					$.each([ "top", "left" ], function( idx, pos ) {
+						el.css( pos, function( _, str ) {
+							var val = parseInt( str, 10 ),
+								toRef = idx ? el.to.left : el.to.top;
+
+							// if original was "auto", recalculate the new value from wrapper
+							if ( str === "auto" ) {
+								return toRef + "px";
+							}
+
+							return val + toRef + "px";
+						});
+					});
+				}
+			}
+
+			$.effects.removeWrapper( el );
+			done();
+		}
+	});
+
+};
+
+
+/*!
+ * jQuery UI Effects Scale 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/scale-effect/
+ */
+
+
+var effectScale = $.effects.effect.scale = function( o, done ) {
+
+	// Create element
+	var el = $( this ),
+		options = $.extend( true, {}, o ),
+		mode = $.effects.setMode( el, o.mode || "effect" ),
+		percent = parseInt( o.percent, 10 ) ||
+			( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
+		direction = o.direction || "both",
+		origin = o.origin,
+		original = {
+			height: el.height(),
+			width: el.width(),
+			outerHeight: el.outerHeight(),
+			outerWidth: el.outerWidth()
+		},
+		factor = {
+			y: direction !== "horizontal" ? (percent / 100) : 1,
+			x: direction !== "vertical" ? (percent / 100) : 1
+		};
+
+	// We are going to pass this effect to the size effect:
+	options.effect = "size";
+	options.queue = false;
+	options.complete = done;
+
+	// Set default origin and restore for show/hide
+	if ( mode !== "effect" ) {
+		options.origin = origin || [ "middle", "center" ];
+		options.restore = true;
+	}
+
+	options.from = o.from || ( mode === "show" ? {
+		height: 0,
+		width: 0,
+		outerHeight: 0,
+		outerWidth: 0
+	} : original );
+	options.to = {
+		height: original.height * factor.y,
+		width: original.width * factor.x,
+		outerHeight: original.outerHeight * factor.y,
+		outerWidth: original.outerWidth * factor.x
+	};
+
+	// Fade option to support puff
+	if ( options.fade ) {
+		if ( mode === "show" ) {
+			options.from.opacity = 0;
+			options.to.opacity = 1;
+		}
+		if ( mode === "hide" ) {
+			options.from.opacity = 1;
+			options.to.opacity = 0;
+		}
+	}
+
+	// Animate
+	el.effect( options );
+
+};
+
+
+/*!
+ * jQuery UI Effects Puff 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/puff-effect/
+ */
+
+
+var effectPuff = $.effects.effect.puff = function( o, done ) {
+	var elem = $( this ),
+		mode = $.effects.setMode( elem, o.mode || "hide" ),
+		hide = mode === "hide",
+		percent = parseInt( o.percent, 10 ) || 150,
+		factor = percent / 100,
+		original = {
+			height: elem.height(),
+			width: elem.width(),
+			outerHeight: elem.outerHeight(),
+			outerWidth: elem.outerWidth()
+		};
+
+	$.extend( o, {
+		effect: "scale",
+		queue: false,
+		fade: true,
+		mode: mode,
+		complete: done,
+		percent: hide ? percent : 100,
+		from: hide ?
+			original :
+			{
+				height: original.height * factor,
+				width: original.width * factor,
+				outerHeight: original.outerHeight * factor,
+				outerWidth: original.outerWidth * factor
+			}
+	});
+
+	elem.effect( o );
+};
+
+
+/*!
+ * jQuery UI Effects Pulsate 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/pulsate-effect/
+ */
+
+
+var effectPulsate = $.effects.effect.pulsate = function( o, done ) {
+	var elem = $( this ),
+		mode = $.effects.setMode( elem, o.mode || "show" ),
+		show = mode === "show",
+		hide = mode === "hide",
+		showhide = ( show || mode === "hide" ),
+
+		// showing or hiding leaves of the "last" animation
+		anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
+		duration = o.duration / anims,
+		animateTo = 0,
+		queue = elem.queue(),
+		queuelen = queue.length,
+		i;
+
+	if ( show || !elem.is(":visible")) {
+		elem.css( "opacity", 0 ).show();
+		animateTo = 1;
+	}
+
+	// anims - 1 opacity "toggles"
+	for ( i = 1; i < anims; i++ ) {
+		elem.animate({
+			opacity: animateTo
+		}, duration, o.easing );
+		animateTo = 1 - animateTo;
+	}
+
+	elem.animate({
+		opacity: animateTo
+	}, duration, o.easing);
+
+	elem.queue(function() {
+		if ( hide ) {
+			elem.hide();
+		}
+		done();
+	});
+
+	// We just queued up "anims" animations, we need to put them next in the queue
+	if ( queuelen > 1 ) {
+		queue.splice.apply( queue,
+			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+	}
+	elem.dequeue();
+};
+
+
+/*!
+ * jQuery UI Effects Shake 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/shake-effect/
+ */
+
+
+var effectShake = $.effects.effect.shake = function( o, done ) {
+
+	var el = $( this ),
+		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+		mode = $.effects.setMode( el, o.mode || "effect" ),
+		direction = o.direction || "left",
+		distance = o.distance || 20,
+		times = o.times || 3,
+		anims = times * 2 + 1,
+		speed = Math.round( o.duration / anims ),
+		ref = (direction === "up" || direction === "down") ? "top" : "left",
+		positiveMotion = (direction === "up" || direction === "left"),
+		animation = {},
+		animation1 = {},
+		animation2 = {},
+		i,
+
+		// we will need to re-assemble the queue to stack our animations in place
+		queue = el.queue(),
+		queuelen = queue.length;
+
+	$.effects.save( el, props );
+	el.show();
+	$.effects.createWrapper( el );
+
+	// Animation
+	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
+	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
+	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
+
+	// Animate
+	el.animate( animation, speed, o.easing );
+
+	// Shakes
+	for ( i = 1; i < times; i++ ) {
+		el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
+	}
+	el
+		.animate( animation1, speed, o.easing )
+		.animate( animation, speed / 2, o.easing )
+		.queue(function() {
+			if ( mode === "hide" ) {
+				el.hide();
+			}
+			$.effects.restore( el, props );
+			$.effects.removeWrapper( el );
+			done();
+		});
+
+	// inject all the animations we just queued to be first in line (after "inprogress")
+	if ( queuelen > 1) {
+		queue.splice.apply( queue,
+			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+	}
+	el.dequeue();
+
+};
+
+
+/*!
+ * jQuery UI Effects Slide 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/slide-effect/
+ */
+
+
+var effectSlide = $.effects.effect.slide = function( o, done ) {
+
+	// Create element
+	var el = $( this ),
+		props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
+		mode = $.effects.setMode( el, o.mode || "show" ),
+		show = mode === "show",
+		direction = o.direction || "left",
+		ref = (direction === "up" || direction === "down") ? "top" : "left",
+		positiveMotion = (direction === "up" || direction === "left"),
+		distance,
+		animation = {};
+
+	// Adjust
+	$.effects.save( el, props );
+	el.show();
+	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
+
+	$.effects.createWrapper( el ).css({
+		overflow: "hidden"
+	});
+
+	if ( show ) {
+		el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
+	}
+
+	// Animation
+	animation[ ref ] = ( show ?
+		( positiveMotion ? "+=" : "-=") :
+		( positiveMotion ? "-=" : "+=")) +
+		distance;
+
+	// Animate
+	el.animate( animation, {
+		queue: false,
+		duration: o.duration,
+		easing: o.easing,
+		complete: function() {
+			if ( mode === "hide" ) {
+				el.hide();
+			}
+			$.effects.restore( el, props );
+			$.effects.removeWrapper( el );
+			done();
+		}
+	});
+};
+
+
+/*!
+ * jQuery UI Effects Transfer 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/transfer-effect/
+ */
+
+
+var effectTransfer = $.effects.effect.transfer = function( o, done ) {
+	var elem = $( this ),
+		target = $( o.to ),
+		targetFixed = target.css( "position" ) === "fixed",
+		body = $("body"),
+		fixTop = targetFixed ? body.scrollTop() : 0,
+		fixLeft = targetFixed ? body.scrollLeft() : 0,
+		endPosition = target.offset(),
+		animation = {
+			top: endPosition.top - fixTop,
+			left: endPosition.left - fixLeft,
+			height: target.innerHeight(),
+			width: target.innerWidth()
+		},
+		startPosition = elem.offset(),
+		transfer = $( "<div class='ui-effects-transfer'></div>" )
+			.appendTo( document.body )
+			.addClass( o.className )
+			.css({
+				top: startPosition.top - fixTop,
+				left: startPosition.left - fixLeft,
+				height: elem.innerHeight(),
+				width: elem.innerWidth(),
+				position: targetFixed ? "fixed" : "absolute"
+			})
+			.animate( animation, o.duration, o.easing, function() {
+				transfer.remove();
+				done();
+			});
+};
+
+
+
+}));
\ No newline at end of file
diff --git a/inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.css b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.css
new file mode 100644
index 0000000..4257a0d
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.css
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.11.4 - 2016-01-05
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgC [...]
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;heig [...]
\ No newline at end of file
diff --git a/inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.js b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.js
new file mode 100644
index 0000000..842b5d2
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.min.js
@@ -0,0 +1,12 @@
+/*! jQuery UI - v1.11.4 - 2016-01-05
+* http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size [...]
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this, [...]
+})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trig [...]
+i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.re [...]
+t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icon [...]
+},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,func [...]
+},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._f [...]
+}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth" [...]
\ No newline at end of file
diff --git a/inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.css b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.css
new file mode 100644
index 0000000..842410e
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.css
@@ -0,0 +1,668 @@
+/*!
+ * jQuery UI CSS Framework 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/theming/
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+	display: none;
+}
+.ui-helper-hidden-accessible {
+	border: 0;
+	clip: rect(0 0 0 0);
+	height: 1px;
+	margin: -1px;
+	overflow: hidden;
+	padding: 0;
+	position: absolute;
+	width: 1px;
+}
+.ui-helper-reset {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	outline: 0;
+	line-height: 1.3;
+	text-decoration: none;
+	font-size: 100%;
+	list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+	content: "";
+	display: table;
+	border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+	clear: both;
+}
+.ui-helper-clearfix {
+	min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+	width: 100%;
+	height: 100%;
+	top: 0;
+	left: 0;
+	position: absolute;
+	opacity: 0;
+	filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+	z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+	cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	display: block;
+	text-indent: -99999px;
+	overflow: hidden;
+	background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.ui-draggable-handle {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-resizable {
+	position: relative;
+}
+.ui-resizable-handle {
+	position: absolute;
+	font-size: 0.1px;
+	display: block;
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+	display: none;
+}
+.ui-resizable-n {
+	cursor: n-resize;
+	height: 7px;
+	width: 100%;
+	top: -5px;
+	left: 0;
+}
+.ui-resizable-s {
+	cursor: s-resize;
+	height: 7px;
+	width: 100%;
+	bottom: -5px;
+	left: 0;
+}
+.ui-resizable-e {
+	cursor: e-resize;
+	width: 7px;
+	right: -5px;
+	top: 0;
+	height: 100%;
+}
+.ui-resizable-w {
+	cursor: w-resize;
+	width: 7px;
+	left: -5px;
+	top: 0;
+	height: 100%;
+}
+.ui-resizable-se {
+	cursor: se-resize;
+	width: 12px;
+	height: 12px;
+	right: 1px;
+	bottom: 1px;
+}
+.ui-resizable-sw {
+	cursor: sw-resize;
+	width: 9px;
+	height: 9px;
+	left: -5px;
+	bottom: -5px;
+}
+.ui-resizable-nw {
+	cursor: nw-resize;
+	width: 9px;
+	height: 9px;
+	left: -5px;
+	top: -5px;
+}
+.ui-resizable-ne {
+	cursor: ne-resize;
+	width: 9px;
+	height: 9px;
+	right: -5px;
+	top: -5px;
+}
+.ui-selectable {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-selectable-helper {
+	position: absolute;
+	z-index: 100;
+	border: 1px dotted black;
+}
+.ui-sortable-handle {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+	display: block;
+	cursor: pointer;
+	position: relative;
+	margin: 2px 0 0 0;
+	padding: .5em .5em .5em .7em;
+	min-height: 0; /* support: IE7 */
+	font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+	padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+	padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+	position: absolute;
+	left: .5em;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+	padding: 1em 2.2em;
+	border-top: 0;
+	overflow: auto;
+}
+.ui-autocomplete {
+	position: absolute;
+	top: 0;
+	left: 0;
+	cursor: default;
+}
+.ui-button {
+	display: inline-block;
+	position: relative;
+	padding: 0;
+	line-height: normal;
+	margin-right: .1em;
+	cursor: pointer;
+	vertical-align: middle;
+	text-align: center;
+	overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+	text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+	width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+	width: 2.4em;
+}
+.ui-button-icons-only {
+	width: 3.4em;
+}
+button.ui-button-icons-only {
+	width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+	display: block;
+	line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+	padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+	padding: .4em;
+	text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+	padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+	padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+	padding-left: 2.1em;
+	padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+	padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+	position: absolute;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+	left: 50%;
+	margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+	left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+	right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+	margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+	margin-left: 0;
+	margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+	border: 0;
+	padding: 0;
+}
+.ui-dialog {
+	overflow: hidden;
+	position: absolute;
+	top: 0;
+	left: 0;
+	padding: .2em;
+	outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+	padding: .4em 1em;
+	position: relative;
+}
+.ui-dialog .ui-dialog-title {
+	float: left;
+	margin: .1em 0;
+	white-space: nowrap;
+	width: 90%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+	position: absolute;
+	right: .3em;
+	top: 50%;
+	width: 20px;
+	margin: -10px 0 0 0;
+	padding: 1px;
+	height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+	position: relative;
+	border: 0;
+	padding: .5em 1em;
+	background: none;
+	overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+	text-align: left;
+	border-width: 1px 0 0 0;
+	background-image: none;
+	margin-top: .5em;
+	padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+	float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+	margin: .5em .4em .5em 0;
+	cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+	width: 12px;
+	height: 12px;
+	right: -5px;
+	bottom: -5px;
+	background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+	cursor: move;
+}
+.ui-menu {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+	display: block;
+	outline: none;
+}
+.ui-menu .ui-menu {
+	position: absolute;
+}
+.ui-menu .ui-menu-item {
+	position: relative;
+	margin: 0;
+	padding: 3px 1em 3px .4em;
+	cursor: pointer;
+	min-height: 0; /* support: IE7 */
+	/* support: IE10, see #8844 */
+	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+	margin: 5px 0;
+	height: 0;
+	font-size: 0;
+	line-height: 0;
+	border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+	margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+	position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+	padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: .2em;
+	margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+	left: auto;
+	right: 0;
+}
+.ui-progressbar {
+	height: 2em;
+	text-align: left;
+	overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+	margin: -1px;
+	height: 100%;
+}
+.ui-progressbar .ui-progressbar-overlay {
+	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmo [...]
+	height: 100%;
+	filter: alpha(opacity=25); /* support: IE8 */
+	opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+	background-image: none;
+}
+.ui-selectmenu-menu {
+	padding: 0;
+	margin: 0;
+	position: absolute;
+	top: 0;
+	left: 0;
+	display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+	overflow: auto;
+	/* Support: IE7 */
+	overflow-x: hidden;
+	padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+	font-size: 1em;
+	font-weight: bold;
+	line-height: 1.5;
+	padding: 2px 0.4em;
+	margin: 0.5em 0 0 0;
+	height: auto;
+	border: 0;
+}
+.ui-selectmenu-open {
+	display: block;
+}
+.ui-selectmenu-button {
+	display: inline-block;
+	overflow: hidden;
+	position: relative;
+	text-decoration: none;
+	cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+	right: 0.5em;
+	left: auto;
+	margin-top: -8px;
+	position: absolute;
+	top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+	text-align: left;
+	padding: 0.4em 2.1em 0.4em 1em;
+	display: block;
+	line-height: 1.4;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+.ui-slider {
+	position: relative;
+	text-align: left;
+}
+.ui-slider .ui-slider-handle {
+	position: absolute;
+	z-index: 2;
+	width: 1.2em;
+	height: 1.2em;
+	cursor: default;
+	-ms-touch-action: none;
+	touch-action: none;
+}
+.ui-slider .ui-slider-range {
+	position: absolute;
+	z-index: 1;
+	font-size: .7em;
+	display: block;
+	border: 0;
+	background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+	filter: inherit;
+}
+
+.ui-slider-horizontal {
+	height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+	top: -.3em;
+	margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+	top: 0;
+	height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+	left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+	right: 0;
+}
+
+.ui-slider-vertical {
+	width: .8em;
+	height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+	left: -.3em;
+	margin-left: 0;
+	margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+	left: 0;
+	width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+	bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+	top: 0;
+}
+.ui-spinner {
+	position: relative;
+	display: inline-block;
+	overflow: hidden;
+	padding: 0;
+	vertical-align: middle;
+}
+.ui-spinner-input {
+	border: none;
+	background: none;
+	color: inherit;
+	padding: 0;
+	margin: .2em 0;
+	vertical-align: middle;
+	margin-left: .4em;
+	margin-right: 22px;
+}
+.ui-spinner-button {
+	width: 16px;
+	height: 50%;
+	font-size: .5em;
+	padding: 0;
+	margin: 0;
+	text-align: center;
+	position: absolute;
+	cursor: default;
+	display: block;
+	overflow: hidden;
+	right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+	border-top: none;
+	border-bottom: none;
+	border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+	position: absolute;
+	margin-top: -8px;
+	top: 50%;
+	left: 0;
+}
+.ui-spinner-up {
+	top: 0;
+}
+.ui-spinner-down {
+	bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+	/* need to fix icons sprite */
+	background-position: -65px -16px;
+}
+.ui-tabs {
+	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+	padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+	margin: 0;
+	padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+	list-style: none;
+	float: left;
+	position: relative;
+	top: 0;
+	margin: 1px .2em 0 0;
+	border-bottom-width: 0;
+	padding: 0;
+	white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+	float: left;
+	padding: .5em 1em;
+	text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+	margin-bottom: -1px;
+	padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+	cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+	cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+	display: block;
+	border-width: 0;
+	padding: 1em 1.4em;
+	background: none;
+}
+.ui-tooltip {
+	padding: 8px;
+	position: absolute;
+	z-index: 9999;
+	max-width: 300px;
+	-webkit-box-shadow: 0 0 5px #aaa;
+	box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+	border-width: 2px;
+}
diff --git a/inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.min.css b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.min.css
new file mode 100644
index 0000000..8956c85
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.structure.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.11.4 - 2016-01-05
+* http://jqueryui.com
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;heig [...]
\ No newline at end of file
diff --git a/inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.css b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.css
new file mode 100644
index 0000000..998a19d
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.css
@@ -0,0 +1,410 @@
+/*!
+ * jQuery UI CSS Framework 1.11.4
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/theming/
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bg [...]
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+	font-family: Arial,Helvetica,sans-serif;
+	font-size: 1em;
+}
+.ui-widget .ui-widget {
+	font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+	font-family: Arial,Helvetica,sans-serif;
+	font-size: 1em;
+}
+.ui-widget-content {
+	border: 1px solid #dddddd;
+	background: #ffffff;
+	color: #333333;
+}
+.ui-widget-content a {
+	color: #333333;
+}
+.ui-widget-header {
+	border: 1px solid #dddddd;
+	background: #e9e9e9;
+	color: #333333;
+	font-weight: bold;
+}
+.ui-widget-header a {
+	color: #333333;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+	border: 1px solid #c5c5c5;
+	background: #f6f6f6;
+	font-weight: normal;
+	color: #454545;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+	color: #454545;
+	text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+	border: 1px solid #cccccc;
+	background: #ededed;
+	font-weight: normal;
+	color: #2b2b2b;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+	color: #2b2b2b;
+	text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+	border: 1px solid #003eff;
+	background: #007fff;
+	font-weight: normal;
+	color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+	color: #ffffff;
+	text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+	border: 1px solid #dad55e;
+	background: #fffa90;
+	color: #777620;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+	color: #777620;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+	border: 1px solid #f1a899;
+	background: #fddfdf;
+	color: #5f3f3f;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+	color: #5f3f3f;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+	color: #5f3f3f;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+	font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+	opacity: .7;
+	filter:Alpha(Opacity=70); /* support: IE8 */
+	font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+	opacity: .35;
+	filter:Alpha(Opacity=35); /* support: IE8 */
+	background-image: none;
+}
+.ui-state-disabled .ui-icon {
+	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	width: 16px;
+	height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+	background-image: url("images/ui-icons_444444_256x240.png");
+}
+.ui-widget-header .ui-icon {
+	background-image: url("images/ui-icons_444444_256x240.png");
+}
+.ui-state-default .ui-icon {
+	background-image: url("images/ui-icons_777777_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+	background-image: url("images/ui-icons_555555_256x240.png");
+}
+.ui-state-active .ui-icon {
+	background-image: url("images/ui-icons_ffffff_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+	background-image: url("images/ui-icons_777620_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+	background-image: url("images/ui-icons_cc0000_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+	border-top-left-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+	border-top-right-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+	border-bottom-left-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+	border-bottom-right-radius: 3px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+	background: #aaaaaa;
+	opacity: .3;
+	filter: Alpha(Opacity=30); /* support: IE8 */
+}
+.ui-widget-shadow {
+	margin: 0px 0 0 0px;
+	padding: 5px;
+	background: #666666;
+	opacity: .3;
+	filter: Alpha(Opacity=30); /* support: IE8 */
+	border-radius: 8px;
+}
diff --git a/inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.min.css b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.min.css
new file mode 100644
index 0000000..f43d108
--- /dev/null
+++ b/inst/rmd/h/jqueryui-1.11.4/jquery-ui.theme.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.11.4 - 2016-01-05
+* http://jqueryui.com
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-d [...]
\ No newline at end of file
diff --git a/inst/rmd/h/jqueryui-AUTHORS.txt b/inst/rmd/h/jqueryui-AUTHORS.txt
new file mode 100644
index 0000000..2e124d3
--- /dev/null
+++ b/inst/rmd/h/jqueryui-AUTHORS.txt
@@ -0,0 +1,315 @@
+Authors ordered by first contribution
+A list of current team members is available at http://jqueryui.com/about
+
+Paul Bakaus <paul.bakaus at gmail.com>
+Richard Worth <rdworth at gmail.com>
+Yehuda Katz <wycats at gmail.com>
+Sean Catchpole <sean at sunsean.com>
+John Resig <jeresig at gmail.com>
+Tane Piper <piper.tane at gmail.com>
+Dmitri Gaskin <dmitrig01 at gmail.com>
+Klaus Hartl <klaus.hartl at gmail.com>
+Stefan Petre <stefan.petre at gmail.com>
+Gilles van den Hoven <gilles at webunity.nl>
+Micheil Bryan Smith <micheil at brandedcode.com>
+Jörn Zaefferer <joern.zaefferer at gmail.com>
+Marc Grabanski <m at marcgrabanski.com>
+Keith Wood <kbwood at iinet.com.au>
+Brandon Aaron <brandon.aaron at gmail.com>
+Scott González <scott.gonzalez at gmail.com>
+Eduardo Lundgren <eduardolundgren at gmail.com>
+Aaron Eisenberger <aaronchi at gmail.com>
+Joan Piedra <theneojp at gmail.com>
+Bruno Basto <b.basto at gmail.com>
+Remy Sharp <remy at leftlogic.com>
+Bohdan Ganicky <bohdan.ganicky at gmail.com>
+David Bolter <david.bolter at gmail.com>
+Chi Cheng <cloudream at gmail.com>
+Ca-Phun Ung <pazu2k at gmail.com>
+Ariel Flesler <aflesler at gmail.com>
+Maggie Wachs <maggie at filamentgroup.com>
+Scott Jehl <scottjehl at gmail.com>
+Todd Parker <todd at filamentgroup.com>
+Andrew Powell <andrew at shellscape.org>
+Brant Burnett <btburnett3 at gmail.com>
+Douglas Neiner <doug at dougneiner.com>
+Paul Irish <paul.irish at gmail.com>
+Ralph Whitbeck <ralph.whitbeck at gmail.com>
+Thibault Duplessis <thibault.duplessis at gmail.com>
+Dominique Vincent <dominique.vincent at toitl.com>
+Jack Hsu <jack.hsu at gmail.com>
+Adam Sontag <ajpiano at ajpiano.com>
+Carl Fürstenberg <carl at excito.com>
+Kevin Dalman <development at allpro.net>
+Alberto Fernández Capel <afcapel at gmail.com>
+Jacek Jędrzejewski (http://jacek.jedrzejewski.name)
+Ting Kuei <ting at kuei.com>
+Samuel Cormier-Iijima <sam at chide.it>
+Jon Palmer <jonspalmer at gmail.com>
+Ben Hollis <bhollis at amazon.com>
+Justin MacCarthy <Justin at Rubystars.biz>
+Eyal Kobrigo <kobrigo at hotmail.com>
+Tiago Freire <tiago.freire at gmail.com>
+Diego Tres <diegotres at gmail.com>
+Holger Rüprich <holger at rueprich.de>
+Ziling Zhao <zilingzhao at gmail.com>
+Mike Alsup <malsup at gmail.com>
+Robson Braga Araujo <robsonbraga at gmail.com>
+Pierre-Henri Ausseil <ph.ausseil at gmail.com>
+Christopher McCulloh <cmcculloh at gmail.com>
+Andrew Newcomb <ext.github at preceptsoftware.co.uk>
+Lim Chee Aun <cheeaun at gmail.com>
+Jorge Barreiro <yortx.barry at gmail.com>
+Daniel Steigerwald <daniel at steigerwald.cz>
+John Firebaugh <john_firebaugh at bigfix.com>
+John Enters <github at darkdark.net>
+Andrey Kapitcyn <ru.m157y at gmail.com>
+Dmitry Petrov <dpetroff at gmail.com>
+Eric Hynds <eric at hynds.net>
+Chairat Sunthornwiphat <pipo at sixhead.com>
+Josh Varner <josh.varner at gmail.com>
+Stéphane Raimbault <stephane.raimbault at gmail.com>
+Jay Merrifield <fracmak at gmail.com>
+J. Ryan Stinnett <jryans at gmail.com>
+Peter Heiberg <peter at heiberg.se>
+Alex Dovenmuehle <adovenmuehle at gmail.com>
+Jamie Gegerson <git at jamiegegerson.com>
+Raymond Schwartz <skeetergraphics at gmail.com>
+Phillip Barnes <philbar at gmail.com>
+Kyle Wilkinson <kai at wikyd.org>
+Khaled AlHourani <me at khaledalhourani.com>
+Marian Rudzynski <mr at impaled.org>
+Jean-Francois Remy <jeff at melix.org>
+Doug Blood <dougblood at gmail.com>
+Filippo Cavallarin <filippo.cavallarin at codseq.it>
+Heiko Henning <heiko at thehennings.ch>
+Aliaksandr Rahalevich <saksmlz at gmail.com>
+Mario Visic <mario at mariovisic.com>
+Xavi Ramirez <xavi.rmz at gmail.com>
+Max Schnur <max.schnur at gmail.com>
+Saji Nediyanchath <saji89 at gmail.com>
+Corey Frang <gnarf37 at gmail.com>
+Aaron Peterson <aaronp123 at yahoo.com>
+Ivan Peters <ivan at ivanpeters.com>
+Mohamed Cherif Bouchelaghem <cherifbouchelaghem at yahoo.fr>
+Marcos Sousa <falecomigo at marcossousa.com>
+Michael DellaNoce <mdellanoce at mailtrust.com>
+George Marshall <echosx at gmail.com>
+Tobias Brunner <tobias at strongswan.org>
+Martin Solli <msolli at gmail.com>
+David Petersen <public at petersendidit.com>
+Dan Heberden <danheberden at gmail.com>
+William Kevin Manire <williamkmanire at gmail.com>
+Gilmore Davidson <gilmoreorless at gmail.com>
+Michael Wu <michaelmwu at gmail.com>
+Adam Parod <mystic414 at gmail.com>
+Guillaume Gautreau <guillaume+github at ghusse.com>
+Marcel Toele <EleotleCram at gmail.com>
+Dan Streetman <ddstreet at ieee.org>
+Matt Hoskins <matt at nipltd.com>
+Giovanni Giacobbi <giovanni at giacobbi.net>
+Kyle Florence <kyle.florence at gmail.com>
+Pavol Hluchý <lopo at losys.sk>
+Hans Hillen <hans.hillen at gmail.com>
+Mark Johnson <virgofx at live.com>
+Trey Hunner <treyhunner at gmail.com>
+Shane Whittet <whittet at gmail.com>
+Edward A Faulkner <ef at alum.mit.edu>
+Adam Baratz <adam at adambaratz.com>
+Kato Kazuyoshi <kato.kazuyoshi at gmail.com>
+Eike Send <eike.send at gmail.com>
+Kris Borchers <kris.borchers at gmail.com>
+Eddie Monge <eddie at eddiemonge.com>
+Israel Tsadok <itsadok at gmail.com>
+Carson McDonald <carson at ioncannon.net>
+Jason Davies <jason at jasondavies.com>
+Garrison Locke <gplocke at gmail.com>
+David Murdoch <david at davidmurdoch.com>
+Benjamin Scott Boyle <benjamins.boyle at gmail.com>
+Jesse Baird <jebaird at gmail.com>
+Jonathan Vingiano <jvingiano at gmail.com>
+Dylan Just <dev at ephox.com>
+Hiroshi Tomita <tomykaira at gmail.com>
+Glenn Goodrich <glenn.goodrich at gmail.com>
+Tarafder Ashek-E-Elahi <mail.ashek at gmail.com>
+Ryan Neufeld <ryan at neufeldmail.com>
+Marc Neuwirth <marc.neuwirth at gmail.com>
+Philip Graham <philip.robert.graham at gmail.com>
+Benjamin Sterling <benjamin.sterling at kenzomedia.com>
+Wesley Walser <waw325 at gmail.com>
+Kouhei Sutou <kou at clear-code.com>
+Karl Kirch <karlkrch at gmail.com>
+Chris Kelly <ckdake at ckdake.com>
+Jason Oster <jay at kodewerx.org>
+Felix Nagel <info at felixnagel.com>
+Alexander Polomoshnov <alex.polomoshnov at gmail.com>
+David Leal <dgleal at gmail.com>
+Igor Milla <igor.fsp.milla at gmail.com>
+Dave Methvin <dave.methvin at gmail.com>
+Florian Gutmann <f.gutmann at chronimo.com>
+Marwan Al Jubeh <marwan.aljubeh at gmail.com>
+Milan Broum <midlis at googlemail.com>
+Sebastian Sauer <info at dynpages.de>
+Gaëtan Muller <m.gaetan89 at gmail.com>
+Michel Weimerskirch <michel at weimerskirch.net>
+William Griffiths <william at ycymro.com>
+Stojce Slavkovski <stojce at gmail.com>
+David Soms <david.soms at gmail.com>
+David De Sloovere <david.desloovere at outlook.com>
+Michael P. Jung <michael.jung at terreon.de>
+Shannon Pekary <spekary at gmail.com>
+Dan Wellman <danwellman at hotmail.com>
+Matthew Edward Hutton <meh at corefiling.co.uk>
+James Khoury <james at jameskhoury.com>
+Rob Loach <robloach at gmail.com>
+Alberto Monteiro <betimbrasil at gmail.com>
+Alex Rhea <alex.rhea at gmail.com>
+Krzysztof Rosiński <rozwell69 at gmail.com>
+Ryan Olton <oltonr at gmail.com>
+Genie <386 at mail.com>
+Rick Waldron <waldron.rick at gmail.com>
+Ian Simpson <spoonlikesham at gmail.com>
+Lev Kitsis <spam4lev at gmail.com>
+TJ VanToll <tj.vantoll at gmail.com>
+Justin Domnitz <jdomnitz at gmail.com>
+Douglas Cerna <douglascerna at yahoo.com>
+Bert ter Heide <bertjh at hotmail.com>
+Jasvir Nagra <jasvir at gmail.com>
+Yuriy Khabarov <13real008 at gmail.com>
+Harri Kilpiö <harri.kilpio at gmail.com>
+Lado Lomidze <lado.lomidze at gmail.com>
+Amir E. Aharoni <amir.aharoni at mail.huji.ac.il>
+Simon Sattes <simon.sattes at gmail.com>
+Jo Liss <joliss42 at gmail.com>
+Guntupalli Karunakar <karunakarg at yahoo.com>
+Shahyar Ghobadpour <shahyar at gmail.com>
+Lukasz Lipinski <uzza17 at gmail.com>
+Timo Tijhof <krinklemail at gmail.com>
+Jason Moon <jmoon at socialcast.com>
+Martin Frost <martinf55 at hotmail.com>
+Eneko Illarramendi <eneko at illarra.com>
+EungJun Yi <semtlenori at gmail.com>
+Courtland Allen <courtlandallen at gmail.com>
+Viktar Varvanovich <non4eg at gmail.com>
+Danny Trunk <dtrunk90 at gmail.com>
+Pavel Stetina <pavel.stetina at nangu.tv>
+Michael Stay <metaweta at gmail.com>
+Steven Roussey <sroussey at gmail.com>
+Michael Hollis <hollis21 at gmail.com>
+Lee Rowlands <lee.rowlands at previousnext.com.au>
+Timmy Willison <timmywillisn at gmail.com>
+Karl Swedberg <kswedberg at gmail.com>
+Baoju Yuan <the_guy_1987 at hotmail.com>
+Maciej Mroziński <maciej.k.mrozinski at gmail.com>
+Luis Dalmolin <luis.nh at gmail.com>
+Mark Aaron Shirley <maspwr at gmail.com>
+Martin Hoch <martin at fidion.de>
+Jiayi Yang <tr870829 at gmail.com>
+Philipp Benjamin Köppchen <xgxtpbk at gws.ms>
+Sindre Sorhus <sindresorhus at gmail.com>
+Bernhard Sirlinger <bernhard.sirlinger at tele2.de>
+Jared A. Scheel <jared at jaredscheel.com>
+Rafael Xavier de Souza <rxaviers at gmail.com>
+John Chen <zhang.z.chen at intel.com>
+Robert Beuligmann <robertbeuligmann at gmail.com>
+Dale Kocian <dale.kocian at gmail.com>
+Mike Sherov <mike.sherov at gmail.com>
+Andrew Couch <andy at couchand.com>
+Marc-Andre Lafortune <github at marc-andre.ca>
+Nate Eagle <nate.eagle at teamaol.com>
+David Souther <davidsouther at gmail.com>
+Mathias Stenbom <mathias at stenbom.com>
+Sergey Kartashov <ebishkek at yandex.ru>
+Avinash R <nashpapa at gmail.com>
+Ethan Romba <ethanromba at gmail.com>
+Cory Gackenheimer <cory.gack at gmail.com>
+Juan Pablo Kaniefsky <jpkaniefsky at gmail.com>
+Roman Salnikov <bardt.dz at gmail.com>
+Anika Henke <anika at selfthinker.org>
+Samuel Bovée <samycookie2000 at yahoo.fr>
+Fabrício Matté <ult_combo at hotmail.com>
+Viktor Kojouharov <vkojouharov at gmail.com>
+Pawel Maruszczyk (http://hrabstwo.net)
+Pavel Selitskas <p.selitskas at gmail.com>
+Bjørn Johansen <post at bjornjohansen.no>
+Matthieu Penant <thieum22 at hotmail.com>
+Dominic Barnes <dominic at dbarnes.info>
+David Sullivan <david.sullivan at gmail.com>
+Thomas Jaggi <thomas at responsive.ch>
+Vahid Sohrabloo <vahid4134 at gmail.com>
+Travis Carden <travis.carden at gmail.com>
+Bruno M. Custódio <bruno at brunomcustodio.com>
+Nathanael Silverman <nathanael.silverman at gmail.com>
+Christian Wenz <christian at wenz.org>
+Steve Urmston <steve at urm.st>
+Zaven Muradyan <megalivoithos at gmail.com>
+Woody Gilk <shadowhand at deviantart.com>
+Zbigniew Motyka <zbigniew.motyka at gmail.com>
+Suhail Alkowaileet <xsoh.k7 at gmail.com>
+Toshi MARUYAMA <marutosijp2 at yahoo.co.jp>
+David Hansen <hansede at gmail.com>
+Brian Grinstead <briangrinstead at gmail.com>
+Christian Klammer <christian314159 at gmail.com>
+Steven Luscher <jquerycla at steveluscher.com>
+Gan Eng Chin <engchin.gan at gmail.com>
+Gabriel Schulhof <gabriel.schulhof at intel.com>
+Alexander Schmitz <arschmitz at gmail.com>
+Vilhjálmur Skúlason <vis at dmm.is>
+Siebrand Mazeland <s.mazeland at xs4all.nl>
+Mohsen Ekhtiari <mohsenekhtiari at yahoo.com>
+Pere Orga <gotrunks at gmail.com>
+Jasper de Groot <mail at ugomobi.com>
+Stephane Deschamps <stephane.deschamps at gmail.com>
+Jyoti Deka <dekajp at gmail.com>
+Andrei Picus <office.nightcrawler at gmail.com>
+Ondrej Novy <novy at ondrej.org>
+Jacob McCutcheon <jacob.mccutcheon at gmail.com>
+Monika Piotrowicz <monika.piotrowicz at gmail.com>
+Imants Horsts <imants.horsts at inbox.lv>
+Eric Dahl <eric.c.dahl at gmail.com>
+Dave Stein <dave at behance.com>
+Dylan Barrell <dylan at barrell.com>
+Daniel DeGroff <djdegroff at gmail.com>
+Michael Wiencek <mwtuea at gmail.com>
+Thomas Meyer <meyertee at gmail.com>
+Ruslan Yakhyaev <ruslan at ruslan.io>
+Brian J. Dowling <bjd-dev at simplicity.net>
+Ben Higgins <ben at extrahop.com>
+Yermo Lamers <yml at yml.com>
+Patrick Stapleton <github at gdi2290.com>
+Trisha Crowley <trisha.crowley at gmail.com>
+Usman Akeju <akeju00+github at gmail.com>
+Rodrigo Menezes <rod333 at gmail.com>
+Jacques Perrault <jacques_perrault at us.ibm.com>
+Frederik Elvhage <frederik.elvhage at googlemail.com>
+Will Holley <willholley at gmail.com>
+Uri Gilad <antishok at gmail.com>
+Richard Gibson <richard.gibson at gmail.com>
+Simen Bekkhus <sbekkhus91 at gmail.com>
+Chen Eshchar <eshcharc at gmail.com>
+Bruno Pérel <brunoperel at gmail.com>
+Mohammed Alshehri <m at dralshehri.com>
+Lisa Seacat DeLuca <ldeluca at us.ibm.com>
+Anne-Gaelle Colom <coloma at westminster.ac.uk>
+Adam Foster <slimfoster at gmail.com>
+Luke Page <luke.a.page at gmail.com>
+Daniel Owens <daniel at matchstickmixup.com>
+Michael Orchard <morchard at scottlogic.co.uk>
+Marcus Warren <marcus at envoke.com>
+Nils Heuermann <nils at world-of-scripts.de>
+Marco Ziech <marco at ziech.net>
+Patricia Juarez <patrixd at gmail.com>
+Ben Mosher <me at benmosher.com>
+Ablay Keldibek <atomio.ak at gmail.com>
+Thomas Applencourt <thomas.applencourt at irsamc.ups-tlse.fr>
+Jiabao Wu <jiabao.foss at gmail.com>
+Eric Lee Carraway <github at ericcarraway.com>
+Victor Homyakov <vkhomyackov at gmail.com>
+Myeongjin Lee <aranet100 at gmail.com>
+Liran Sharir <lsharir at gmail.com>
+Weston Ruter <weston at xwp.co>
+Mani Mishra <manimishra902 at gmail.com>
+Hannah Methvin <hannahmethvin at gmail.com>
+Leonardo Balter <leonardo.balter at gmail.com>
+Benjamin Albert <benjamin_a5 at yahoo.com>
+Michał Gołębiowski <m.goleb at gmail.com>
diff --git a/inst/rmd/h/navigation-1.1/codefolding.js b/inst/rmd/h/navigation-1.1/codefolding.js
new file mode 100644
index 0000000..305b508
--- /dev/null
+++ b/inst/rmd/h/navigation-1.1/codefolding.js
@@ -0,0 +1,59 @@
+
+window.initializeCodeFolding = function(show) {
+
+  // handlers for show-all and hide all
+  $("#rmd-show-all-code").click(function() {
+    $('div.r-code-collapse').each(function() {
+      $(this).collapse('show');
+    });
+  });
+  $("#rmd-hide-all-code").click(function() {
+    $('div.r-code-collapse').each(function() {
+      $(this).collapse('hide');
+    });
+  });
+
+  // index for unique code element ids
+  var currentIndex = 1;
+
+  // select all R code blocks
+  var rCodeBlocks = $('pre.r, pre.python, pre.bash, pre.sql, pre.cpp, pre.stan');
+  rCodeBlocks.each(function() {
+
+    // create a collapsable div to wrap the code in
+    var div = $('<div class="collapse r-code-collapse"></div>');
+    if (show)
+      div.addClass('in');
+    var id = 'rcode-643E0F36' + currentIndex++;
+    div.attr('id', id);
+    $(this).before(div);
+    $(this).detach().appendTo(div);
+
+    // add a show code button right above
+    var showCodeText = $('<span>' + (show ? 'Hide' : 'Code') + '</span>');
+    var showCodeButton = $('<button type="button" class="btn btn-default btn-xs code-folding-btn pull-right"></button>');
+    showCodeButton.append(showCodeText);
+    showCodeButton
+        .attr('data-toggle', 'collapse')
+        .attr('data-target', '#' + id)
+        .attr('aria-expanded', show)
+        .attr('aria-controls', id);
+
+    var buttonRow = $('<div class="row"></div>');
+    var buttonCol = $('<div class="col-md-12"></div>');
+
+    buttonCol.append(showCodeButton);
+    buttonRow.append(buttonCol);
+
+    div.before(buttonRow);
+
+    // update state of button on show/hide
+    div.on('hidden.bs.collapse', function () {
+      showCodeText.text('Code');
+    });
+    div.on('show.bs.collapse', function () {
+      showCodeText.text('Hide');
+    });
+  });
+
+}
diff --git a/inst/rmd/h/navigation-1.1/sourceembed.js b/inst/rmd/h/navigation-1.1/sourceembed.js
new file mode 100644
index 0000000..8464b0c
--- /dev/null
+++ b/inst/rmd/h/navigation-1.1/sourceembed.js
@@ -0,0 +1,12 @@
+
+window.initializeSourceEmbed = function(filename) {
+  $("#rmd-download-source").click(function() {
+    var src = $("#rmd-source-code").html();
+    var a = document.createElement('a');
+    a.href = "data:text/x-r-markdown;base64," + src;
+    a.download = filename;
+    document.body.appendChild(a);
+    a.click();
+    document.body.removeChild(a);
+  });
+};
diff --git a/inst/rmd/h/navigation-1.1/tabsets.js b/inst/rmd/h/navigation-1.1/tabsets.js
new file mode 100644
index 0000000..d7284e6
--- /dev/null
+++ b/inst/rmd/h/navigation-1.1/tabsets.js
@@ -0,0 +1,141 @@
+
+
+/**
+ * jQuery Plugin: Sticky Tabs
+ *
+ * @author Aidan Lister <aidan at php.net>
+ * adapted by Ruben Arslan to activate parent tabs too
+ * http://www.aidanlister.com/2014/03/persisting-the-tab-state-in-bootstrap/
+ */
+(function($) {
+  "use strict";
+  $.fn.rmarkdownStickyTabs = function() {
+    var context = this;
+    // Show the tab corresponding with the hash in the URL, or the first tab
+    var showStuffFromHash = function() {
+      var hash = window.location.hash;
+      var selector = hash ? 'a[href="' + hash + '"]' : 'li.active > a';
+      var $selector = $(selector, context);
+      if($selector.data('toggle') === "tab") {
+        $selector.tab('show');
+        // walk up the ancestors of this element, show any hidden tabs
+        $selector.parents('.section.tabset').each(function(i, elm) {
+          var link = $('a[href="#' + $(elm).attr('id') + '"]');
+          if(link.data('toggle') === "tab") {
+            link.tab("show");
+          }
+        });
+      }
+    };
+
+
+    // Set the correct tab when the page loads
+    showStuffFromHash(context);
+
+    // Set the correct tab when a user uses their back/forward button
+    $(window).on('hashchange', function() {
+      showStuffFromHash(context);
+    });
+
+    // Change the URL when tabs are clicked
+    $('a', context).on('click', function(e) {
+      history.pushState(null, null, this.href);
+      showStuffFromHash(context);
+    });
+
+    return this;
+  };
+}(jQuery));
+
+window.buildTabsets = function(tocID) {
+
+  // build a tabset from a section div with the .tabset class
+  function buildTabset(tabset) {
+
+    // check for fade and pills options
+    var fade = tabset.hasClass("tabset-fade");
+    var pills = tabset.hasClass("tabset-pills");
+    var navClass = pills ? "nav-pills" : "nav-tabs";
+
+    // determine the heading level of the tabset and tabs
+    var match = tabset.attr('class').match(/level(\d) /);
+    if (match === null)
+      return;
+    var tabsetLevel = Number(match[1]);
+    var tabLevel = tabsetLevel + 1;
+
+    // find all subheadings immediately below
+    var tabs = tabset.find("div.section.level" + tabLevel);
+    if (!tabs.length)
+      return;
+
+    // create tablist and tab-content elements
+    var tabList = $('<ul class="nav ' + navClass + '" role="tablist"></ul>');
+    $(tabs[0]).before(tabList);
+    var tabContent = $('<div class="tab-content"></div>');
+    $(tabs[0]).before(tabContent);
+
+    // build the tabset
+    var activeTab = 0;
+    tabs.each(function(i) {
+
+      // get the tab div
+      var tab = $(tabs[i]);
+
+      // get the id then sanitize it for use with bootstrap tabs
+      var id = tab.attr('id');
+
+      // see if this is marked as the active tab
+      if (tab.hasClass('active'))
+        activeTab = i;
+
+      // remove any table of contents entries associated with
+      // this ID (since we'll be removing the heading element)
+      $("div#" + tocID + " li a[href='#" + id + "']").parent().remove();
+
+      // sanitize the id for use with bootstrap tabs
+      id = id.replace(/[.\/?&!#<>]/g, '').replace(/\s/g, '_');
+      tab.attr('id', id);
+
+      // get the heading element within it, grab it's text, then remove it
+      var heading = tab.find('h' + tabLevel + ':first');
+      var headingText = heading.html();
+      heading.remove();
+
+      // build and append the tab list item
+      var a = $('<a role="tab" data-toggle="tab">' + headingText + '</a>');
+      a.attr('href', '#' + id);
+      a.attr('aria-controls', id);
+      var li = $('<li role="presentation"></li>');
+      li.append(a);
+      tabList.append(li);
+
+      // set it's attributes
+      tab.attr('role', 'tabpanel');
+      tab.addClass('tab-pane');
+      tab.addClass('tabbed-pane');
+      if (fade)
+        tab.addClass('fade');
+
+      // move it into the tab content div
+      tab.detach().appendTo(tabContent);
+    });
+
+    // set active tab
+    $(tabList.children('li')[activeTab]).addClass('active');
+    var active = $(tabContent.children('div.section')[activeTab]);
+    active.addClass('active');
+    if (fade)
+      active.addClass('in');
+
+    if (tabset.hasClass("tabset-sticky"))
+      tabset.rmarkdownStickyTabs();
+  }
+
+  // convert section divs with the .tabset class to tabsets
+  var tabsets = $("div.section.tabset");
+  tabsets.each(function(i) {
+    buildTabset($(tabsets[i]));
+  });
+};
+
diff --git a/inst/rmd/h/pagedtable-1.1/css/pagedtable.css b/inst/rmd/h/pagedtable-1.1/css/pagedtable.css
new file mode 100644
index 0000000..b6860a2
--- /dev/null
+++ b/inst/rmd/h/pagedtable-1.1/css/pagedtable.css
@@ -0,0 +1,142 @@
+.pagedtable {
+  overflow: auto;
+  padding-left: 8px;
+  padding-right: 8px;
+}
+
+.pagedtable-wrapper {
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  margin-bottom: 10px;
+}
+
+.pagedtable table {
+  width: 100%;
+  max-width: 100%;
+  margin: 0;
+}
+
+.pagedtable th {
+  padding: 0 5px 0 5px;
+  border: none;
+  border-bottom: 2px solid #dddddd;
+
+  min-width: 45px;
+}
+
+.pagedtable-empty th {
+  display: none;
+}
+
+.pagedtable td {
+  padding: 0 4px 0 4px;
+}
+
+.pagedtable .even {
+  background-color: #fcfcfc;
+}
+
+.pagedtable-padding-col {
+  display: none;
+}
+
+.pagedtable a {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+.pagedtable-index-nav {
+  cursor: pointer;
+  padding: 0 5px 0 5px;
+  float: right;
+  border: 0;
+}
+
+.pagedtable-index-nav-disabled {
+  cursor: default;
+  text-decoration: none;
+  color: #999;
+}
+
+a.pagedtable-index-nav-disabled:hover {
+  text-decoration: none;
+  color: #999;
+}
+
+.pagedtable-indexes {
+  cursor: pointer;
+  float: right;
+  border: 0;
+}
+
+.pagedtable-index-current {
+  cursor: default;
+  text-decoration: none;
+  font-weight: bold;
+  color: #333;
+  border: 0;
+}
+
+a.pagedtable-index-current:hover {
+  text-decoration: none;
+  font-weight: bold;
+  color: #333;
+}
+
+.pagedtable-index {
+  width: 30px;
+  display: inline-block;
+  text-align: center;
+  border: 0;
+}
+
+.pagedtable-index-separator-left {
+  display: inline-block;
+  color: #333;
+  font-size: 9px;
+  padding: 0 0 0 0;
+  cursor: default;
+}
+
+.pagedtable-index-separator-right {
+  display: inline-block;
+  color: #333;
+  font-size: 9px;
+  padding: 0 4px 0 0;
+  cursor: default;
+}
+
+.pagedtable-footer {
+  padding-top: 4px;
+  padding-bottom: 5px;
+}
+
+.pagedtable-not-empty .pagedtable-footer {
+  border-top: 2px solid #dddddd;
+}
+
+.pagedtable-info {
+  overflow: hidden;
+  color: #999;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.pagedtable-header-name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.pagedtable-header-type {
+  color: #999;
+  font-weight: 400;
+}
+
+.pagedtable-na-cell {
+  font-style: italic;
+  opacity: 0.3;
+}
diff --git a/inst/rmd/h/pagedtable-1.1/js/pagedtable.js b/inst/rmd/h/pagedtable-1.1/js/pagedtable.js
new file mode 100644
index 0000000..52ada2b
--- /dev/null
+++ b/inst/rmd/h/pagedtable-1.1/js/pagedtable.js
@@ -0,0 +1,1151 @@
+// Production steps of ECMA-262, Edition 5, 15.4.4.18
+// Reference: http://es5.github.io/#x15.4.4.18
+if (!Array.prototype.forEach) {
+
+  Array.prototype.forEach = function(callback, thisArg) {
+
+    var T, k;
+
+    if (this === null) {
+      throw new TypeError(' this is null or not defined');
+    }
+
+    // 1. Let O be the result of calling toObject() passing the
+    // |this| value as the argument.
+    var O = Object(this);
+
+    // 2. Let lenValue be the result of calling the Get() internal
+    // method of O with the argument "length".
+    // 3. Let len be toUint32(lenValue).
+    var len = O.length >>> 0;
+
+    // 4. If isCallable(callback) is false, throw a TypeError exception.
+    // See: http://es5.github.com/#x9.11
+    if (typeof callback !== "function") {
+      throw new TypeError(callback + ' is not a function');
+    }
+
+    // 5. If thisArg was supplied, let T be thisArg; else let
+    // T be undefined.
+    if (arguments.length > 1) {
+      T = thisArg;
+    }
+
+    // 6. Let k be 0
+    k = 0;
+
+    // 7. Repeat, while k < len
+    while (k < len) {
+
+      var kValue;
+
+      // a. Let Pk be ToString(k).
+      //    This is implicit for LHS operands of the in operator
+      // b. Let kPresent be the result of calling the HasProperty
+      //    internal method of O with argument Pk.
+      //    This step can be combined with c
+      // c. If kPresent is true, then
+      if (k in O) {
+
+        // i. Let kValue be the result of calling the Get internal
+        // method of O with argument Pk.
+        kValue = O[k];
+
+        // ii. Call the Call internal method of callback with T as
+        // the this value and argument list containing kValue, k, and O.
+        callback.call(T, kValue, k, O);
+      }
+      // d. Increase k by 1.
+      k++;
+    }
+    // 8. return undefined
+  };
+}
+
+// Production steps of ECMA-262, Edition 5, 15.4.4.19
+// Reference: http://es5.github.io/#x15.4.4.19
+if (!Array.prototype.map) {
+
+  Array.prototype.map = function(callback, thisArg) {
+
+    var T, A, k;
+
+    if (this == null) {
+      throw new TypeError(' this is null or not defined');
+    }
+
+    // 1. Let O be the result of calling ToObject passing the |this|
+    //    value as the argument.
+    var O = Object(this);
+
+    // 2. Let lenValue be the result of calling the Get internal
+    //    method of O with the argument "length".
+    // 3. Let len be ToUint32(lenValue).
+    var len = O.length >>> 0;
+
+    // 4. If IsCallable(callback) is false, throw a TypeError exception.
+    // See: http://es5.github.com/#x9.11
+    if (typeof callback !== 'function') {
+      throw new TypeError(callback + ' is not a function');
+    }
+
+    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
+    if (arguments.length > 1) {
+      T = thisArg;
+    }
+
+    // 6. Let A be a new array created as if by the expression new Array(len)
+    //    where Array is the standard built-in constructor with that name and
+    //    len is the value of len.
+    A = new Array(len);
+
+    // 7. Let k be 0
+    k = 0;
+
+    // 8. Repeat, while k < len
+    while (k < len) {
+
+      var kValue, mappedValue;
+
+      // a. Let Pk be ToString(k).
+      //   This is implicit for LHS operands of the in operator
+      // b. Let kPresent be the result of calling the HasProperty internal
+      //    method of O with argument Pk.
+      //   This step can be combined with c
+      // c. If kPresent is true, then
+      if (k in O) {
+
+        // i. Let kValue be the result of calling the Get internal
+        //    method of O with argument Pk.
+        kValue = O[k];
+
+        // ii. Let mappedValue be the result of calling the Call internal
+        //     method of callback with T as the this value and argument
+        //     list containing kValue, k, and O.
+        mappedValue = callback.call(T, kValue, k, O);
+
+        // iii. Call the DefineOwnProperty internal method of A with arguments
+        // Pk, Property Descriptor
+        // { Value: mappedValue,
+        //   Writable: true,
+        //   Enumerable: true,
+        //   Configurable: true },
+        // and false.
+
+        // In browsers that support Object.defineProperty, use the following:
+        // Object.defineProperty(A, k, {
+        //   value: mappedValue,
+        //   writable: true,
+        //   enumerable: true,
+        //   configurable: true
+        // });
+
+        // For best browser support, use the following:
+        A[k] = mappedValue;
+      }
+      // d. Increase k by 1.
+      k++;
+    }
+
+    // 9. return A
+    return A;
+  };
+}
+
+var PagedTable = function (pagedTable) {
+  var me = this;
+
+  var source = function(pagedTable) {
+    var sourceElems = [].slice.call(pagedTable.children).filter(function(e) {
+      return e.hasAttribute("data-pagedtable-source");
+    });
+
+    if (sourceElems === null || sourceElems.length !== 1) {
+      throw("A single data-pagedtable-source was not found");
+    }
+
+    return JSON.parse(sourceElems[0].innerHTML);
+  }(pagedTable);
+
+  var options = function(source) {
+    var options = typeof(source.options) !== "undefined" &&
+      source.options !== null ? source.options : {};
+
+    var columns = typeof(options.columns) !== "undefined" ? options.columns : {};
+    var rows = typeof(options.rows) !== "undefined" ? options.rows : {};
+
+    var positiveIntOrNull = function(value) {
+      return parseInt(value) >= 0 ? parseInt(value) : null;
+    };
+
+    return {
+      pages: positiveIntOrNull(options.pages),
+      rows: {
+        min: positiveIntOrNull(rows.min),
+        max: positiveIntOrNull(rows.max),
+        total: positiveIntOrNull(rows.total)
+      },
+      columns: {
+        min: positiveIntOrNull(columns.min),
+        max: positiveIntOrNull(columns.max),
+        total: positiveIntOrNull(columns.total)
+      }
+    };
+  }(source);
+
+  var Measurer = function() {
+
+    // set some default initial values that will get adjusted in runtime
+    me.measures = {
+      padding: 12,
+      character: 8,
+      height: 15,
+      defaults: true
+    };
+
+    me.calculate = function(measuresCell) {
+      if (!me.measures.defaults)
+        return;
+
+      var measuresCellStyle = window.getComputedStyle(measuresCell, null);
+
+      var newPadding = parsePadding(measuresCellStyle.paddingLeft) +
+            parsePadding(measuresCellStyle.paddingRight);
+
+      var sampleString = "ABCDEFGHIJ0123456789";
+      var newCharacter = Math.ceil(measuresCell.clientWidth / sampleString.length);
+
+      if (newPadding <= 0 || newCharacter <= 0)
+        return;
+
+      me.measures.padding = newPadding;
+      me.measures.character = newCharacter;
+      me.measures.height = measuresCell.clientHeight;
+      me.measures.defaults = false;
+    };
+
+    return me;
+  };
+
+  var Page = function(data, options) {
+    var me = this;
+
+    var defaults = {
+      max: 7,
+      rows: 10
+    };
+
+    var totalPages = function() {
+      return Math.ceil(data.length / me.rows);
+    };
+
+    me.number = 0;
+    me.max = options.pages !== null ? options.pages : defaults.max;
+    me.visible = me.max;
+    me.rows = options.rows.min !== null ? options.rows.min : defaults.rows;
+    me.total = totalPages();
+
+    me.setRows = function(newRows) {
+      me.rows = newRows;
+      me.total = totalPages();
+    };
+
+    me.setPageNumber = function(newPageNumber) {
+      if (newPageNumber < 0) newPageNumber = 0;
+      if (newPageNumber >= me.total) newPageNumber = me.total - 1;
+
+      me.number = newPageNumber;
+    };
+
+    me.setVisiblePages = function(visiblePages) {
+      me.visible = Math.min(me.max, visiblePages);
+      me.setPageNumber(me.number);
+    };
+
+    me.getVisiblePageRange = function() {
+      var start = me.number - Math.max(Math.floor((me.visible - 1) / 2), 0);
+      var end = me.number + Math.floor(me.visible / 2) + 1;
+      var pageCount = me.total;
+
+      if (start < 0) {
+        var diffToStart = 0 - start;
+        start += diffToStart;
+        end += diffToStart;
+      }
+
+      if (end > pageCount) {
+        var diffToEnd = end - pageCount;
+        start -= diffToEnd;
+        end -= diffToEnd;
+      }
+
+      start = start < 0 ? 0 : start;
+      end = end >= pageCount ? pageCount : end;
+
+      var first = false;
+      var last = false;
+
+      if (start > 0 && me.visible > 1) {
+        start = start + 1;
+        first = true;
+      }
+
+      if (end < pageCount && me.visible > 2) {
+        end = end - 1;
+        last = true;
+      }
+
+      return {
+        first: first,
+        start: start,
+        end: end,
+        last: last
+      };
+    };
+
+    me.getRowStart = function() {
+      var rowStart = page.number * page.rows;
+      if (rowStart < 0)
+        rowStart = 0;
+
+      return rowStart;
+    };
+
+    me.getRowEnd = function() {
+      var rowStart = me.getRowStart();
+      return Math.min(rowStart + me.rows, data.length);
+    };
+
+    me.getPaddingRows = function() {
+      var rowStart = me.getRowStart();
+      var rowEnd = me.getRowEnd();
+      return data.length > me.rows ? me.rows - (rowEnd - rowStart) : 0;
+    };
+  };
+
+  var Columns = function(data, columns, options) {
+    var me = this;
+
+    me.defaults = {
+      min: 5
+    };
+
+    me.number = 0;
+    me.visible = 0;
+    me.total = columns.length;
+    me.subset = [];
+    me.padding = 0;
+    me.min = options.columns.min !== null ? options.columns.min : me.defaults.min;
+    me.max = options.columns.max !== null ? options.columns.max : null;
+    me.widths = {};
+
+    var widthsLookAhead = Math.max(100, options.rows.min);
+    var paddingColChars = 10;
+
+    me.emptyNames = function() {
+      columns.forEach(function(column) {
+        if (columns.label !== null && columns.label !== "")
+          return false;
+      });
+
+      return true;
+    };
+
+    var parsePadding = function(value) {
+      return parseInt(value) >= 0 ? parseInt(value) : 0;
+    };
+
+    me.calculateWidths = function(measures) {
+      columns.forEach(function(column) {
+        var maxChars = Math.max(
+          column.label.toString().length,
+          column.type.toString().length
+        );
+
+        for (var idxRow = 0; idxRow < Math.min(widthsLookAhead, data.length); idxRow++) {
+          maxChars = Math.max(maxChars, data[idxRow][column.name.toString()].length);
+        }
+
+        me.widths[column.name] = {
+          // width in characters
+          chars: maxChars,
+          // width for the inner html columns
+          inner: maxChars * measures.character,
+          // width adding outer styles like padding
+          outer: maxChars * measures.character + measures.padding
+        };
+      });
+    };
+
+    me.getWidth = function() {
+      var widthOuter = 0;
+      for (var idxCol = 0; idxCol < me.subset.length; idxCol++) {
+        var columnName = me.subset[idxCol].name;
+        widthOuter = widthOuter + me.widths[columnName].outer;
+      }
+
+      widthOuter = widthOuter + me.padding * paddingColChars * measurer.measures.character;
+
+      if (me.hasMoreLeftColumns()) {
+        widthOuter = widthOuter + columnNavigationWidthPX + measurer.measures.padding;
+      }
+
+      if (me.hasMoreRightColumns()) {
+        widthOuter = widthOuter + columnNavigationWidthPX + measurer.measures.padding;
+      }
+
+      return widthOuter;
+    };
+
+    me.updateSlice = function() {
+      if (me.number + me.visible >= me.total)
+        me.number = me.total - me.visible;
+
+      if (me.number < 0) me.number = 0;
+
+      me.subset = columns.slice(me.number, Math.min(me.number + me.visible, me.total));
+
+      me.subset = me.subset.map(function(column) {
+        Object.keys(column).forEach(function(colKey) {
+          column[colKey] = column[colKey] === null ? "" : column[colKey].toString();
+        });
+
+        column.width = null;
+        return column;
+      });
+    };
+
+    me.setVisibleColumns = function(columnNumber, newVisibleColumns, paddingCount) {
+      me.number = columnNumber;
+      me.visible = newVisibleColumns;
+      me.padding = paddingCount;
+
+      me.updateSlice();
+    };
+
+    me.incColumnNumber = function(increment) {
+      me.number = me.number + increment;
+    };
+
+    me.setColumnNumber = function(newNumber) {
+      me.number = newNumber;
+    };
+
+    me.setPaddingCount = function(newPadding) {
+      me.padding = newPadding;
+    };
+
+    me.getPaddingCount = function() {
+      return me.padding;
+    };
+
+    me.hasMoreLeftColumns = function() {
+      return me.number > 0;
+    };
+
+    me.hasMoreRightColumns = function() {
+      return me.number + me.visible < me.total;
+    };
+
+    me.updateSlice(0);
+    return me;
+  };
+
+  var data = source.data;
+  var page = new Page(data, options);
+  var measurer = new Measurer(data, options);
+  var columns = new Columns(data, source.columns, options);
+
+  var table = null;
+  var tableDiv = null;
+  var header = null;
+  var footer = null;
+  var tbody = null;
+
+  // Caches pagedTable.clientWidth, specially for webkit
+  var cachedPagedTableClientWidth = null;
+
+  var onChangeCallbacks = [];
+
+  var clearSelection = function() {
+    if(document.selection && document.selection.empty) {
+      document.selection.empty();
+    } else if(window.getSelection) {
+      var sel = window.getSelection();
+      sel.removeAllRanges();
+    }
+  };
+
+  var columnNavigationWidthPX = 5;
+
+  var renderColumnNavigation = function(increment, backwards) {
+    var arrow = document.createElement("div");
+    arrow.setAttribute("style",
+      "border-top: " + columnNavigationWidthPX + "px solid transparent;" +
+      "border-bottom: " + columnNavigationWidthPX + "px solid transparent;" +
+      "border-" + (backwards ? "right" : "left") + ": " + columnNavigationWidthPX + "px solid;");
+
+    var header = document.createElement("th");
+    header.appendChild(arrow);
+    header.setAttribute("style",
+      "cursor: pointer;" +
+      "vertical-align: middle;" +
+      "min-width: " + columnNavigationWidthPX + "px;" +
+      "width: " + columnNavigationWidthPX + "px;");
+
+    header.onclick = function() {
+      columns.incColumnNumber(backwards ? -1 : increment);
+
+      me.animateColumns(backwards);
+      renderFooter();
+
+      clearSelection();
+      triggerOnChange();
+    };
+
+    return header;
+  };
+
+  var maxColumnWidth = function(width) {
+    var padding = 80;
+    var columnMax = Math.max(cachedPagedTableClientWidth - padding, 0);
+
+    return parseInt(width) > 0 ?
+      Math.min(columnMax, parseInt(width)) + "px" :
+      columnMax + "px";
+  };
+
+  var clearHeader = function() {
+    var thead = pagedTable.querySelectorAll("thead")[0];
+    thead.innerHTML = "";
+  };
+
+  var renderHeader = function(clear) {
+    cachedPagedTableClientWidth = pagedTable.clientWidth;
+
+    var fragment = document.createDocumentFragment();
+
+    header = document.createElement("tr");
+    fragment.appendChild(header);
+
+    if (columns.number > 0)
+      header.appendChild(renderColumnNavigation(-columns.visible, true));
+
+    columns.subset = columns.subset.map(function(columnData) {
+      var column = document.createElement("th");
+      column.setAttribute("align", columnData.align);
+      column.style.textAlign = columnData.align;
+
+      column.style.maxWidth = maxColumnWidth(null);
+      if (columnData.width) {
+        column.style.minWidth =
+          column.style.maxWidth = maxColumnWidth(columnData.width);
+      }
+
+      var columnName = document.createElement("div");
+      columnName.setAttribute("class", "pagedtable-header-name");
+      if (columnData.label === "") {
+        columnName.innerHTML = " ";
+      }
+      else {
+        columnName.appendChild(document.createTextNode(columnData.label));
+      }
+      column.appendChild(columnName);
+
+      var columnType = document.createElement("div");
+      columnType.setAttribute("class", "pagedtable-header-type");
+      if (columnData.type === "") {
+        columnType.innerHTML = " ";
+      }
+      else {
+        columnType.appendChild(document.createTextNode("<" + columnData.type + ">"));
+      }
+      column.appendChild(columnType);
+
+      header.appendChild(column);
+
+      columnData.element = column;
+
+      return columnData;
+    });
+
+    for (var idx = 0; idx < columns.getPaddingCount(); idx++) {
+      var paddingCol = document.createElement("th");
+      paddingCol.setAttribute("class", "pagedtable-padding-col");
+      header.appendChild(paddingCol);
+    }
+
+    if (columns.number + columns.visible < columns.total)
+      header.appendChild(renderColumnNavigation(columns.visible, false));
+
+    if (typeof(clear) == "undefined" || clear) clearHeader();
+    var thead = pagedTable.querySelectorAll("thead")[0];
+    thead.appendChild(fragment);
+  };
+
+  me.animateColumns = function(backwards) {
+    var thead = pagedTable.querySelectorAll("thead")[0];
+
+    var headerOld = thead.querySelectorAll("tr")[0];
+    var tbodyOld = table.querySelectorAll("tbody")[0];
+
+    me.fitColumns(backwards);
+
+    renderHeader(false);
+
+    header.style.opacity = "0";
+    header.style.transform = backwards ? "translateX(-30px)" : "translateX(30px)";
+    header.style.transition = "transform 200ms linear, opacity 200ms";
+    header.style.transitionDelay = "0";
+
+    renderBody(false);
+
+    if (headerOld) {
+      headerOld.style.position = "absolute";
+      headerOld.style.transform = "translateX(0px)";
+      headerOld.style.opacity = "1";
+      headerOld.style.transition = "transform 100ms linear, opacity 100ms";
+      headerOld.setAttribute("class", "pagedtable-remove-head");
+      if (headerOld.style.transitionEnd) {
+        headerOld.addEventListener("transitionend", function() {
+          var headerOldByClass = thead.querySelector(".pagedtable-remove-head");
+          if (headerOldByClass) thead.removeChild(headerOldByClass);
+        });
+      }
+      else {
+        thead.removeChild(headerOld);
+      }
+    }
+
+    if (tbodyOld) table.removeChild(tbodyOld);
+
+    tbody.style.opacity = "0";
+    tbody.style.transition = "transform 200ms linear, opacity 200ms";
+    tbody.style.transitionDelay = "0ms";
+
+    // force relayout
+    window.getComputedStyle(header).opacity;
+    window.getComputedStyle(tbody).opacity;
+
+    if (headerOld) {
+      headerOld.style.transform = backwards ? "translateX(20px)" : "translateX(-30px)";
+      headerOld.style.opacity = "0";
+    }
+
+    header.style.transform = "translateX(0px)";
+    header.style.opacity = "1";
+
+    tbody.style.opacity = "1";
+  }
+
+  me.onChange = function(callback) {
+    onChangeCallbacks.push(callback);
+  };
+
+  var triggerOnChange = function() {
+    onChangeCallbacks.forEach(function(onChange) {
+      onChange();
+    });
+  };
+
+  var clearBody = function() {
+    if (tbody) {
+      table.removeChild(tbody);
+      tbody = null;
+    }
+  };
+
+  var renderBody = function(clear) {
+    cachedPagedTableClientWidth = pagedTable.clientWidth
+
+    var fragment = document.createDocumentFragment();
+
+    var pageData = data.slice(page.getRowStart(), page.getRowEnd());
+
+    pageData.forEach(function(dataRow, idxRow) {
+      var htmlRow = document.createElement("tr");
+      htmlRow.setAttribute("class", (idxRow % 2 !==0) ? "even" : "odd");
+
+      if (columns.hasMoreLeftColumns())
+        htmlRow.appendChild(document.createElement("td"));
+
+      columns.subset.forEach(function(columnData) {
+        var cellName = columnData.name;
+        var dataCell = dataRow[cellName];
+        var htmlCell = document.createElement("td");
+
+        if (dataCell === "NA") htmlCell.setAttribute("class", "pagedtable-na-cell");
+        if (dataCell === "__NA__") dataCell = "NA";
+
+        var cellText = document.createTextNode(dataCell);
+        htmlCell.appendChild(cellText);
+        if (dataCell.length > 50) {
+          htmlCell.setAttribute("title", dataCell);
+        }
+        htmlCell.setAttribute("align", columnData.align);
+        htmlCell.style.textAlign = columnData.align;
+        htmlCell.style.maxWidth = maxColumnWidth(null);
+        if (columnData.width) {
+          htmlCell.style.minWidth = htmlCell.style.maxWidth = maxColumnWidth(columnData.width);
+        }
+        htmlRow.appendChild(htmlCell);
+      });
+
+      for (var idx = 0; idx < columns.getPaddingCount(); idx++) {
+        var paddingCol = document.createElement("td");
+        paddingCol.setAttribute("class", "pagedtable-padding-col");
+        htmlRow.appendChild(paddingCol);
+      }
+
+      if (columns.hasMoreRightColumns())
+        htmlRow.appendChild(document.createElement("td"));
+
+      fragment.appendChild(htmlRow);
+    });
+
+    for (var idxPadding = 0; idxPadding < page.getPaddingRows(); idxPadding++) {
+      var paddingRow = document.createElement("tr");
+
+      var paddingCellRow = document.createElement("td");
+      paddingCellRow.innerHTML = " ";
+      paddingCellRow.setAttribute("colspan", "100%");
+      paddingRow.appendChild(paddingCellRow);
+
+      fragment.appendChild(paddingRow);
+    }
+
+    if (typeof(clear) == "undefined" || clear) clearBody();
+    tbody = document.createElement("tbody");
+    tbody.appendChild(fragment);
+
+    table.appendChild(tbody);
+  };
+
+  var getLabelInfo = function() {
+    var pageStart = page.getRowStart();
+    var pageEnd = page.getRowEnd();
+    var totalRows = data.length;
+
+    var totalRowsLabel = options.rows.total ? options.rows.total : totalRows;
+    var totalRowsLabelFormat = totalRowsLabel.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
+
+    var infoText = (pageStart + 1) + "-" + pageEnd + " of " + totalRowsLabelFormat + " rows";
+    if (totalRows < page.rows) {
+      infoText = totalRowsLabel + " row" + (totalRows != 1 ? "s" : "");
+    }
+    if (columns.total > columns.visible) {
+      var totalColumnsLabel = options.columns.total ? options.columns.total : columns.total;
+
+      infoText = infoText + " | " + (columns.number + 1) + "-" +
+        (Math.min(columns.number + columns.visible, columns.total)) +
+        " of " + totalColumnsLabel + " columns";
+    }
+
+    return infoText;
+  };
+
+  var clearFooter = function() {
+    footer = pagedTable.querySelectorAll("div.pagedtable-footer")[0];
+    footer.innerHTML = "";
+
+    return footer;
+  };
+
+  var createPageLink = function(idxPage) {
+    var pageLink = document.createElement("a");
+    pageLinkClass = idxPage === page.number ? "pagedtable-index pagedtable-index-current" : "pagedtable-index";
+    pageLink.setAttribute("class", pageLinkClass);
+    pageLink.setAttribute("data-page-index", idxPage);
+    pageLink.onclick = function() {
+      page.setPageNumber(parseInt(this.getAttribute("data-page-index")));
+      renderBody();
+      renderFooter();
+
+      triggerOnChange();
+    };
+
+    pageLink.appendChild(document.createTextNode(idxPage + 1));
+
+    return pageLink;
+  }
+
+  var renderFooter = function() {
+    footer = clearFooter();
+
+    var next = document.createElement("a");
+    next.appendChild(document.createTextNode("Next"));
+    next.onclick = function() {
+      page.setPageNumber(page.number + 1);
+      renderBody();
+      renderFooter();
+
+      triggerOnChange();
+    };
+    if (data.length > page.rows) footer.appendChild(next);
+
+    var pageNumbers = document.createElement("div");
+    pageNumbers.setAttribute("class", "pagedtable-indexes");
+
+    var pageRange = page.getVisiblePageRange();
+
+    if (pageRange.first) {
+      var pageLink = createPageLink(0);
+      pageNumbers.appendChild(pageLink);
+
+      var pageSeparator = document.createElement("div");
+      pageSeparator.setAttribute("class", "pagedtable-index-separator-left");
+      pageSeparator.appendChild(document.createTextNode("..."))
+      pageNumbers.appendChild(pageSeparator);
+    }
+
+    for (var idxPage = pageRange.start; idxPage < pageRange.end; idxPage++) {
+      var pageLink = createPageLink(idxPage);
+
+      pageNumbers.appendChild(pageLink);
+    }
+
+    if (pageRange.last) {
+      var pageSeparator = document.createElement("div");
+      pageSeparator.setAttribute("class", "pagedtable-index-separator-right");
+      pageSeparator.appendChild(document.createTextNode("..."))
+      pageNumbers.appendChild(pageSeparator);
+
+      var pageLink = createPageLink(page.total - 1);
+      pageNumbers.appendChild(pageLink);
+    }
+
+    if (data.length > page.rows) footer.appendChild(pageNumbers);
+
+    var previous = document.createElement("a");
+    previous.appendChild(document.createTextNode("Previous"));
+    previous.onclick = function() {
+      page.setPageNumber(page.number - 1);
+      renderBody();
+      renderFooter();
+
+      triggerOnChange();
+    };
+    if (data.length > page.rows) footer.appendChild(previous);
+
+    var infoLabel = document.createElement("div");
+    infoLabel.setAttribute("class", "pagedtable-info");
+    infoLabel.setAttribute("title", getLabelInfo());
+    infoLabel.appendChild(document.createTextNode(getLabelInfo()));
+    footer.appendChild(infoLabel);
+
+    var enabledClass = "pagedtable-index-nav";
+    var disabledClass = "pagedtable-index-nav pagedtable-index-nav-disabled";
+    previous.setAttribute("class", page.number <= 0 ? disabledClass : enabledClass);
+    next.setAttribute("class", (page.number + 1) * page.rows >= data.length ? disabledClass : enabledClass);
+  };
+
+  var measuresCell = null;
+
+  var renderMeasures = function() {
+    var measuresTable = document.createElement("table");
+    measuresTable.style.visibility = "hidden";
+    measuresTable.style.position = "absolute";
+    measuresTable.style.whiteSpace = "nowrap";
+    measuresTable.style.height = "auto";
+    measuresTable.style.width = "auto";
+
+    var measuresRow = document.createElement("tr");
+    measuresTable.appendChild(measuresRow);
+
+    measuresCell = document.createElement("td");
+    var sampleString = "ABCDEFGHIJ0123456789";
+    measuresCell.appendChild(document.createTextNode(sampleString));
+
+    measuresRow.appendChild(measuresCell);
+
+    tableDiv.appendChild(measuresTable);
+  }
+
+  me.init = function() {
+    tableDiv = document.createElement("div");
+    pagedTable.appendChild(tableDiv);
+    var pagedTableClass = data.length > 0 ?
+      "pagedtable pagedtable-not-empty" :
+      "pagedtable pagedtable-empty";
+
+    if (columns.total == 0 || (columns.emptyNames() && data.length == 0)) {
+      pagedTableClass = pagedTableClass + " pagedtable-empty-columns";
+    }
+
+    tableDiv.setAttribute("class", pagedTableClass);
+
+    renderMeasures();
+    measurer.calculate(measuresCell);
+    columns.calculateWidths(measurer.measures);
+
+    table = document.createElement("table");
+    table.setAttribute("cellspacing", "0");
+    table.setAttribute("class", "table table-condensed");
+    tableDiv.appendChild(table);
+
+    table.appendChild(document.createElement("thead"));
+
+    var footerDiv = document.createElement("div");
+    footerDiv.setAttribute("class", "pagedtable-footer");
+    tableDiv.appendChild(footerDiv);
+
+    // if the host has not yet provided horizontal space, render hidden
+    if (tableDiv.clientWidth <= 0) {
+      tableDiv.style.opacity = "0";
+    }
+
+    me.render();
+
+    // retry seizing columns later if the host has not provided space
+    function retryFit() {
+      if (tableDiv.clientWidth <= 0) {
+        setTimeout(retryFit, 100);
+      } else {
+        me.render();
+        triggerOnChange();
+      }
+    }
+    if (tableDiv.clientWidth <= 0) {
+      retryFit();
+    }
+  };
+
+  var registerWidths = function() {
+    columns.subset = columns.subset.map(function(column) {
+      column.width = columns.widths[column.name].inner;
+      return column;
+    });
+  };
+
+  var parsePadding = function(value) {
+    return parseInt(value) >= 0 ? parseInt(value) : 0;
+  };
+
+  me.fixedHeight = function() {
+    return options.rows.max != null;
+  }
+
+  me.fitRows = function() {
+    if (me.fixedHeight())
+      return;
+
+    measurer.calculate(measuresCell);
+
+    var rows = options.rows.min !== null ? options.rows.min : 0;
+    var headerHeight = header !== null && header.offsetHeight > 0 ? header.offsetHeight : 0;
+    var footerHeight = footer !== null && footer.offsetHeight > 0 ? footer.offsetHeight : 0;
+
+    if (pagedTable.offsetHeight > 0) {
+      var availableHeight = pagedTable.offsetHeight - headerHeight - footerHeight;
+      rows = Math.floor((availableHeight) / measurer.measures.height);
+    }
+
+    rows = options.rows.min !== null ? Math.max(options.rows.min, rows) : rows;
+
+    page.setRows(rows);
+  }
+
+  // The goal of this function is to add as many columns as possible
+  // starting from left-to-right, when the right most limit is reached
+  // it tries to add columns from the left as well.
+  //
+  // When startBackwards is true columns are added from right-to-left
+  me.fitColumns = function(startBackwards) {
+    measurer.calculate(measuresCell);
+    columns.calculateWidths(measurer.measures);
+
+    if (tableDiv.clientWidth > 0) {
+      tableDiv.style.opacity = 1;
+    }
+
+    var visibleColumns = tableDiv.clientWidth <= 0 ? Math.max(columns.min, 1) : 1;
+    var columnNumber = columns.number;
+    var paddingCount = 0;
+
+    // track a list of added columns as we build the visible ones to allow us
+    // to remove columns when they don't fit anymore.
+    var columnHistory = [];
+
+    var lastTableHeight = 0;
+    var backwards = startBackwards;
+
+    var tableDivStyle = window.getComputedStyle(tableDiv, null);
+    var tableDivPadding = parsePadding(tableDivStyle.paddingLeft) +
+      parsePadding(tableDivStyle.paddingRight);
+
+    var addPaddingCol = false;
+    var currentWidth = 0;
+
+    while (true) {
+      columns.setVisibleColumns(columnNumber, visibleColumns, paddingCount);
+      currentWidth = columns.getWidth();
+
+      if (tableDiv.clientWidth - tableDivPadding < currentWidth) {
+        break;
+      }
+
+      columnHistory.push({
+        columnNumber: columnNumber,
+        visibleColumns: visibleColumns,
+        paddingCount: paddingCount
+      });
+
+      if (columnHistory.length > 100) {
+        console.error("More than 100 tries to fit columns, aborting");
+        break;
+      }
+
+      if (columns.max !== null &&
+        columns.visible + columns.getPaddingCount() >= columns.max) {
+        break;
+      }
+
+      // if we run out of right-columns
+      if (!backwards && columnNumber + columns.visible >= columns.total) {
+        // if we started adding right-columns, try adding left-columns
+        if (!startBackwards && columnNumber > 0) {
+          backwards = true;
+        }
+        else if (columns.min === null || visibleColumns + columns.getPaddingCount() >= columns.min) {
+          break;
+        }
+        else {
+          paddingCount = paddingCount + 1;
+        }
+      }
+
+      // if we run out of left-columns
+      if (backwards && columnNumber == 0) {
+        // if we started adding left-columns, try adding right-columns
+        if (startBackwards && columnNumber + columns.visible < columns.total) {
+          backwards = false;
+        }
+        else if (columns.min === null || visibleColumns + columns.getPaddingCount() >= columns.min) {
+          break;
+        }
+        else {
+          paddingCount = paddingCount + 1;
+        }
+      }
+
+      // when moving backwards try fitting left columns first
+      if (backwards && columnNumber > 0) {
+        columnNumber = columnNumber - 1;
+      }
+
+      if (columnNumber + visibleColumns < columns.total) {
+        visibleColumns = visibleColumns + 1;
+      }
+    }
+
+    var lastRenderableColumn = {
+        columnNumber: columnNumber,
+        visibleColumns: visibleColumns,
+        paddingCount: paddingCount
+    };
+
+    if (columnHistory.length > 0) {
+      lastRenderableColumn = columnHistory[columnHistory.length - 1];
+    }
+
+    columns.setVisibleColumns(
+      lastRenderableColumn.columnNumber,
+      lastRenderableColumn.visibleColumns,
+      lastRenderableColumn.paddingCount);
+
+    if (pagedTable.offsetWidth > 0) {
+      page.setVisiblePages(Math.max(Math.ceil(1.0 * (pagedTable.offsetWidth - 250) / 40), 2));
+    }
+
+    registerWidths();
+  };
+
+  me.fit = function(startBackwards) {
+    me.fitRows();
+    me.fitColumns(startBackwards);
+  }
+
+  me.render = function() {
+    me.fitColumns(false);
+
+    // render header/footer to measure height accurately
+    renderHeader();
+    renderFooter();
+
+    me.fitRows();
+    renderBody();
+
+    // re-render footer to match new rows
+    renderFooter();
+  }
+
+  var resizeLastWidth = -1;
+  var resizeLastHeight = -1;
+  var resizeNewWidth = -1;
+  var resizeNewHeight = -1;
+  var resizePending = false;
+
+  me.resize = function(newWidth, newHeight) {
+
+    function resizeDelayed() {
+      resizePending = false;
+
+      if (
+        (resizeNewWidth !== resizeLastWidth) ||
+        (!me.fixedHeight() && resizeNewHeight !== resizeLastHeight)
+      ) {
+        resizeLastWidth = resizeNewWidth;
+        resizeLastHeight = resizeNewHeight;
+
+        setTimeout(resizeDelayed, 200);
+        resizePending = true;
+      } else {
+        me.render();
+        triggerOnChange();
+
+        resizeLastWidth = -1;
+        resizeLastHeight = -1;
+      }
+    }
+
+    resizeNewWidth = newWidth;
+    resizeNewHeight = newHeight;
+
+    if (!resizePending) resizeDelayed();
+  };
+};
+
+var PagedTableDoc;
+(function (PagedTableDoc) {
+  var allPagedTables = [];
+
+  PagedTableDoc.initAll = function() {
+    allPagedTables = [];
+
+    var pagedTables = [].slice.call(document.querySelectorAll('[data-pagedtable="false"],[data-pagedtable=""]'));
+    pagedTables.forEach(function(pagedTable, idx) {
+      pagedTable.setAttribute("data-pagedtable", "true");
+      pagedTable.setAttribute("pagedtable-page", 0);
+      pagedTable.setAttribute("class", "pagedtable-wrapper");
+
+      var pagedTableInstance = new PagedTable(pagedTable);
+      pagedTableInstance.init();
+
+      allPagedTables.push(pagedTableInstance);
+    });
+  };
+
+  PagedTableDoc.resizeAll = function() {
+    allPagedTables.forEach(function(pagedTable) {
+      pagedTable.render();
+    });
+  };
+
+  window.addEventListener("resize", PagedTableDoc.resizeAll);
+
+  return PagedTableDoc;
+})(PagedTableDoc || (PagedTableDoc = {}));
+
+window.onload = function() {
+  PagedTableDoc.initAll();
+};
diff --git a/inst/rmd/h/rmarkdown/rmd_loader.css b/inst/rmd/h/rmarkdown/rmd_loader.css
new file mode 100644
index 0000000..06de123
--- /dev/null
+++ b/inst/rmd/h/rmarkdown/rmd_loader.css
@@ -0,0 +1,18 @@
+#rmd_loader_wrapper
+{
+   display: table;
+   position: fixed;
+   height: 100%;
+   width: 100%;
+}
+
+#rmd_loader
+{
+   display: table-cell;
+   vertical-align: middle;
+   text-align: center;
+   height: 100%;
+   width: 100%;
+   font-family: sans-serif;
+   color: #a0a0a0;
+}
diff --git a/inst/rmd/h/rmarkdown/rmd_loader.gif b/inst/rmd/h/rmarkdown/rmd_loader.gif
new file mode 100644
index 0000000..94a5e02
Binary files /dev/null and b/inst/rmd/h/rmarkdown/rmd_loader.gif differ
diff --git a/inst/rmd/h/rmarkdown/rmd_loader.js b/inst/rmd/h/rmarkdown/rmd_loader.js
new file mode 100644
index 0000000..2c75b86
--- /dev/null
+++ b/inst/rmd/h/rmarkdown/rmd_loader.js
@@ -0,0 +1,29 @@
+/*jshint browser:true, strict:false, curly:false, indent:3*/
+(function(){
+try {
+window.setTimeout(function() {
+   // if the document has loaded in an error state after the loader 
+   // appears, hide the loader gracefully
+   var intervalId = window.setInterval(function() {
+      if ($("#__reactivedoc__").hasClass("shiny-output-error")) 
+         $("#rmd_loader").fadeOut(400);
+      // once loading is finished (which Shiny indicates by hiding the 
+      // rmd_loader), initialize slidy if it exists, and stop the timer
+      if (!$("#rmd_loader").is(":visible")) {
+         // initialize slidy after load completes
+         if (typeof window.w3c_slidy != "undefined") {
+            w3c_slidy.mouse_click_enabled = false; // interferes with Shiny input
+            w3c_slidy.init();
+         }
+         window.clearInterval(intervalId);
+      }
+   }, 500);
+   $("#rmd_loader").fadeIn(400);
+},
+// fade the loader into view after 200 ms
+200);
+}
+catch (e) {
+   // ignore failures here; the loading status is nonessential 
+}
+})();
diff --git a/inst/rmd/h/rmarkdown/rmd_perf.css b/inst/rmd/h/rmarkdown/rmd_perf.css
new file mode 100644
index 0000000..04e13af
--- /dev/null
+++ b/inst/rmd/h/rmarkdown/rmd_perf.css
@@ -0,0 +1,21 @@
+.perf_popup
+{
+   background-color: white;
+   border: 1px solid black;
+   color: black;
+   font-family: sans-serif;
+   font-size: small;
+   line-height: normal;
+   padding: 5px;
+   position: fixed;
+   right: 20px;
+   top: 20px;
+}
+
+.perf_databar
+{
+   height: 4px;
+   margin-top: 0px;
+   margin-bottom: 5px;
+   background-color: blue;
+}
diff --git a/inst/rmd/h/rmarkdown/rmd_perf.js b/inst/rmd/h/rmarkdown/rmd_perf.js
new file mode 100644
index 0000000..45d6868
--- /dev/null
+++ b/inst/rmd/h/rmarkdown/rmd_perf.js
@@ -0,0 +1,64 @@
+/*jshint browser:true, strict:false, curly:false, indent:3*/
+(function(){
+try {
+   var timings = RMARKDOWN_PERFORMANCE_TIMINGS;
+
+   var build_popup = function(popup) {
+      // sort the timings in descending order
+      timings.sort(function(t1, t2) {
+         return t2.elapsed - t1.elapsed;
+      });
+      
+      var longest = timings[0].elapsed;
+
+      // emit each to the popup
+      for (var i = 0; i < timings.length; i++) {
+         var timing = timings[i];
+         var perf_timing = document.createElement("div");
+
+         // show the name of the performance marker
+         var key_span = document.createElement("span");
+         key_span.innerText = timing.marker + ": ";
+         perf_timing.appendChild(key_span);
+
+         // show the time elapsed in ms
+         var ms = document.createElement("strong");
+         ms.innerText = timing.elapsed + "ms";
+         perf_timing.appendChild(ms);
+
+         popup.appendChild(perf_timing);
+
+         // show a bar 
+         var databar = document.createElement("div");
+         databar.setAttribute("class", "perf_databar");
+         databar.style.width = 
+            Math.round((timing.elapsed / longest) * 100) + "%";
+         popup.appendChild(databar);
+      }
+   };
+
+   // create the popup element (unattached unless shown)
+   var perf_popup = document.createElement("div");
+   perf_popup.setAttribute("class", "perf_popup");
+
+   // toggle the popup with Alt+R; if up, Esc dismisses
+   window.addEventListener("keydown", function(evt) {
+      var toggle = evt.keyCode == 82 && evt.altKey; // Alt+R
+      var dismiss = evt.keyCode == 27; // Esc
+      if (!toggle && !dismiss)
+         return;
+      if (perf_popup.parentElement === null && toggle) {
+         // rebuild the popup if it's empty
+         if (perf_popup.children.length === 0)
+            build_popup(perf_popup);
+         document.body.appendChild(perf_popup);
+      } else {
+         document.body.removeChild(perf_popup);
+      }
+   }, false);
+}
+catch (e) {
+   // ignore failures here; performance timing information is nonessential
+   // to page render
+}
+})();
diff --git a/inst/rmd/h/rsiframe-1.1/rsiframe.js b/inst/rmd/h/rsiframe-1.1/rsiframe.js
new file mode 100644
index 0000000..13a748f
--- /dev/null
+++ b/inst/rmd/h/rsiframe-1.1/rsiframe.js
@@ -0,0 +1,148 @@
+/*jshint browser:true, strict:false, curly:false, indent:3*/
+(function(){
+
+// returns the origin we should post messages to (if on same host), or null if
+// no suitable origin is found
+var getOrigin = function() {
+   var origin = null;
+
+   // if an origin is supplied by RStudio, use it directly.
+   var rstudio_origin_meta = $('meta[name="rstudio_origin"]');
+   if (rstudio_origin_meta.length > 0) {
+     var rstudio_origin = rstudio_origin_meta.attr('content');
+     return window.location.protocol + "//" + rstudio_origin;
+   }
+
+   // function to normalize hostnames
+   var normalize = function(hostname) {
+     if (hostname == "127.0.0.1")
+       return "localhost";
+     else
+       return hostname;
+   };
+
+   // construct the parent origin if the hostnames match
+   var parentUrl = (parent !== window) ? document.referrer : null;
+
+   if (parentUrl) {
+     // parse the parent href
+     var a = document.createElement('a');
+     a.href = parentUrl;
+
+     if (normalize(a.hostname) == normalize(window.location.hostname)) {
+       var protocol = a.protocol.replace(':',''); // browser compatability
+       origin = protocol + '://' + a.hostname;
+       if (a.port)
+         origin = origin + ':' + a.port;
+     }
+   }
+   return origin;
+};
+
+// property application ------------------------------------------------------
+
+// sets the location hash
+var setHash = function(hash) {
+   // special case for ioslides: if the hash is numeric and we have a slide
+   // controller, use it to change the slides (ioslides doesn't respond to
+   // onhashchange)
+   if (/[0-9]+/.test(hash) && window.slidedeck) {
+      window.slidedeck.loadSlide(parseInt(hash));
+   } else {
+      location.hash = hash;
+   }
+};
+
+// sets the document scroll position. this could be called before that part of
+// the document has loaded, so if the position specified is not yet available,
+// wait a few ms and try again.
+var setScrollPos = function(pos) {
+   if (pos > document.body.scrollHeight) {
+      window.setTimeout(function() { setScrollPos(pos); }, 100);
+   } else {
+      document.body.scrollTop = pos;
+   }
+};
+
+// cross-domain communication ------------------------------------------------
+
+// obtain and validate the origin
+var origin = getOrigin();
+if (origin === null)
+   return;
+
+// set up cross-domain send/receive
+var send = function(data) {
+   data.type = "ShinyFrameEvent";
+   // only send the message if we have a parent
+   if (parent && (parent !== window))
+      parent.postMessage(data, origin);
+};
+
+var recv = function(evt) {
+   // validate that message is from expected origin (i.e. our parent)
+   if (evt.origin !== origin)
+      return;
+
+   switch (evt.data.method) {
+   case "rs_set_scroll_pos":
+      setScrollPos(evt.data.arg);
+      break;
+   case "rs_set_hash":
+      setHash(evt.data.arg);
+      break;
+   }
+};
+
+window.addEventListener("message", recv, false);
+
+// document event handlers ---------------------------------------------------
+
+// notify parent when scroll stops changing for ~0.25 s (don't spam during
+// continuous/smooth scrolling)
+var scrollTimer = 0;
+var onScroll = function(pos) {
+   if (scrollTimer !== 0)
+      window.clearTimeout(scrollTimer);
+   scrollTimer = window.setTimeout(function() {
+      send({ event: "doc_scroll_change", data: document.body.scrollTop });
+   }, 250);
+};
+
+// test the href for changes every 100ms, and notify parent if it has changed.
+// ordinarily we'd hook an event handler to 'hashchange' here, but in some
+// cases (e.g. ioslides) the document can change the hash without triggering
+// a hashchange event.
+var currentHref = location.href;
+var testHrefChange = function() {
+   if (currentHref !== location.href) {
+      currentHref = location.href;
+      send({ event: "doc_hash_change", data: location.href });
+   }
+};
+window.setInterval(testHrefChange, 100);
+
+window.addEventListener("scroll", onScroll, false);
+
+// let parent know we're ready once the event loop finishes
+window.setTimeout(function() {
+   send({ event: "doc_ready", data: null });
+}, 0);
+
+// mathjax setup -------------------------------------------------------------
+
+// if this is a Qt-based browser on Windows, inject the MathJax configuration
+// data.  at the time this runs it's not possible to know whether the document
+// uses MathJax or not.
+if (window.navigator.userAgent.indexOf(" Qt/") > 0 &&
+    window.navigator.userAgent.indexOf("Windows") > 0) {
+   var s = document.createElement("script");
+   s.type = "text/x-mathjax-config";
+   s.textContent =
+      'MathJax.Hub.Config({' +
+      '  "HTML-CSS": { minScaleAdjust: 125, availableFonts: [] } ' +
+      '});';
+   document.head.appendChild(s);
+}
+})();
+
diff --git a/inst/rmd/h/tocify-1.9.1/jquery.tocify.css b/inst/rmd/h/tocify-1.9.1/jquery.tocify.css
new file mode 100644
index 0000000..bee8f33
--- /dev/null
+++ b/inst/rmd/h/tocify-1.9.1/jquery.tocify.css
@@ -0,0 +1,80 @@
+/*
+ * jquery.tocify.css 1.9.1
+ * Author: @gregfranko
+ */
+
+/* The Table of Contents container element */
+.tocify {
+    width: 20%;
+    max-height: 90%;
+    overflow: auto;
+    margin-left: 2%;
+    position: fixed;
+    border: 1px solid #ccc;
+    webkit-border-radius: 6px;
+    moz-border-radius: 6px;
+    border-radius: 6px;
+}
+
+/* The Table of Contents is composed of multiple nested unordered lists.  These styles remove the default styling of an unordered list because it is ugly. */
+.tocify ul, .tocify li {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+    border: none;
+    line-height: 30px;
+}
+
+/* Top level header elements */
+.tocify-header {
+    text-indent: 10px;
+}
+
+/* Top level subheader elements.  These are the first nested items underneath a header element. */
+.tocify-subheader {
+    text-indent: 20px;
+    display: none;
+}
+
+/* Makes the font smaller for all subheader elements. */
+.tocify-subheader li {
+    font-size: 12px;
+}
+
+/* Further indents second level subheader elements. */
+.tocify-subheader .tocify-subheader {
+    text-indent: 30px;
+}
+
+/* Further indents third level subheader elements. You can continue this pattern if you have more nested elements. */
+.tocify-subheader .tocify-subheader .tocify-subheader {
+    text-indent: 40px;
+}
+
+/* Twitter Bootstrap Override Style */
+.tocify .tocify-item > a, .tocify .nav-list .nav-header {
+    margin: 0px;
+}
+
+/* Twitter Bootstrap Override Styles */
+.tocify .tocify-item a, .tocify .list-group-item {
+    padding: 5px;
+}
+
+.tocify .nav-pills > li {
+    float: none;
+}
+
+/* We don't override the bootstrap colors because this gives us the
+   wrong selection colors when using bootstrap themes
+
+.tocify .list-group-item:hover, .tocify .list-group-item:focus {
+    background-color: #f5f5f5;
+}
+
+.tocify .list-group-item.active:hover, .tocify .list-group-item.active:focus {
+    background-color: #428bca;
+}
+*/
+
+ /* End Twitter Bootstrap Override Styles */
diff --git a/inst/rmd/h/tocify-1.9.1/jquery.tocify.js b/inst/rmd/h/tocify-1.9.1/jquery.tocify.js
new file mode 100644
index 0000000..259d193
--- /dev/null
+++ b/inst/rmd/h/tocify-1.9.1/jquery.tocify.js
@@ -0,0 +1,1002 @@
+/* jquery Tocify - v1.9.1 - 2013-10-22
+ * http://www.gregfranko.com/jquery.tocify.js/
+ * Copyright (c) 2013 Greg Franko; Licensed MIT */
+
+// Immediately-Invoked Function Expression (IIFE) [Ben Alman Blog Post](http://benalman.com/news/2010/11/immediately-invoked-function-expression/) that calls another IIFE that contains all of the plugin logic.  I used this pattern so that anyone viewing this code would not have to scroll to the bottom of the page to view the local parameters that were passed to the main IIFE.
+(function(tocify) {
+
+    // ECMAScript 5 Strict Mode: [John Resig Blog Post](http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/)
+    "use strict";
+
+    // Calls the second IIFE and locally passes in the global jQuery, window, and document objects
+    tocify(window.jQuery, window, document);
+
+  }
+
+  // Locally passes in `jQuery`, the `window` object, the `document` object, and an `undefined` variable.  The `jQuery`, `window` and `document` objects are passed in locally, to improve performance, since javascript first searches for a variable match within the local variables set before searching the global variables set.  All of the global variables are also passed in locally to be minifier friendly. `undefined` can be passed in locally, because it is not a reserved word in JavaScript.
+  (function($, window, document, undefined) {
+
+    // ECMAScript 5 Strict Mode: [John Resig Blog Post](http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/)
+    "use strict";
+
+    var tocClassName = "tocify",
+      tocClass = "." + tocClassName,
+      tocFocusClassName = "tocify-focus",
+      tocHoverClassName = "tocify-hover",
+      hideTocClassName = "tocify-hide",
+      hideTocClass = "." + hideTocClassName,
+      headerClassName = "tocify-header",
+      headerClass = "." + headerClassName,
+      subheaderClassName = "tocify-subheader",
+      subheaderClass = "." + subheaderClassName,
+      itemClassName = "tocify-item",
+      itemClass = "." + itemClassName,
+      extendPageClassName = "tocify-extend-page",
+      extendPageClass = "." + extendPageClassName;
+
+    // Calling the jQueryUI Widget Factory Method
+    $.widget("toc.tocify", {
+
+      //Plugin version
+      version: "1.9.1",
+
+      // These options will be used as defaults
+      options: {
+
+        // **context**: Accepts String: Any jQuery selector
+        // The container element that holds all of the elements used to generate the table of contents
+        context: "body",
+
+        // **ignoreSelector**: Accepts String: Any jQuery selector
+        // A selector to any element that would be matched by selectors that you wish to be ignored
+        ignoreSelector: null,
+
+        // **selectors**: Accepts an Array of Strings: Any jQuery selectors
+        // The element's used to generate the table of contents.  The order is very important since it will determine the table of content's nesting structure
+        selectors: "h1, h2, h3",
+
+        // **showAndHide**: Accepts a boolean: true or false
+        // Used to determine if elements should be shown and hidden
+        showAndHide: true,
+
+        // **showEffect**: Accepts String: "none", "fadeIn", "show", or "slideDown"
+        // Used to display any of the table of contents nested items
+        showEffect: "slideDown",
+
+        // **showEffectSpeed**: Accepts Number (milliseconds) or String: "slow", "medium", or "fast"
+        // The time duration of the show animation
+        showEffectSpeed: "medium",
+
+        // **hideEffect**: Accepts String: "none", "fadeOut", "hide", or "slideUp"
+        // Used to hide any of the table of contents nested items
+        hideEffect: "slideUp",
+
+        // **hideEffectSpeed**: Accepts Number (milliseconds) or String: "slow", "medium", or "fast"
+        // The time duration of the hide animation
+        hideEffectSpeed: "medium",
+
+        // **smoothScroll**: Accepts a boolean: true or false
+        // Determines if a jQuery animation should be used to scroll to specific table of contents items on the page
+        smoothScroll: true,
+
+        // **smoothScrollSpeed**: Accepts Number (milliseconds) or String: "slow", "medium", or "fast"
+        // The time duration of the smoothScroll animation
+        smoothScrollSpeed: "medium",
+
+        // **scrollTo**: Accepts Number (pixels)
+        // The amount of space between the top of page and the selected table of contents item after the page has been scrolled
+        scrollTo: 0,
+
+        // **showAndHideOnScroll**: Accepts a boolean: true or false
+        // Determines if table of contents nested items should be shown and hidden while scrolling
+        showAndHideOnScroll: true,
+
+        // **highlightOnScroll**: Accepts a boolean: true or false
+        // Determines if table of contents nested items should be highlighted (set to a different color) while scrolling
+        highlightOnScroll: true,
+
+        // **highlightOffset**: Accepts a number
+        // The offset distance in pixels to trigger the next active table of contents item
+        highlightOffset: 40,
+
+        // **theme**: Accepts a string: "bootstrap", "jqueryui", or "none"
+        // Determines if Twitter Bootstrap, jQueryUI, or Tocify classes should be added to the table of contents
+        theme: "bootstrap",
+
+        // **extendPage**: Accepts a boolean: true or false
+        // If a user scrolls to the bottom of the page and the page is not tall enough to scroll to the last table of contents item, then the page height is increased
+        extendPage: true,
+
+        // **extendPageOffset**: Accepts a number: pixels
+        // How close to the bottom of the page a user must scroll before the page is extended
+        extendPageOffset: 100,
+
+        // **history**: Accepts a boolean: true or false
+        // Adds a hash to the page url to maintain history
+        history: true,
+
+        // **scrollHistory**: Accepts a boolean: true or false
+        // Adds a hash to the page url, to maintain history, when scrolling to a TOC item
+        scrollHistory: false,
+
+        // **hashGenerator**: How the hash value (the anchor segment of the URL, following the
+        // # character) will be generated.
+        //
+        // "compact" (default) - #CompressesEverythingTogether
+        // "pretty" - #looks-like-a-nice-url-and-is-easily-readable
+        // function(text, element){} - Your own hash generation function that accepts the text as an
+        // argument, and returns the hash value.
+        hashGenerator: "compact",
+
+        // **highlightDefault**: Accepts a boolean: true or false
+        // Set's the first TOC item as active if no other TOC item is active.
+        highlightDefault: true
+
+      },
+
+      // _Create
+      // -------
+      //      Constructs the plugin.  Only called once.
+      _create: function() {
+
+        var self = this;
+
+        self.extendPageScroll = true;
+
+        // Internal array that keeps track of all TOC items (Helps to recognize if there are duplicate TOC item strings)
+        self.items = [];
+
+        // Generates the HTML for the dynamic table of contents
+        self._generateToc();
+
+        // Adds CSS classes to the newly generated table of contents HTML
+        self._addCSSClasses();
+
+        self.webkit = (function() {
+
+          for (var prop in window) {
+
+            if (prop) {
+
+              if (prop.toLowerCase().indexOf("webkit") !== -1) {
+
+                return true;
+
+              }
+
+            }
+
+          }
+
+          return false;
+
+        }());
+
+        // Adds jQuery event handlers to the newly generated table of contents
+        self._setEventHandlers();
+
+        // Binding to the Window load event to make sure the correct scrollTop is calculated
+        $(window).load(function() {
+
+          // Sets the active TOC item
+          self._setActiveElement(true);
+
+          // Once all animations on the page are complete, this callback function will be called
+          $("html, body").promise().done(function() {
+
+            setTimeout(function() {
+
+              self.extendPageScroll = false;
+
+            }, 0);
+
+          });
+
+        });
+
+      },
+
+      // _generateToc
+      // ------------
+      //      Generates the HTML for the dynamic table of contents
+      _generateToc: function() {
+
+        // _Local variables_
+
+        // Stores the plugin context in the self variable
+        var self = this,
+
+          // All of the HTML tags found within the context provided (i.e. body) that match the top level jQuery selector above
+          firstElem,
+
+          // Instantiated variable that will store the top level newly created unordered list DOM element
+          ul,
+          ignoreSelector = self.options.ignoreSelector;
+
+
+        // Determine the element to start the toc with
+        // get all the top level selectors
+        firstElem = [];
+        var selectors = this.options.selectors.replace(/ /g, "").split(",");
+        // find the first set that have at least one non-ignored element
+        for(var i = 0; i < selectors.length; i++) {
+          var foundSelectors = $(this.options.context).find(selectors[i]);
+          for (var s = 0; s < foundSelectors.length; s++) {
+            if (!$(foundSelectors[s]).is(ignoreSelector)) {
+              firstElem = foundSelectors;
+              break;
+            }
+          }
+          if (firstElem.length> 0)
+            break;
+        }
+
+        if (!firstElem.length) {
+
+          self.element.addClass(hideTocClassName);
+
+          return;
+
+        }
+
+        self.element.addClass(tocClassName);
+
+        // Loops through each top level selector
+        firstElem.each(function(index) {
+
+          //If the element matches the ignoreSelector then we skip it
+          if ($(this).is(ignoreSelector)) {
+            return;
+          }
+
+          // Creates an unordered list HTML element and adds a dynamic ID and standard class name
+          ul = $("<ul/>", {
+            "id": headerClassName + index,
+            "class": headerClassName
+          }).
+
+          // Appends a top level list item HTML element to the previously created HTML header
+          append(self._nestElements($(this), index));
+
+          // Add the created unordered list element to the HTML element calling the plugin
+          self.element.append(ul);
+
+          // Finds all of the HTML tags between the header and subheader elements
+          $(this).nextUntil(this.nodeName.toLowerCase()).each(function() {
+
+            // If there are no nested subheader elemements
+            if ($(this).find(self.options.selectors).length === 0) {
+
+              // Loops through all of the subheader elements
+              $(this).filter(self.options.selectors).each(function() {
+
+                //If the element matches the ignoreSelector then we skip it
+                if ($(this).is(ignoreSelector)) {
+                  return;
+                }
+
+                self._appendSubheaders.call(this, self, ul);
+
+              });
+
+            }
+
+            // If there are nested subheader elements
+            else {
+
+              // Loops through all of the subheader elements
+              $(this).find(self.options.selectors).each(function() {
+
+                //If the element matches the ignoreSelector then we skip it
+                if ($(this).is(ignoreSelector)) {
+                  return;
+                }
+
+                self._appendSubheaders.call(this, self, ul);
+
+              });
+
+            }
+
+          });
+
+        });
+
+      },
+
+      _setActiveElement: function(pageload) {
+
+        var self = this,
+
+          hash = window.location.hash.substring(1),
+
+          elem = self.element.find('li[data-unique="' + hash + '"]');
+
+        if (hash.length) {
+
+          // Removes highlighting from all of the list item's
+          self.element.find("." + self.focusClass).removeClass(self.focusClass);
+
+          // Highlights the current list item that was clicked
+          elem.addClass(self.focusClass);
+
+          // Triggers the click event on the currently focused TOC item
+          elem.click();
+
+        } else {
+
+          // Removes highlighting from all of the list item's
+          self.element.find("." + self.focusClass).removeClass(self.focusClass);
+
+          if (!hash.length && pageload && self.options.highlightDefault) {
+
+            // Highlights the first TOC item if no other items are highlighted
+            self.element.find(itemClass).first().addClass(self.focusClass);
+
+          }
+
+        }
+
+        return self;
+
+      },
+
+      // _nestElements
+      // -------------
+      //      Helps create the table of contents list by appending nested list items
+      _nestElements: function(self, index) {
+
+        var arr, item, hashValue;
+
+        arr = $.grep(this.items, function(item) {
+
+          return item === self.text();
+
+        });
+
+        // If there is already a duplicate TOC item
+        if (arr.length) {
+
+          // Adds the current TOC item text and index (for slight randomization) to the internal array
+          this.items.push(self.text() + index);
+
+        }
+
+        // If there not a duplicate TOC item
+        else {
+
+          // Adds the current TOC item text to the internal array
+          this.items.push(self.text());
+
+        }
+
+        hashValue = this._generateHashValue(arr, self, index);
+
+        // Appends a list item HTML element to the last unordered list HTML element found within the HTML element calling the plugin
+        item = $("<li/>", {
+
+          // Sets a common class name to the list item
+          "class": itemClassName,
+
+          "data-unique": hashValue
+
+        });
+
+        if (this.options.theme !== "bootstrap3") {
+
+          item.append($("<a/>", {
+
+            "text": self.text()
+
+          }));
+
+        } else {
+
+          item.text(self.text());
+
+        }
+
+        // Adds an HTML anchor tag before the currently traversed HTML element
+        self.before($("<div/>", {
+
+          // Sets a name attribute on the anchor tag to the text of the currently traversed HTML element (also making sure that all whitespace is replaced with an underscore)
+          "name": hashValue,
+
+          "data-unique": hashValue
+
+        }));
+
+        return item;
+
+      },
+
+      // _generateHashValue
+      // ------------------
+      //      Generates the hash value that will be used to refer to each item.
+      _generateHashValue: function(arr, self, index) {
+
+        var hashValue = "",
+          hashGeneratorOption = this.options.hashGenerator;
+
+        if (hashGeneratorOption === "pretty") {
+
+          // prettify the text
+          hashValue = self.text().toLowerCase().replace(/\s/g, "-");
+
+          // fix double hyphens
+          while (hashValue.indexOf("--") > -1) {
+            hashValue = hashValue.replace(/--/g, "-");
+          }
+
+          // fix colon-space instances
+          while (hashValue.indexOf(":-") > -1) {
+            hashValue = hashValue.replace(/:-/g, "-");
+          }
+
+        } else if (typeof hashGeneratorOption === "function") {
+
+          // call the function
+          hashValue = hashGeneratorOption(self.text(), self);
+
+        } else {
+
+          // compact - the default
+          hashValue = self.text().replace(/\s/g, "");
+
+        }
+
+        // add the index if we need to
+        if (arr.length) {
+          hashValue += "" + index;
+        }
+
+        // return the value
+        return hashValue;
+
+      },
+
+      // _appendElements
+      // ---------------
+      //      Helps create the table of contents list by appending subheader elements
+
+      _appendSubheaders: function(self, ul) {
+
+        // The current element index
+        var index = $(this).index(self.options.selectors),
+
+          // Finds the previous header DOM element
+          previousHeader = $(self.options.selectors).eq(index - 1),
+
+          currentTagName = +$(this).prop("tagName").charAt(1),
+
+          previousTagName = +previousHeader.prop("tagName").charAt(1),
+
+          lastSubheader;
+
+        // If the current header DOM element is smaller than the previous header DOM element or the first subheader
+        if (currentTagName < previousTagName) {
+
+          // Selects the last unordered list HTML found within the HTML element calling the plugin
+          self.element.find(subheaderClass + "[data-tag=" + currentTagName + "]").last().append(self._nestElements($(this), index));
+
+        }
+
+        // If the current header DOM element is the same type of header(eg. h4) as the previous header DOM element
+        else if (currentTagName === previousTagName) {
+
+          ul.find(itemClass).last().after(self._nestElements($(this), index));
+
+        } else {
+
+          // Selects the last unordered list HTML found within the HTML element calling the plugin
+          ul.find(itemClass).last().
+
+          // Appends an unorderedList HTML element to the dynamic `unorderedList` variable and sets a common class name
+          after($("<ul/>", {
+
+            "class": subheaderClassName,
+
+            "data-tag": currentTagName
+
+          })).next(subheaderClass).
+
+          // Appends a list item HTML element to the last unordered list HTML element found within the HTML element calling the plugin
+          append(self._nestElements($(this), index));
+        }
+
+      },
+
+      // _setEventHandlers
+      // ----------------
+      //      Adds jQuery event handlers to the newly generated table of contents
+      _setEventHandlers: function() {
+
+        // _Local variables_
+
+        // Stores the plugin context in the self variable
+        var self = this,
+
+          // Instantiates a new variable that will be used to hold a specific element's context
+          $self,
+
+          // Instantiates a new variable that will be used to determine the smoothScroll animation time duration
+          duration;
+
+        // Event delegation that looks for any clicks on list item elements inside of the HTML element calling the plugin
+        this.element.on("click.tocify", "li", function(event) {
+
+          if (self.options.history) {
+
+            window.location.hash = $(this).attr("data-unique");
+
+          }
+
+          // Removes highlighting from all of the list item's
+          self.element.find("." + self.focusClass).removeClass(self.focusClass);
+
+          // Highlights the current list item that was clicked
+          $(this).addClass(self.focusClass);
+
+          // If the showAndHide option is true
+          if (self.options.showAndHide) {
+
+            var elem = $('li[data-unique="' + $(this).attr("data-unique") + '"]');
+
+            self._triggerShow(elem);
+
+          }
+
+          self._scrollTo($(this));
+
+        });
+
+        // Mouseenter and Mouseleave event handlers for the list item's within the HTML element calling the plugin
+        this.element.find("li").on({
+
+          // Mouseenter event handler
+          "mouseenter.tocify": function() {
+
+            // Adds a hover CSS class to the current list item
+            $(this).addClass(self.hoverClass);
+
+            // Makes sure the cursor is set to the pointer icon
+            $(this).css("cursor", "pointer");
+
+          },
+
+          // Mouseleave event handler
+          "mouseleave.tocify": function() {
+
+            if (self.options.theme !== "bootstrap") {
+
+              // Removes the hover CSS class from the current list item
+              $(this).removeClass(self.hoverClass);
+
+            }
+
+          }
+        });
+
+        // only attach handler if needed (expensive in IE)
+        if (self.options.extendPage || self.options.highlightOnScroll || self.options.scrollHistory || self.options.showAndHideOnScroll) {
+          // Window scroll event handler
+          $(window).on("scroll.tocify", function() {
+
+            // Once all animations on the page are complete, this callback function will be called
+            $("html, body").promise().done(function() {
+
+              // Local variables
+
+              // Stores how far the user has scrolled
+              var winScrollTop = $(window).scrollTop(),
+
+                // Stores the height of the window
+                winHeight = $(window).height(),
+
+                // Stores the height of the document
+                docHeight = $(document).height(),
+
+                scrollHeight = $("body")[0].scrollHeight,
+
+                // Instantiates a variable that will be used to hold a selected HTML element
+                elem,
+
+                lastElem,
+
+                lastElemOffset,
+
+                currentElem;
+
+              if (self.options.extendPage) {
+
+                // If the user has scrolled to the bottom of the page and the last toc item is not focused
+                if ((self.webkit && winScrollTop >= scrollHeight - winHeight - self.options.extendPageOffset) || (!self.webkit && winHeight + winScrollTop > docHeight - self.options.extendPageOffset)) {
+
+                  if (!$(extendPageClass).length) {
+
+                    lastElem = $('div[data-unique="' + $(itemClass).last().attr("data-unique") + '"]');
+
+                    if (!lastElem.length) return;
+
+                    // Gets the top offset of the page header that is linked to the last toc item
+                    lastElemOffset = lastElem.offset().top;
+
+                    // Appends a div to the bottom of the page and sets the height to the difference of the window scrollTop and the last element's position top offset
+                    $(self.options.context).append($("<div/>", {
+
+                      "class": extendPageClassName,
+
+                      "height": Math.abs(lastElemOffset - winScrollTop) + "px",
+
+                      "data-unique": extendPageClassName
+
+                    }));
+
+                    if (self.extendPageScroll) {
+
+                      currentElem = self.element.find('li.' + self.focusClass);
+
+                      self._scrollTo($('div[data-unique="' + currentElem.attr("data-unique") + '"]'));
+
+                    }
+
+                  }
+
+                }
+
+              }
+
+              // The zero timeout ensures the following code is run after the scroll events
+              setTimeout(function() {
+
+                // _Local variables_
+
+                // Stores the distance to the closest anchor
+                var closestAnchorDistance = null,
+
+                  // Stores the index of the closest anchor
+                  closestAnchorIdx = null,
+
+                  // Keeps a reference to all anchors
+                  anchors = $(self.options.context).find("div[data-unique]"),
+
+                  anchorText;
+
+                // Determines the index of the closest anchor
+                anchors.each(function(idx) {
+                  var distance = Math.abs(($(this).next().length ? $(this).next() : $(this)).offset().top - winScrollTop - self.options.highlightOffset);
+                  if (closestAnchorDistance == null || distance < closestAnchorDistance) {
+                    closestAnchorDistance = distance;
+                    closestAnchorIdx = idx;
+                  } else {
+                    return false;
+                  }
+                });
+
+                anchorText = $(anchors[closestAnchorIdx]).attr("data-unique");
+
+                // Stores the list item HTML element that corresponds to the currently traversed anchor tag
+                elem = $('li[data-unique="' + anchorText + '"]');
+
+                // If the `highlightOnScroll` option is true and a next element is found
+                if (self.options.highlightOnScroll && elem.length) {
+
+                  // Removes highlighting from all of the list item's
+                  self.element.find("." + self.focusClass).removeClass(self.focusClass);
+
+                  // Highlights the corresponding list item
+                  elem.addClass(self.focusClass);
+
+                }
+
+                if (self.options.scrollHistory) {
+
+                  if (window.location.hash !== "#" + anchorText) {
+
+                    window.location.replace("#" + anchorText);
+
+                  }
+                }
+
+                // If the `showAndHideOnScroll` option is true
+                if (self.options.showAndHideOnScroll && self.options.showAndHide) {
+
+                  self._triggerShow(elem, true);
+
+                }
+
+              }, 0);
+
+            });
+
+          });
+        }
+
+      },
+
+      // Show
+      // ----
+      //      Opens the current sub-header
+      show: function(elem, scroll) {
+
+        // Stores the plugin context in the `self` variable
+        var self = this,
+          element = elem;
+
+        // If the sub-header is not already visible
+        if (!elem.is(":visible")) {
+
+          // If the current element does not have any nested subheaders, is not a header, and its parent is not visible
+          if (!elem.find(subheaderClass).length && !elem.parent().is(headerClass) && !elem.parent().is(":visible")) {
+
+            // Sets the current element to all of the subheaders within the current header
+            elem = elem.parents(subheaderClass).add(elem);
+
+          }
+
+          // If the current element does not have any nested subheaders and is not a header
+          else if (!elem.children(subheaderClass).length && !elem.parent().is(headerClass)) {
+
+            // Sets the current element to the closest subheader
+            elem = elem.closest(subheaderClass);
+
+          }
+
+          //Determines what jQuery effect to use
+          switch (self.options.showEffect) {
+
+            //Uses `no effect`
+            case "none":
+
+              elem.show();
+
+              break;
+
+              //Uses the jQuery `show` special effect
+            case "show":
+
+              elem.show(self.options.showEffectSpeed);
+
+              break;
+
+              //Uses the jQuery `slideDown` special effect
+            case "slideDown":
+
+              elem.slideDown(self.options.showEffectSpeed);
+
+              break;
+
+              //Uses the jQuery `fadeIn` special effect
+            case "fadeIn":
+
+              elem.fadeIn(self.options.showEffectSpeed);
+
+              break;
+
+              //If none of the above options were passed, then a `jQueryUI show effect` is expected
+            default:
+
+              elem.show();
+
+              break;
+
+          }
+
+        }
+
+        // If the current subheader parent element is a header
+        if (elem.parent().is(headerClass)) {
+
+          // Hides all non-active sub-headers
+          self.hide($(subheaderClass).not(elem));
+
+        }
+
+        // If the current subheader parent element is not a header
+        else {
+
+          // Hides all non-active sub-headers
+          self.hide($(subheaderClass).not(elem.closest(headerClass).find(subheaderClass).not(elem.siblings())));
+
+        }
+
+        // Maintains chainablity
+        return self;
+
+      },
+
+      // Hide
+      // ----
+      //      Closes the current sub-header
+      hide: function(elem) {
+
+        // Stores the plugin context in the `self` variable
+        var self = this;
+
+        //Determines what jQuery effect to use
+        switch (self.options.hideEffect) {
+
+          // Uses `no effect`
+          case "none":
+
+            elem.hide();
+
+            break;
+
+            // Uses the jQuery `hide` special effect
+          case "hide":
+
+            elem.hide(self.options.hideEffectSpeed);
+
+            break;
+
+            // Uses the jQuery `slideUp` special effect
+          case "slideUp":
+
+            elem.slideUp(self.options.hideEffectSpeed);
+
+            break;
+
+            // Uses the jQuery `fadeOut` special effect
+          case "fadeOut":
+
+            elem.fadeOut(self.options.hideEffectSpeed);
+
+            break;
+
+            // If none of the above options were passed, then a `jqueryUI hide effect` is expected
+          default:
+
+            elem.hide();
+
+            break;
+
+        }
+
+        // Maintains chainablity
+        return self;
+      },
+
+      // _triggerShow
+      // ------------
+      //      Determines what elements get shown on scroll and click
+      _triggerShow: function(elem, scroll) {
+
+        var self = this;
+
+        // If the current element's parent is a header element or the next element is a nested subheader element
+        if (elem.parent().is(headerClass) || elem.next().is(subheaderClass)) {
+
+          // Shows the next sub-header element
+          self.show(elem.next(subheaderClass), scroll);
+
+        }
+
+        // If the current element's parent is a subheader element
+        else if (elem.parent().is(subheaderClass)) {
+
+          // Shows the parent sub-header element
+          self.show(elem.parent(), scroll);
+
+        }
+
+        // Maintains chainability
+        return self;
+
+      },
+
+      // _addCSSClasses
+      // --------------
+      //      Adds CSS classes to the newly generated table of contents HTML
+      _addCSSClasses: function() {
+
+        // If the user wants a jqueryUI theme
+        if (this.options.theme === "jqueryui") {
+
+          this.focusClass = "ui-state-default";
+
+          this.hoverClass = "ui-state-hover";
+
+          //Adds the default styling to the dropdown list
+          this.element.addClass("ui-widget").find(".toc-title").addClass("ui-widget-header").end().find("li").addClass("ui-widget-content");
+
+        }
+
+        // If the user wants a twitterBootstrap theme
+        else if (this.options.theme === "bootstrap") {
+
+          this.element.find(headerClass + "," + subheaderClass).addClass("nav nav-list");
+
+          this.focusClass = "active";
+
+        }
+
+        // If the user wants a twitterBootstrap theme
+        else if (this.options.theme === "bootstrap3") {
+
+          this.element.find(headerClass + "," + subheaderClass).addClass("list-group");
+
+          this.element.find(itemClass).addClass("list-group-item");
+
+          this.focusClass = "active";
+
+        }
+
+        // If a user does not want a prebuilt theme
+        else {
+
+          // Adds more neutral classes (instead of jqueryui)
+
+          this.focusClass = tocFocusClassName;
+
+          this.hoverClass = tocHoverClassName;
+
+        }
+
+        //Maintains chainability
+        return this;
+
+      },
+
+      // setOption
+      // ---------
+      //      Sets a single Tocify option after the plugin is invoked
+      setOption: function() {
+
+        // Calls the jQueryUI Widget Factory setOption method
+        $.Widget.prototype._setOption.apply(this, arguments);
+
+      },
+
+      // setOptions
+      // ----------
+      //      Sets a single or multiple Tocify options after the plugin is invoked
+      setOptions: function() {
+
+        // Calls the jQueryUI Widget Factory setOptions method
+        $.Widget.prototype._setOptions.apply(this, arguments);
+
+      },
+
+      // _scrollTo
+      // ---------
+      //      Scrolls to a specific element
+      _scrollTo: function(elem) {
+
+        var self = this,
+          duration = self.options.smoothScroll || 0,
+          scrollTo = self.options.scrollTo,
+          currentDiv = $('div[data-unique="' + elem.attr("data-unique") + '"]');
+
+        if (!currentDiv.length) {
+
+          return self;
+
+        }
+
+        // Once all animations on the page are complete, this callback function will be called
+        $("html, body").promise().done(function() {
+
+          // Animates the html and body element scrolltops
+          $("html, body").animate({
+
+            // Sets the jQuery `scrollTop` to the top offset of the HTML div tag that matches the current list item's `data-unique` tag
+            "scrollTop": currentDiv.offset().top - ($.isFunction(scrollTo) ? scrollTo.call() : scrollTo) + "px"
+
+          }, {
+
+            // Sets the smoothScroll animation time duration to the smoothScrollSpeed option
+            "duration": duration
+
+          });
+
+        });
+
+        // Maintains chainability
+        return self;
+
+      }
+
+    });
+
+  })); //end of plugin
diff --git a/inst/rmd/ioslides/default.html b/inst/rmd/ioslides/default.html
new file mode 100644
index 0000000..ddb6246
--- /dev/null
+++ b/inst/rmd/ioslides/default.html
@@ -0,0 +1,181 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>
+
+  <meta charset="utf-8">
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta http-equiv="X-UA-Compatible" content="chrome=1">
+  <meta name="generator" content="pandoc" />
+
+
+
+$if(date-meta)$
+  <meta name="date" content="$date-meta$" />
+$endif$
+
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <meta name="apple-mobile-web-app-capable" content="yes">
+
+  <base target="_blank">
+
+  <script type="text/javascript">
+    var SLIDE_CONFIG = {
+      // Slide settings
+      settings: {
+        $if(title)$
+        title: '$title$',
+        $endif$
+        $if(subtitle)$
+        subtitle: '$subtitle$',
+        $endif$
+        useBuilds: true,
+        usePrettify: true,
+        enableSlideAreas: true,
+        enableTouch: true,
+        $if(analytics)$
+        analytics: '$analytics$',
+        $endif$
+        $if(logo)$
+        favIcon: '$logo$',
+        $endif$
+      },
+
+      // Author information
+      presenters: [
+      $for(author)$
+      {
+        name: $if(author.name)$ '$author.name$' $else$ '$author$' $endif$,
+        company: '$author.company$',
+        gplus: '$author.gplus$',
+        twitter: '$author.twitter$',
+        www: '$author.www$',
+        github: '$author.github$'
+      },
+      $endfor$
+      ]
+    };
+  </script>
+
+$for(header-includes)$
+  $header-includes$
+$endfor$
+
+  <style type="text/css">
+
+    b, strong {
+      font-weight: bold;
+    }
+
+    em {
+      font-style: italic;
+    }
+
+    slides > slide {
+      -webkit-transition: all $transition$s ease-in-out;
+      -moz-transition: all $transition$s ease-in-out;
+      -o-transition: all $transition$s ease-in-out;
+      transition: all $transition$s ease-in-out;
+    }
+
+    .auto-fadein {
+      -webkit-transition: opacity 0.6s ease-in;
+      -webkit-transition-delay: $transition$s;
+      -moz-transition: opacity 0.6s ease-in $transition$s;
+      -o-transition: opacity 0.6s ease-in $transition$s;
+      transition: opacity 0.6s ease-in $transition$s;
+      opacity: 0;
+    }
+
+$if(logo)$
+    slides > slide:not(.nobackground):before {
+      font-size: 12pt;
+      content: "";
+      position: absolute;
+      bottom: 20px;
+      left: 60px;
+      background: url($logo$) no-repeat 0 50%;
+      -webkit-background-size: 30px 30px;
+      -moz-background-size: 30px 30px;
+      -o-background-size: 30px 30px;
+      background-size: 30px 30px;
+      padding-left: 40px;
+      height: 30px;
+      line-height: 1.9;
+    }
+$endif$
+  </style>
+
+$for(css)$
+  <link rel="stylesheet" href="$css$" $if(html5)$$else$type="text/css" $endif$/>
+$endfor$
+
+</head>
+
+<body style="opacity: 0">
+
+$if(widescreen)$
+<slides class="layout-widescreen">
+$else$
+<slides>
+$endif$
+
+$if(include-before)$
+  $for(include-before)$
+    $include-before$
+  $endfor$
+$else$
+  <slide class="title-slide segue nobackground">
+    $if(logo)$
+    <aside class="gdbar"><img src="$logo$"></aside>
+    $endif$
+    <!-- The content of this hgroup is replaced programmatically through the slide_config.json. -->
+    <hgroup class="auto-fadein">
+      <h1 data-config-title><!-- populated from slide_config.json --></h1>
+      <h2 data-config-subtitle><!-- populated from slide_config.json --></h2>
+      <p data-config-presenter><!-- populated from slide_config.json --></p>
+      $if(date)$
+      <p style="margin-top: 6px; margin-left: -2px;">$date$</p>
+      $endif$
+    </hgroup>
+  </slide>
+$endif$
+
+RENDERED_SLIDES
+
+$for(include-after)$
+  $include-after$
+$endfor$
+
+  <slide class="backdrop"></slide>
+
+</slides>
+
+$if(mathjax-url)$
+<!-- dynamically load mathjax for compatibility with self-contained -->
+<script>
+  (function () {
+    var script = document.createElement("script");
+    script.type = "text/javascript";
+    script.src  = "$mathjax-url$";
+    document.getElementsByTagName("head")[0].appendChild(script);
+  })();
+</script>
+$endif$
+
+<!-- map slide visiblity events into shiny -->
+<script>
+  (function() {
+    if (window.jQuery) {
+       window.jQuery(document).on('slideleave', function(e) {
+         window.jQuery(e.target).trigger('hidden');
+      });
+       window.jQuery(document).on('slideenter', function(e) {
+         window.jQuery(e.target).trigger('shown');
+      });
+    }
+  })();
+</script>
+
+</body>
+</html>
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSans.ttf b/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSans.ttf
new file mode 100644
index 0000000..1d6f3fa
Binary files /dev/null and b/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSans.ttf differ
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansItalic.ttf b/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansItalic.ttf
new file mode 100644
index 0000000..3b903d5
Binary files /dev/null and b/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansItalic.ttf differ
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansSemibold.ttf b/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansSemibold.ttf
new file mode 100644
index 0000000..c184512
Binary files /dev/null and b/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansSemibold.ttf differ
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansSemiboldItalic.ttf b/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansSemiboldItalic.ttf
new file mode 100644
index 0000000..2b355aa
Binary files /dev/null and b/inst/rmd/ioslides/ioslides-13.5.1/fonts/OpenSansSemiboldItalic.ttf differ
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/fonts/SourceCodePro.ttf b/inst/rmd/ioslides/ioslides-13.5.1/fonts/SourceCodePro.ttf
new file mode 100644
index 0000000..e67f49c
Binary files /dev/null and b/inst/rmd/ioslides/ioslides-13.5.1/fonts/SourceCodePro.ttf differ
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/fonts/fonts.css b/inst/rmd/ioslides/ioslides-13.5.1/fonts/fonts.css
new file mode 100644
index 0000000..a949d32
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/fonts/fonts.css
@@ -0,0 +1,30 @@
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 400;
+  src: url(OpenSans.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 600;
+  src: url(OpenSansSemibold.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 400;
+  src: url(OpenSansItalic.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 600;
+  src: url(OpenSansSemiboldItalic.ttf) format('truetype');
+}
+ at font-face {
+  font-family: 'Source Code Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(SourceCodePro.ttf) format('truetype');
+}
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/images/google_developers_icon_128.png b/inst/rmd/ioslides/ioslides-13.5.1/images/google_developers_icon_128.png
new file mode 100644
index 0000000..befbd0b
Binary files /dev/null and b/inst/rmd/ioslides/ioslides-13.5.1/images/google_developers_icon_128.png differ
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/hammer.js b/inst/rmd/ioslides/ioslides-13.5.1/js/hammer.js
new file mode 100755
index 0000000..44a5802
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/hammer.js
@@ -0,0 +1,586 @@
+/*
+ * Hammer.JS
+ * version 0.4
+ * author: Eight Media
+ * https://github.com/EightMedia/hammer.js
+ */
+function Hammer(element, options, undefined)
+{
+    var self = this;
+
+    var defaults = {
+        // prevent the default event or not... might be buggy when false
+        prevent_default    : false,
+        css_hacks          : true,
+
+        drag               : true,
+        drag_vertical      : true,
+        drag_horizontal    : true,
+        // minimum distance before the drag event starts
+        drag_min_distance  : 20, // pixels
+
+        // pinch zoom and rotation
+        transform          : true,
+        scale_treshold     : 0.1,
+        rotation_treshold  : 15, // degrees
+
+        tap                : true,
+        tap_double         : true,
+        tap_max_interval   : 300,
+        tap_double_distance: 20,
+
+        hold               : true,
+        hold_timeout       : 500
+    };
+    options = mergeObject(defaults, options);
+
+    // some css hacks
+    (function() {
+        if(!options.css_hacks) {
+            return false;
+        }
+
+        var vendors = ['webkit','moz','ms','o',''];
+        var css_props = {
+            "userSelect": "none",
+            "touchCallout": "none",
+            "userDrag": "none",
+            "tapHighlightColor": "rgba(0,0,0,0)"
+        };
+
+        var prop = '';
+        for(var i = 0; i < vendors.length; i++) {
+            for(var p in css_props) {
+                prop = p;
+                if(vendors[i]) {
+                    prop = vendors[i] + prop.substring(0, 1).toUpperCase() + prop.substring(1);
+                }
+                element.style[ prop ] = css_props[p];
+            }
+        }
+    })();
+
+    // holds the distance that has been moved
+    var _distance = 0;
+
+    // holds the exact angle that has been moved
+    var _angle = 0;
+
+    // holds the diraction that has been moved
+    var _direction = 0;
+
+    // holds position movement for sliding
+    var _pos = { };
+
+    // how many fingers are on the screen
+    var _fingers = 0;
+
+    var _first = false;
+
+    var _gesture = null;
+    var _prev_gesture = null;
+
+    var _touch_start_time = null;
+    var _prev_tap_pos = {x: 0, y: 0};
+    var _prev_tap_end_time = null;
+
+    var _hold_timer = null;
+
+    var _offset = {};
+
+    // keep track of the mouse status
+    var _mousedown = false;
+
+    var _event_start;
+    var _event_move;
+    var _event_end;
+
+
+    /**
+     * angle to direction define
+     * @param  float    angle
+     * @return string   direction
+     */
+    this.getDirectionFromAngle = function( angle )
+    {
+        var directions = {
+            down: angle >= 45 && angle < 135, //90
+            left: angle >= 135 || angle <= -135, //180
+            up: angle < -45 && angle > -135, //270
+            right: angle >= -45 && angle <= 45 //0
+        };
+
+        var direction, key;
+        for(key in directions){
+            if(directions[key]){
+                direction = key;
+                break;
+            }
+        }
+        return direction;
+    };
+
+
+    /**
+     * count the number of fingers in the event
+     * when no fingers are detected, one finger is returned (mouse pointer)
+     * @param  event
+     * @return int  fingers
+     */
+    function countFingers( event )
+    {
+        // there is a bug on android (until v4?) that touches is always 1,
+        // so no multitouch is supported, e.g. no, zoom and rotation...
+        return event.touches ? event.touches.length : 1;
+    }
+
+
+    /**
+     * get the x and y positions from the event object
+     * @param  event
+     * @return array  [{ x: int, y: int }]
+     */
+    function getXYfromEvent( event )
+    {
+        event = event || window.event;
+
+        // no touches, use the event pageX and pageY
+        if(!event.touches) {
+            var doc = document,
+                body = doc.body;
+
+            return [{
+                x: event.pageX || event.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && doc.clientLeft || 0 ),
+                y: event.pageY || event.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && doc.clientTop || 0 )
+            }];
+        }
+        // multitouch, return array with positions
+        else {
+            var pos = [], src;
+            for(var t=0, len=event.touches.length; t<len; t++) {
+                src = event.touches[t];
+                pos.push({ x: src.pageX, y: src.pageY });
+            }
+            return pos;
+        }
+    }
+
+
+    /**
+     * calculate the angle between two points
+     * @param object pos1 { x: int, y: int }
+     * @param object pos2 { x: int, y: int }
+     */
+    function getAngle( pos1, pos2 )
+    {
+        return Math.atan2(pos2.y - pos1.y, pos2.x - pos1.x) * 180 / Math.PI;
+    }
+
+    /**
+     * trigger an event/callback by name with params
+     * @param string name
+     * @param array  params
+     */
+    function triggerEvent( eventName, params )
+    {
+        // return touches object
+        params.touches = getXYfromEvent(params.originalEvent);
+        params.type = eventName;
+
+        // trigger callback
+        if(isFunction(self["on"+ eventName])) {
+            self["on"+ eventName].call(self, params);
+        }
+    }
+
+
+    /**
+     * cancel event
+     * @param   object  event
+     * @return  void
+     */
+
+    function cancelEvent(event){
+        event = event || window.event;
+        if(event.preventDefault){
+            event.preventDefault();
+        }else{
+            event.returnValue = false;
+            event.cancelBubble = true;
+        }
+    }
+
+
+    /**
+     * reset the internal vars to the start values
+     */
+    function reset()
+    {
+        _pos = {};
+        _first = false;
+        _fingers = 0;
+        _distance = 0;
+        _angle = 0;
+        _gesture = null;
+    }
+
+
+    var gestures = {
+        // hold gesture
+        // fired on touchstart
+        hold : function(event)
+        {
+            // only when one finger is on the screen
+            if(options.hold) {
+                _gesture = 'hold';
+                clearTimeout(_hold_timer);
+
+                _hold_timer = setTimeout(function() {
+                    if(_gesture == 'hold') {
+                        triggerEvent("hold", {
+                            originalEvent   : event,
+                            position        : _pos.start
+                        });
+                    }
+                }, options.hold_timeout);
+            }
+        },
+
+
+        // drag gesture
+        // fired on mousemove
+        drag : function(event)
+        {
+            // get the distance we moved
+            var _distance_x = _pos.move[0].x - _pos.start[0].x;
+            var _distance_y = _pos.move[0].y - _pos.start[0].y;
+            _distance = Math.sqrt(_distance_x * _distance_x + _distance_y * _distance_y);
+
+            // drag
+            // minimal movement required
+            if(options.drag && (_distance > options.drag_min_distance) || _gesture == 'drag') {
+                // calculate the angle
+                _angle = getAngle(_pos.start[0], _pos.move[0]);
+                _direction = self.getDirectionFromAngle(_angle);
+
+                // check the movement and stop if we go in the wrong direction
+                var is_vertical = (_direction == 'up' || _direction == 'down');
+                if(((is_vertical && !options.drag_vertical) || (!is_vertical && !options.drag_horizontal))
+                    && (_distance > options.drag_min_distance)) {
+                    return;
+                }
+
+                _gesture = 'drag';
+
+                var position = { x: _pos.move[0].x - _offset.left,
+                    y: _pos.move[0].y - _offset.top };
+
+                var event_obj = {
+                    originalEvent   : event,
+                    position        : position,
+                    direction       : _direction,
+                    distance        : _distance,
+                    distanceX       : _distance_x,
+                    distanceY       : _distance_y,
+                    angle           : _angle
+                };
+
+                // on the first time trigger the start event
+                if(_first) {
+                    triggerEvent("dragstart", event_obj);
+
+                    _first = false;
+                }
+
+                // normal slide event
+                triggerEvent("drag", event_obj);
+
+                cancelEvent(event);
+            }
+        },
+
+
+        // transform gesture
+        // fired on touchmove
+        transform : function(event)
+        {
+            if(options.transform) {
+                var scale = event.scale || 1;
+                var rotation = event.rotation || 0;
+
+                if(countFingers(event) != 2) {
+                    return false;
+                }
+
+                if(_gesture != 'drag' &&
+                    (_gesture == 'transform' || Math.abs(1-scale) > options.scale_treshold
+                        || Math.abs(rotation) > options.rotation_treshold)) {
+                    _gesture = 'transform';
+
+                    _pos.center = {  x: ((_pos.move[0].x + _pos.move[1].x) / 2) - _offset.left,
+                        y: ((_pos.move[0].y + _pos.move[1].y) / 2) - _offset.top };
+
+                    var event_obj = {
+                        originalEvent   : event,
+                        position        : _pos.center,
+                        scale           : scale,
+                        rotation        : rotation
+                    };
+
+                    // on the first time trigger the start event
+                    if(_first) {
+                        triggerEvent("transformstart", event_obj);
+                        _first = false;
+                    }
+
+                    triggerEvent("transform", event_obj);
+
+                    cancelEvent(event);
+
+                    return true;
+                }
+            }
+
+            return false;
+        },
+
+
+        // tap and double tap gesture
+        // fired on touchend
+        tap : function(event)
+        {
+            // compare the kind of gesture by time
+            var now = new Date().getTime();
+            var touch_time = now - _touch_start_time;
+
+            // dont fire when hold is fired
+            if(options.hold && !(options.hold && options.hold_timeout > touch_time)) {
+                return;
+            }
+
+            // when previous event was tap and the tap was max_interval ms ago
+            var is_double_tap = (function(){
+                if (_prev_tap_pos && options.tap_double && _prev_gesture == 'tap' && (_touch_start_time - _prev_tap_end_time) < options.tap_max_interval) {
+                    var x_distance = Math.abs(_prev_tap_pos[0].x - _pos.start[0].x);
+                    var y_distance = Math.abs(_prev_tap_pos[0].y - _pos.start[0].y);
+                    return (_prev_tap_pos && _pos.start && Math.max(x_distance, y_distance) < options.tap_double_distance);
+
+                }
+                return false;
+            })();
+
+            if(is_double_tap) {
+                _gesture = 'double_tap';
+                _prev_tap_end_time = null;
+
+                triggerEvent("doubletap", {
+                    originalEvent   : event,
+                    position        : _pos.start
+                });
+                cancelEvent(event);
+            }
+
+            // single tap is single touch
+            else {
+                _gesture = 'tap';
+                _prev_tap_end_time = now;
+                _prev_tap_pos = _pos.start;
+
+                if(options.tap) {
+                    triggerEvent("tap", {
+                        originalEvent   : event,
+                        position        : _pos.start
+                    });
+                    cancelEvent(event);
+                }
+            }
+
+        }
+
+    };
+
+
+    function handleEvents(event)
+    {
+        switch(event.type)
+        {
+            case 'mousedown':
+            case 'touchstart':
+                _pos.start = getXYfromEvent(event);
+                _touch_start_time = new Date().getTime();
+                _fingers = countFingers(event);
+                _first = true;
+                _event_start = event;
+
+                // borrowed from jquery offset https://github.com/jquery/jquery/blob/master/src/offset.js
+                var box = element.getBoundingClientRect();
+                var clientTop  = element.clientTop  || document.body.clientTop  || 0;
+                var clientLeft = element.clientLeft || document.body.clientLeft || 0;
+                var scrollTop  = window.pageYOffset || element.scrollTop  || document.body.scrollTop;
+                var scrollLeft = window.pageXOffset || element.scrollLeft || document.body.scrollLeft;
+
+                _offset = {
+                    top: box.top + scrollTop - clientTop,
+                    left: box.left + scrollLeft - clientLeft
+                };
+
+                _mousedown = true;
+
+                // hold gesture
+                gestures.hold(event);
+
+                if(options.prevent_default) {
+                    cancelEvent(event);
+                }
+                break;
+
+            case 'mousemove':
+            case 'touchmove':
+                if(!_mousedown) {
+                    return false;
+                }
+                _event_move = event;
+                _pos.move = getXYfromEvent(event);
+
+                if(!gestures.transform(event)) {
+                    gestures.drag(event);
+                }
+                break;
+
+            case 'mouseup':
+            case 'mouseout':
+            case 'touchcancel':
+            case 'touchend':
+                if(!_mousedown || (_gesture != 'transform' && event.touches && event.touches.length > 0)) {
+                    return false;
+                }
+
+                _mousedown = false;
+                _event_end = event;
+
+                // drag gesture
+                // dragstart is triggered, so dragend is possible
+                if(_gesture == 'drag') {
+                    triggerEvent("dragend", {
+                        originalEvent   : event,
+                        direction       : _direction,
+                        distance        : _distance,
+                        angle           : _angle
+                    });
+                }
+
+                // transform
+                // transformstart is triggered, so transformed is possible
+                else if(_gesture == 'transform') {
+                    triggerEvent("transformend", {
+                        originalEvent   : event,
+                        position        : _pos.center,
+                        scale           : event.scale,
+                        rotation        : event.rotation
+                    });
+                }
+                else {
+                    gestures.tap(_event_start);
+                }
+
+                _prev_gesture = _gesture;
+
+                // reset vars
+                reset();
+                break;
+        }
+    }
+
+
+    // bind events for touch devices
+    // except for windows phone 7.5, it doesnt support touch events..!
+    if('ontouchstart' in window) {
+        element.addEventListener("touchstart", handleEvents, false);
+        element.addEventListener("touchmove", handleEvents, false);
+        element.addEventListener("touchend", handleEvents, false);
+        element.addEventListener("touchcancel", handleEvents, false);
+    }
+    // for non-touch
+    else {
+
+        if(element.addEventListener){ // prevent old IE errors
+            element.addEventListener("mouseout", function(event) {
+                if(!isInsideHammer(element, event.relatedTarget)) {
+                    handleEvents(event);
+                }
+            }, false);
+            element.addEventListener("mouseup", handleEvents, false);
+            element.addEventListener("mousedown", handleEvents, false);
+            element.addEventListener("mousemove", handleEvents, false);
+
+            // events for older IE
+        }else if(document.attachEvent){
+            element.attachEvent("onmouseout", function(event) {
+                if(!isInsideHammer(element, event.relatedTarget)) {
+                    handleEvents(event);
+                }
+            }, false);
+            element.attachEvent("onmouseup", handleEvents);
+            element.attachEvent("onmousedown", handleEvents);
+            element.attachEvent("onmousemove", handleEvents);
+        }
+    }
+
+
+    /**
+     * find if element is (inside) given parent element
+     * @param   object  element
+     * @param   object  parent
+     * @return  bool    inside
+     */
+    function isInsideHammer(parent, child) {
+        // get related target for IE
+        if(!child && window.event && window.event.toElement){
+            child = window.event.toElement;
+        }
+
+        if(parent === child){
+            return true;
+        }
+
+        // loop over parentNodes of child until we find hammer element
+        if(child){
+            var node = child.parentNode;
+            while(node !== null){
+                if(node === parent){
+                    return true;
+                };
+                node = node.parentNode;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * merge 2 objects into a new object
+     * @param   object  obj1
+     * @param   object  obj2
+     * @return  object  merged object
+     */
+    function mergeObject(obj1, obj2) {
+        var output = {};
+
+        if(!obj2) {
+            return obj1;
+        }
+
+        for (var prop in obj1) {
+            if (prop in obj2) {
+                output[prop] = obj2[prop];
+            } else {
+                output[prop] = obj1[prop];
+            }
+        }
+        return output;
+    }
+
+    function isFunction( obj ){
+        return Object.prototype.toString.call( obj ) == "[object Function]";
+    }
+}
\ No newline at end of file
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/modernizr.custom.45394.js b/inst/rmd/ioslides/ioslides-13.5.1/js/modernizr.custom.45394.js
new file mode 100644
index 0000000..26f38cd
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/modernizr.custom.45394.js
@@ -0,0 +1,4 @@
+/* Modernizr 2.5.3 (Custom Build) | MIT & BSD
+ * Build: http://www.modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-flexbox_legacy-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil [...]
+ */
+;window.Modernizr=function(a,b,c){function C(a){i.cssText=a}function D(a,b){return C(m.join(a+";")+(b||""))}function E(a,b){return typeof a===b}function F(a,b){return!!~(""+a).indexOf(b)}function G(a,b){for(var d in a)if(i[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function H(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:E(f,"function")?f.bind(d||b):f}return!1}function I(a,b,c){var d=a.charAt(0).toUpperCase()+a.substr(1),e=(a+" "+o.join(d+" ")+d).split(" ");return E(b, [...]
\ No newline at end of file
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/order.js b/inst/rmd/ioslides/ioslides-13.5.1/js/order.js
new file mode 100644
index 0000000..e78c183
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/order.js
@@ -0,0 +1,8 @@
+/*
+ RequireJS order 1.0.5 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+(function(){function k(a){var b=a.currentTarget||a.srcElement,c;if(a.type==="load"||l.test(b.readyState)){a=b.getAttribute("data-requiremodule");j[a]=!0;for(a=0;c=g[a];a++)if(j[c.name])c.req([c.name],c.onLoad);else break;a>0&&g.splice(0,a);setTimeout(function(){b.parentNode.removeChild(b)},15)}}function m(a){var b,c;a.setAttribute("data-orderloaded","loaded");for(a=0;c=h[a];a++)if((b=i[c])&&b.getAttribute("data-orderloaded")==="loaded")delete i[c],require.addScriptToDom(b);else break;a>0 [...]
+a)}var f=typeof document!=="undefined"&&typeof window!=="undefined"&&document.createElement("script"),n=f&&(f.async||window.opera&&Object.prototype.toString.call(window.opera)==="[object Opera]"||"MozAppearance"in document.documentElement.style),o=f&&f.readyState==="uninitialized",l=/^(complete|loaded)$/,g=[],j={},i={},h=[],f=null;define({version:"1.0.5",load:function(a,b,c,e){var d;b.nameToUrl?(d=b.nameToUrl(a,null),require.s.skipAsync[d]=!0,n||e.isBuild?b([a],c):o?(e=require.s.contexts [...]
+!e.loaded[a]&&(e.urlFetched[d]=!0,require.resourcesReady(!1),e.scriptCount+=1,d=require.attach(d,e,a,null,null,m),i[a]=d,h.push(a)),b([a],c)):b.specified(a)?b([a],c):(g.push({name:a,req:b,onLoad:c}),require.attach(d,null,a,k,"script/cache"))):b([a],c)}})})();
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/classList.min.js b/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/classList.min.js
new file mode 100644
index 0000000..932c777
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/classList.min.js
@@ -0,0 +1,2 @@
+/* @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
+"use strict";if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(a){var f="classList",d="prototype",e=(a.HTMLElement||a.Element)[d],g=Object;strTrim=String[d].trim||function(){return this.replace(/^\s+|\s+$/g,"")},arrIndexOf=Array[d].indexOf||function(k){for(var j=0,h=this.length;j<h;j++){if(j in this&&this[j]===k){return j}}return -1},DOMEx=function(h,i){this.name=h;this.code=DOMException[h];this.message=i},checkTokenAndGetIndex=function(i,h){if(h= [...]
\ No newline at end of file
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/dataset.min.js b/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/dataset.min.js
new file mode 100644
index 0000000..3f2a564
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/dataset.min.js
@@ -0,0 +1,2 @@
+(function(){function c(){d=!0;this.removeEventListener("DOMAttrModified",c,!1)}function g(b){return b.replace(h,function(b,a){return a.toUpperCase()})}function e(){var b={};i.call(this.attributes,function(a){if(f=a.name.match(j))b[g(f[1])]=a.value});return b}var i=[].forEach,j=/^data-(.+)/,h=/\-([a-z])/ig,a=document.createElement("div"),d=!1,f;a.dataset==void 0&&(a.addEventListener("DOMAttrModified",c,!1),a.setAttribute("foo","bar"),Element.prototype.__defineGetter__("dataset",d?function [...]
+e.call(this);return this._datasetCache}:e),document.addEventListener("DOMAttrModified",function(a){delete a.target._datasetCache},!1))})();
\ No newline at end of file
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/history.min.js b/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/history.min.js
new file mode 100644
index 0000000..2aee07e
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/polyfills/history.min.js
@@ -0,0 +1 @@
+(function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtm [...]
\ No newline at end of file
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-r.js b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-r.js
new file mode 100644
index 0000000..3d19db0
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-r.js
@@ -0,0 +1,57 @@
+// Copyright (C) 2012 Jeffrey B. Arnold
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+/**
+ * @fileoverview
+ * Registers a language handler for S, S-plus, and R source code.
+ *
+ *
+ * To use, include prettify.js and this file in your HTML page.
+ * Then put your code in an HTML tag like
+ *      <pre class="prettyprint lang-r"> code </pre>
+ *
+ * Language definition from
+ * http://cran.r-project.org/doc/manuals/R-lang.html.
+ * Many of the regexes are shared  with the pygments SLexer,
+ * http://pygments.org/.
+ *
+ * Original: https://raw.github.com/jrnold/prettify-lang-r-bugs/master/lang-r.js
+ *
+ * @author jeffrey.arnold at gmail.com
+ */
+PR['registerLangHandler'](
+    PR['createSimpleLexer'](
+        [
+            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
+	    [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"'],
+	    [PR['PR_STRING'],      /^\'(?:[^\'\\]|\\[\s\S])*(?:\'|$)/, null, "'"]
+        ],
+        [
+            [PR['PR_COMMENT'],     /^#.*/],
+	    [PR['PR_KEYWORD'],     /^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![A-Za-z0-9_.])/],
+	    // hex numbes
+	    [PR['PR_LITERAL'], /^0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/],
+	    // Decimal numbers
+            [PR['PR_LITERAL'], /^[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?[Li]?/],
+	    // builtin symbols
+	    [PR['PR_LITERAL'], /^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|[0-9]+))(?![A-Za-z0-9_.])/],
+	    // assignment, operators, and parens, etc.
+	    [PR['PR_PUNCTUATION'], /^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\*|\+|\^|\/|!|%.*?%|=|~|\$|@|:{1,3}|[\[\](){};,?])/],
+	    // valid variable names
+	    [PR['PR_PLAIN'], /^(?:[A-Za-z]+[A-Za-z0-9_.]*|\.[a-zA-Z_][0-9a-zA-Z\._]*)(?![A-Za-z0-9_.])/],
+	    // string backtick
+	    [PR['PR_STRING'], /^`.+`/]
+        ]),
+    ['r', 's', 'R', 'S', 'Splus']);
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-tex.js b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-tex.js
new file mode 100644
index 0000000..ce96fbb
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-tex.js
@@ -0,0 +1 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r �\xa0"],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]);
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-yaml.js b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-yaml.js
new file mode 100644
index 0000000..c38729b
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/lang-yaml.js
@@ -0,0 +1,2 @@
+var a=null;
+PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \t\r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]);
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/prettify.css b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/prettify.css
new file mode 100644
index 0000000..d44b3a2
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding [...]
\ No newline at end of file
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/prettify.js b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/prettify.js
new file mode 100644
index 0000000..eef5ad7
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/prettify/prettify.js
@@ -0,0 +1,28 @@
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\ [...]
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a) [...]
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\ [...]
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l= [...]
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+ [...]
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0 [...]
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){fo [...]
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s [...]
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com [...]
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]) [...]
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("B [...]
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f. [...]
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0] [...]
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}funct [...]
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.n [...]
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,uni [...]
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,thro [...]
+H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield [...]
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,pac [...]
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z] [...]
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+ [...]
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuote [...]
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,i [...]
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g), [...]
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.l [...]
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_ [...]
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/require-1.0.8.min.js b/inst/rmd/ioslides/ioslides-13.5.1/js/require-1.0.8.min.js
new file mode 100644
index 0000000..162cd9a
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/require-1.0.8.min.js
@@ -0,0 +1,33 @@
+/*
+ RequireJS 1.0.8 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+var requirejs,require,define;
+(function(r){function K(a){return O.call(a)==="[object Function]"}function G(a){return O.call(a)==="[object Array]"}function $(a,c,l){for(var j in c)if(!(j in L)&&(!(j in a)||l))a[j]=c[j];return d}function P(a,c,d){a=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+a);if(d)a.originalError=d;return a}function aa(a,c,d){var j,k,t;for(j=0;t=c[j];j++){t=typeof t==="string"?{name:t}:t;k=t.location;if(d&&(!k||k.indexOf("/")!==0&&k.indexOf(":")===-1))k=d+"/"+(k||t.name);a[t.name]={name:t.name [...]
+t.name,main:(t.main||"main").replace(fa,"").replace(ba,"")}}}function V(a,c){a.holdReady?a.holdReady(c):c?a.readyWait+=1:a.ready(!0)}function ga(a){function c(b,f){var g,m;if(b&&b.charAt(0)===".")if(f){q.pkgs[f]?f=[f]:(f=f.split("/"),f=f.slice(0,f.length-1));g=b=f.concat(b.split("/"));var a;for(m=0;a=g[m];m++)if(a===".")g.splice(m,1),m-=1;else if(a==="..")if(m===1&&(g[2]===".."||g[0]===".."))break;else m>0&&(g.splice(m-1,2),m-=2);m=q.pkgs[g=b[0]];b=b.join("/");m&&b===g+"/"+m.main&&(b=g)} [...]
+0&&(b=b.substring(2));return b}function l(b,f){var g=b?b.indexOf("!"):-1,m=null,a=f?f.name:null,h=b,e,d;g!==-1&&(m=b.substring(0,g),b=b.substring(g+1,b.length));m&&(m=c(m,a));b&&(m?e=(g=n[m])&&g.normalize?g.normalize(b,function(b){return c(b,a)}):c(b,a):(e=c(b,a),d=G[e],d||(d=i.nameToUrl(b,null,f),G[e]=d)));return{prefix:m,name:e,parentMap:f,url:d,originalName:h,fullName:m?m+"!"+(e||""):e}}function j(){var b=!0,f=q.priorityWait,g,a;if(f){for(a=0;g=f[a];a++)if(!s[g]){b=!1;break}b&&delete  [...]
+function k(b,f,g){return function(){var a=ha.call(arguments,0),c;if(g&&K(c=a[a.length-1]))c.__requireJsBuild=!0;a.push(f);return b.apply(null,a)}}function t(b,f,g){f=k(g||i.require,b,f);$(f,{nameToUrl:k(i.nameToUrl,b),toUrl:k(i.toUrl,b),defined:k(i.requireDefined,b),specified:k(i.requireSpecified,b),isBrowser:d.isBrowser});return f}function p(b){var f,g,a,c=b.callback,h=b.map,e=h.fullName,ca=b.deps;a=b.listeners;var j=q.requireExecCb||d.execCb;if(c&&K(c)){if(q.catchError.define)try{g=j(e [...]
+ca,n[e])}catch(k){f=k}else g=j(e,b.callback,ca,n[e]);if(e)(c=b.cjsModule)&&c.exports!==r&&c.exports!==n[e]?g=n[e]=b.cjsModule.exports:g===r&&b.usingExports?g=n[e]:(n[e]=g,H[e]&&(T[e]=!0))}else e&&(g=n[e]=c,H[e]&&(T[e]=!0));if(x[b.id])delete x[b.id],b.isDone=!0,i.waitCount-=1,i.waitCount===0&&(J=[]);delete M[e];if(d.onResourceLoad&&!b.placeholder)d.onResourceLoad(i,h,b.depArray);if(f)return g=(e?l(e).url:"")||f.fileName||f.sourceURL,a=f.moduleTree,f=P("defineerror",'Error evaluating modul [...]
+g+'":\n'+f+"\nfileName:"+g+"\nlineNumber: "+(f.lineNumber||f.line),f),f.moduleName=e,f.moduleTree=a,d.onError(f);for(f=0;c=a[f];f++)c(g);return r}function u(b,f){return function(g){b.depDone[f]||(b.depDone[f]=!0,b.deps[f]=g,b.depCount-=1,b.depCount||p(b))}}function o(b,f){var g=f.map,a=g.fullName,c=g.name,h=N[b]||(N[b]=n[b]),e;if(!f.loading)f.loading=!0,e=function(b){f.callback=function(){return b};p(f);s[f.id]=!0;A()},e.fromText=function(b,f){var g=Q;s[b]=!1;i.scriptCount+=1;i.fake[b]=! [...]
+d.exec(f);g&&(Q=!0);i.completeLoad(b)},a in n?e(n[a]):h.load(c,t(g.parentMap,!0,function(b,a){var c=[],e,m;for(e=0;m=b[e];e++)m=l(m,g.parentMap),b[e]=m.fullName,m.prefix||c.push(b[e]);f.moduleDeps=(f.moduleDeps||[]).concat(c);return i.require(b,a)}),e,q)}function y(b){x[b.id]||(x[b.id]=b,J.push(b),i.waitCount+=1)}function D(b){this.listeners.push(b)}function v(b,f){var g=b.fullName,a=b.prefix,c=a?N[a]||(N[a]=n[a]):null,h,e;g&&(h=M[g]);if(!h&&(e=!0,h={id:(a&&!c?O++ +"__p@:":"")+(g||"__r@" [...]
+depCount:0,depDone:[],depCallbacks:[],deps:[],listeners:[],add:D},B[h.id]=!0,g&&(!a||N[a])))M[g]=h;a&&!c?(g=l(a),a in n&&!n[a]&&(delete n[a],delete R[g.url]),a=v(g,!0),a.add(function(){var f=l(b.originalName,b.parentMap),f=v(f,!0);h.placeholder=!0;f.add(function(b){h.callback=function(){return b};p(h)})})):e&&f&&(s[h.id]=!1,i.paused.push(h),y(h));return h}function C(b,f,a,c){var b=l(b,c),d=b.name,h=b.fullName,e=v(b),j=e.id,k=e.deps,o;if(h){if(h in n||s[j]===!0||h==="jquery"&&q.jQuery&&q. [...]
+a().fn.jquery)return;B[j]=!0;s[j]=!0;h==="jquery"&&a&&W(a())}e.depArray=f;e.callback=a;for(a=0;a<f.length;a++)if(j=f[a])j=l(j,d?b:c),o=j.fullName,f[a]=o,o==="require"?k[a]=t(b):o==="exports"?(k[a]=n[h]={},e.usingExports=!0):o==="module"?e.cjsModule=k[a]={id:d,uri:d?i.nameToUrl(d,null,c):r,exports:n[h]}:o in n&&!(o in x)&&(!(h in H)||h in H&&T[o])?k[a]=n[o]:(h in H&&(H[o]=!0,delete n[o],R[j.url]=!1),e.depCount+=1,e.depCallbacks[a]=u(e,a),v(j,!0).add(e.depCallbacks[a]));e.depCount?y(e):p(e [...]
+b)}function F(b,f){var a=b.map.fullName,c=b.depArray,d=!0,h,e,i,l;if(b.isDone||!a||!s[a])return l;if(f[a])return b;f[a]=!0;if(c){for(h=0;h<c.length;h++){e=c[h];if(!s[e]&&!ia[e]){d=!1;break}if((i=x[e])&&!i.isDone&&s[e])if(l=F(i,f))break}d||(l=r,delete f[a])}return l}function z(b,a){var g=b.map.fullName,c=b.depArray,d,h,e,i;if(b.isDone||!g||!s[g])return r;if(g){if(a[g])return n[g];a[g]=!0}if(c)for(d=0;d<c.length;d++)if(h=c[d])if((e=l(h).prefix)&&(i=x[e])&&z(i,a),(e=x[h])&&!e.isDone&&s[h])h [...]
+return n[g]}function E(){var b=q.waitSeconds*1E3,b=b&&i.startTime+b<(new Date).getTime(),a="",c=!1,l=!1,k=[],h,e;if(i.pausedCount>0)return r;if(q.priorityWait)if(j())A();else return r;for(h in s)if(!(h in L)&&(c=!0,!s[h]))if(b)a+=h+" ";else if(l=!0,h.indexOf("!")===-1){k=[];break}else(e=M[h]&&M[h].moduleDeps)&&k.push.apply(k,e);if(!c&&!i.waitCount)return r;if(b&&a)return b=P("timeout","Load timeout for modules: "+a),b.requireType="timeout",b.requireModules=a,b.contextName=i.contextName,d [...]
+if(l&&k.length)for(a=0;h=x[k[a]];a++)if(h=F(h,{})){z(h,{});break}if(!b&&(l||i.scriptCount)){if((I||da)&&!X)X=setTimeout(function(){X=0;E()},50);return r}if(i.waitCount){for(a=0;h=J[a];a++)z(h,{});i.paused.length&&A();Y<5&&(Y+=1,E())}Y=0;d.checkReadyState();return r}var i,A,q={waitSeconds:7,baseUrl:"./",paths:{},pkgs:{},catchError:{}},S=[],B={require:!0,exports:!0,module:!0},G={},n={},s={},x={},J=[],R={},O=0,M={},N={},H={},T={},Z=0;W=function(b){if(!i.jQuery&&(b=b||(typeof jQuery!=="undef [...]
+null))&&!(q.jQuery&&b.fn.jquery!==q.jQuery)&&("holdReady"in b||"readyWait"in b))if(i.jQuery=b,w(["jquery",[],function(){return jQuery}]),i.scriptCount)V(b,!0),i.jQueryIncremented=!0};A=function(){var b,a,c,l,k,h;i.takeGlobalQueue();Z+=1;if(i.scriptCount<=0)i.scriptCount=0;for(;S.length;)if(b=S.shift(),b[0]===null)return d.onError(P("mismatch","Mismatched anonymous define() module: "+b[b.length-1]));else w(b);if(!q.priorityWait||j())for(;i.paused.length;){k=i.paused;i.pausedCount+=k.lengt [...]
+[];for(l=0;b=k[l];l++)a=b.map,c=a.url,h=a.fullName,a.prefix?o(a.prefix,b):!R[c]&&!s[h]&&((q.requireLoad||d.load)(i,h,c),c.indexOf("empty:")!==0&&(R[c]=!0));i.startTime=(new Date).getTime();i.pausedCount-=k.length}Z===1&&E();Z-=1;return r};i={contextName:a,config:q,defQueue:S,waiting:x,waitCount:0,specified:B,loaded:s,urlMap:G,urlFetched:R,scriptCount:0,defined:n,paused:[],pausedCount:0,plugins:N,needFullExec:H,fake:{},fullExec:T,managerCallbacks:M,makeModuleMap:l,normalize:c,configure:fu [...]
+c,d;b.baseUrl&&b.baseUrl.charAt(b.baseUrl.length-1)!=="/"&&(b.baseUrl+="/");a=q.paths;d=q.pkgs;$(q,b,!0);if(b.paths){for(c in b.paths)c in L||(a[c]=b.paths[c]);q.paths=a}if((a=b.packagePaths)||b.packages){if(a)for(c in a)c in L||aa(d,a[c],c);b.packages&&aa(d,b.packages);q.pkgs=d}if(b.priority)c=i.requireWait,i.requireWait=!1,A(),i.require(b.priority),A(),i.requireWait=c,q.priorityWait=b.priority;if(b.deps||b.callback)i.require(b.deps||[],b.callback)},requireDefined:function(b,a){return l [...]
+n},requireSpecified:function(b,a){return l(b,a).fullName in B},require:function(b,c,g){if(typeof b==="string"){if(K(c))return d.onError(P("requireargs","Invalid require call"));if(d.get)return d.get(i,b,c);c=l(b,c);b=c.fullName;return!(b in n)?d.onError(P("notloaded","Module name '"+c.fullName+"' has not been loaded yet for context: "+a)):n[b]}(b&&b.length||c)&&C(null,b,c,g);if(!i.requireWait)for(;!i.scriptCount&&i.paused.length;)A();return i.require},takeGlobalQueue:function(){U.length& [...]
+[i.defQueue.length-1,0].concat(U)),U=[])},completeLoad:function(b){var a;for(i.takeGlobalQueue();S.length;)if(a=S.shift(),a[0]===null){a[0]=b;break}else if(a[0]===b)break;else w(a),a=null;a?w(a):w([b,[],b==="jquery"&&typeof jQuery!=="undefined"?function(){return jQuery}:null]);d.isAsync&&(i.scriptCount-=1);A();d.isAsync||(i.scriptCount-=1)},toUrl:function(b,a){var c=b.lastIndexOf("."),d=null;c!==-1&&(d=b.substring(c,b.length),b=b.substring(0,c));return i.nameToUrl(b,d,a)},nameToUrl:funct [...]
+k,h,e,j=i.config,b=c(b,g&&g.fullName);if(d.jsExtRegExp.test(b))a=b+(a?a:"");else{l=j.paths;k=j.pkgs;g=b.split("/");for(e=g.length;e>0;e--)if(h=g.slice(0,e).join("/"),l[h]){g.splice(0,e,l[h]);break}else if(h=k[h]){b=b===h.name?h.location+"/"+h.main:h.location;g.splice(0,e,b);break}a=g.join("/")+(a||".js");a=(a.charAt(0)==="/"||a.match(/^[\w\+\.\-]+:/)?"":j.baseUrl)+a}return j.urlArgs?a+((a.indexOf("?")===-1?"?":"&")+j.urlArgs):a}};i.jQueryCheck=W;i.resume=A;return i}function ka(){var a,c, [...]
+"interactive")return C;a=document.getElementsByTagName("script");for(c=a.length-1;c>-1&&(d=a[c]);c--)if(d.readyState==="interactive")return C=d;return null}var la=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ma=/require\(\s*["']([^'"\s]+)["']\s*\)/g,fa=/^\.\//,ba=/\.js$/,O=Object.prototype.toString,u=Array.prototype,ha=u.slice,ja=u.splice,I=!!(typeof window!=="undefined"&&navigator&&document),da=!I&&typeof importScripts!=="undefined",na=I&&navigator.platform==="PLAYSTATION 3"?/^complete$/: [...]
+ea=typeof opera!=="undefined"&&opera.toString()==="[object Opera]",L={},D={},U=[],C=null,Y=0,Q=!1,ia={require:!0,module:!0,exports:!0},d,u={},J,y,v,E,o,w,F,B,z,W,X;if(typeof define==="undefined"){if(typeof requirejs!=="undefined")if(K(requirejs))return;else u=requirejs,requirejs=r;typeof require!=="undefined"&&!K(require)&&(u=require,require=r);d=requirejs=function(a,c,d){var j="_",k;!G(a)&&typeof a!=="string"&&(k=a,G(c)?(a=c,c=d):a=[]);if(k&&k.context)j=k.context;d=D[j]||(D[j]=ga(j));k& [...]
+return d.require(a,c)};d.config=function(a){return d(a)};require||(require=d);d.toUrl=function(a){return D._.toUrl(a)};d.version="1.0.8";d.jsExtRegExp=/^\/|:|\?|\.js$/;y=d.s={contexts:D,skipAsync:{}};if(d.isAsync=d.isBrowser=I)if(v=y.head=document.getElementsByTagName("head")[0],E=document.getElementsByTagName("base")[0])v=y.head=E.parentNode;d.onError=function(a){throw a;};d.load=function(a,c,l){d.resourcesReady(!1);a.scriptCount+=1;d.attach(l,a,c);if(a.jQuery&&!a.jQueryIncremented)V(a. [...]
+a.jQueryIncremented=!0};define=function(a,c,d){var j,k;typeof a!=="string"&&(d=c,c=a,a=null);G(c)||(d=c,c=[]);!c.length&&K(d)&&d.length&&(d.toString().replace(la,"").replace(ma,function(a,d){c.push(d)}),c=(d.length===1?["require"]:["require","exports","module"]).concat(c));if(Q&&(j=J||ka()))a||(a=j.getAttribute("data-requiremodule")),k=D[j.getAttribute("data-requirecontext")];(k?k.defQueue:U).push([a,c,d]);return r};define.amd={multiversion:!0,plugins:!0,jQuery:!0};d.exec=function(a){ret [...]
+d.execCb=function(a,c,d,j){return c.apply(j,d)};d.addScriptToDom=function(a){J=a;E?v.insertBefore(a,E):v.appendChild(a);J=null};d.onScriptLoad=function(a){var c=a.currentTarget||a.srcElement,l;if(a.type==="load"||c&&na.test(c.readyState))C=null,a=c.getAttribute("data-requirecontext"),l=c.getAttribute("data-requiremodule"),D[a].completeLoad(l),c.detachEvent&&!ea?c.detachEvent("onreadystatechange",d.onScriptLoad):c.removeEventListener("load",d.onScriptLoad,!1)};d.attach=function(a,c,l,j,k, [...]
+if(I)return j=j||d.onScriptLoad,p=c&&c.config&&c.config.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script"),p.type=k||c&&c.config.scriptType||"text/javascript",p.charset="utf-8",p.async=!y.skipAsync[a],c&&p.setAttribute("data-requirecontext",c.contextName),p.setAttribute("data-requiremodule",l),p.attachEvent&&!(p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code]")<0)&&!ea?(Q=!0,o?p.onreadystatechange=function() [...]
+"loaded")p.onreadystatechange=null,p.attachEvent("onreadystatechange",j),o(p)}:p.attachEvent("onreadystatechange",j)):p.addEventListener("load",j,!1),p.src=a,o||d.addScriptToDom(p),p;else da&&(importScripts(a),c.completeLoad(l));return null};if(I){o=document.getElementsByTagName("script");for(B=o.length-1;B>-1&&(w=o[B]);B--){if(!v)v=w.parentNode;if(F=w.getAttribute("data-main")){if(!u.baseUrl)o=F.split("/"),w=o.pop(),o=o.length?o.join("/")+"/":"./",u.baseUrl=o,F=w.replace(ba,"");u.deps=u [...]
+[F];break}}}d.checkReadyState=function(){var a=y.contexts,c;for(c in a)if(!(c in L)&&a[c].waitCount)return;d.resourcesReady(!0)};d.resourcesReady=function(a){var c,l;d.resourcesDone=a;if(d.resourcesDone)for(l in a=y.contexts,a)if(!(l in L)&&(c=a[l],c.jQueryIncremented))V(c.jQuery,!1),c.jQueryIncremented=!1};d.pageLoaded=function(){if(document.readyState!=="complete")document.readyState="complete"};if(I&&document.addEventListener&&!document.readyState)document.readyState="loading",window. [...]
+d.pageLoaded,!1);d(u);if(d.isAsync&&typeof setTimeout!=="undefined")z=y.contexts[u.context||"_"],z.requireWait=!0,setTimeout(function(){z.requireWait=!1;z.scriptCount||z.resume();d.checkReadyState()},0)}})();
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/slide-controller.js b/inst/rmd/ioslides/ioslides-13.5.1/js/slide-controller.js
new file mode 100644
index 0000000..8b727ae
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/slide-controller.js
@@ -0,0 +1,122 @@
+(function(window) {
+
+var ORIGIN_ = location.protocol + '//' + location.host;
+
+// check for local storage
+var haveLocalStorage = (function() {
+  var mod = 'mod';
+  try {
+    localStorage.setItem(mod, mod);
+    localStorage.removeItem(mod);
+    return true;
+  } catch(e) {
+    return false;
+  }
+}());
+
+function SlideController() {
+  this.popup = null;
+  this.isPopup = window.opener;
+
+  if (this.setupDone()) {
+    window.addEventListener('message', this.onMessage_.bind(this), false);
+
+    // Close popups if we reload the main window.
+    window.addEventListener('beforeunload', function(e) {
+      if (this.popup) {
+        this.popup.close();
+      }
+    }.bind(this), false);
+  }
+}
+
+SlideController.PRESENTER_MODE_PARAM = 'presentme';
+
+SlideController.prototype.setupDone = function() {
+  var params = location.search.substring(1).split('&').map(function(el) {
+    return el.split('=');
+  });
+
+  var presentMe = null;
+  for (var i = 0, param; param = params[i]; ++i) {
+    if (param[0].toLowerCase() == SlideController.PRESENTER_MODE_PARAM) {
+      presentMe = param[1] == 'true';
+      break;
+    }
+  }
+
+  if (presentMe !== null) {
+    if (haveLocalStorage)
+      localStorage.ENABLE_PRESENTOR_MODE = presentMe;
+    // TODO: use window.history.pushState to update URL instead of the redirect.
+    if (window.history.replaceState) {
+      window.history.replaceState({}, '', location.pathname);
+    } else {
+      location.replace(location.pathname);
+      return false;
+    }
+  }
+
+  var enablePresenterMode = haveLocalStorage && localStorage.getItem('ENABLE_PRESENTOR_MODE');
+  if (enablePresenterMode && JSON.parse(enablePresenterMode)) {
+    // Only open popup from main deck. Don't want recursive popup opening!
+    if (!this.isPopup) {
+      var opts = 'menubar=no,location=yes,resizable=yes,scrollbars=no,status=no';
+      this.popup = window.open(location.href, 'mywindow', opts);
+
+      // Loading in the popup? Trigger the hotkey for turning presenter mode on.
+      this.popup.addEventListener('load', function(e) {
+        var evt = this.popup.document.createEvent('Event');
+        evt.initEvent('keydown', true, true);
+        evt.keyCode = 'P'.charCodeAt(0);
+        this.popup.document.dispatchEvent(evt);
+        // this.popup.document.body.classList.add('with-notes');
+        // document.body.classList.add('popup');
+      }.bind(this), false);
+    }
+  }
+
+  return true;
+}
+
+SlideController.prototype.onMessage_ = function(e) {
+  var data = e.data;
+
+  // Restrict messages to being from this origin. Allow local developmet
+  // from file:// though.
+  // TODO: It would be dope if FF implemented location.origin!
+  if (e.origin != ORIGIN_ && ORIGIN_.indexOf('file://') != 0) {
+    // Ignore messages from unrecognized origins
+    return;
+  }
+
+  // if (e.source.location.hostname != 'localhost') {
+  //   alert('Someone tried to postMessage from an unknown origin');
+  //   return;
+  // }
+
+  if ('keyCode' in data) {
+    var evt = document.createEvent('Event');
+    evt.initEvent('keydown', true, true);
+    evt.keyCode = data.keyCode;
+    document.dispatchEvent(evt);
+  }
+};
+
+SlideController.prototype.sendMsg = function(msg) {
+  // // Send message to popup window.
+  // if (this.popup) {
+  //   this.popup.postMessage(msg, ORIGIN_);
+  // }
+
+  // Send message to main window.
+  if (this.isPopup) {
+    // TODO: It would be dope if FF implemented location.origin.
+    window.opener.postMessage(msg, '*');
+  }
+};
+
+window.SlideController = SlideController;
+
+})(window);
+
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/js/slide-deck.js b/inst/rmd/ioslides/ioslides-13.5.1/js/slide-deck.js
new file mode 100644
index 0000000..ab0ec3e
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/js/slide-deck.js
@@ -0,0 +1,809 @@
+/**
+ * @authors Luke Mahe
+ * @authors Eric Bidelman
+ * @fileoverview TODO
+ */
+document.cancelFullScreen = document.webkitCancelFullScreen ||
+                            document.mozCancelFullScreen;
+
+/**
+ * @constructor
+ */
+function SlideDeck(el) {
+  this.curSlide_ = 0;
+  this.prevSlide_ = 0;
+  this.config_ = null;
+  this.container = el || document.querySelector('slides');
+  this.slides = [];
+  this.controller = null;
+
+  this.getCurrentSlideFromHash_();
+
+  // Call this explicitly. Modernizr.load won't be done until after DOM load.
+  this.onDomLoaded_.bind(this)();
+}
+
+/**
+ * @const
+ * @private
+ */
+SlideDeck.prototype.SLIDE_CLASSES_ = [
+  'far-past', 'past', 'current', 'next', 'far-next'];
+
+/**
+ * @const
+ * @private
+ */
+SlideDeck.prototype.CSS_DIR_ = 'theme/css/';
+
+/**
+ * @private
+ */
+SlideDeck.prototype.getCurrentSlideFromHash_ = function() {
+  var slideNo = parseInt(document.location.hash.substr(1));
+
+  if (slideNo) {
+    this.curSlide_ = slideNo - 1;
+  } else {
+    this.curSlide_ = 0;
+  }
+};
+
+/**
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.loadSlide = function(slideNo) {
+  if (slideNo) {
+    this.curSlide_ = slideNo - 1;
+    this.updateSlides_();
+  }
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.onDomLoaded_ = function(e) {
+  document.body.classList.add('loaded'); // Add loaded class for templates to use.
+
+  this.slides = this.container.querySelectorAll('slide:not([hidden]):not(.hidden):not(.backdrop)');
+
+  // If we're on a smartphone, apply special sauce.
+  if (Modernizr.mq('only screen and (max-device-width: 480px)')) {
+    // var style = document.createElement('link');
+    // style.rel = 'stylesheet';
+    // style.type = 'text/css';
+    // style.href = this.CSS_DIR_ + 'phone.css';
+    // document.querySelector('head').appendChild(style);
+
+    // No need for widescreen layout on a phone.
+    this.container.classList.remove('layout-widescreen');
+  }
+
+  this.loadConfig_(SLIDE_CONFIG);
+  this.addEventListeners_();
+  this.updateSlides_();
+
+  // Add slide numbers and total slide count metadata to each slide.
+  var that = this;
+  for (var i = 0, slide; slide = this.slides[i]; ++i) {
+    slide.dataset.slideNum = i + 1;
+    slide.dataset.totalSlides = this.slides.length;
+
+    slide.addEventListener('click', function(e) {
+      if (document.body.classList.contains('overview')) {
+        that.loadSlide(this.dataset.slideNum);
+        e.preventDefault();
+        window.setTimeout(function() {
+          that.toggleOverview();
+        }, 500);
+      }
+    }, false);
+  }
+
+  // Note: this needs to come after addEventListeners_(), which adds a
+  // 'keydown' listener that this controller relies on.
+
+  // Modernizr.touch isn't a sufficient check for devices that support both
+  // touch and mouse. Create the controller in all cases.
+  // // Also, no need to set this up if we're on mobile.
+  // if (!Modernizr.touch) {
+    this.controller = new SlideController(this);
+    if (this.controller.isPopup) {
+      document.body.classList.add('popup');
+    }
+  //}
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.addEventListeners_ = function() {
+  document.addEventListener('keydown', this.onBodyKeyDown_.bind(this), true);
+  window.addEventListener('popstate', this.onPopState_.bind(this), false);
+
+  // var transEndEventNames = {
+  //   'WebkitTransition': 'webkitTransitionEnd',
+  //   'MozTransition': 'transitionend',
+  //   'OTransition': 'oTransitionEnd',
+  //   'msTransition': 'MSTransitionEnd',
+  //   'transition': 'transitionend'
+  // };
+  //
+  // // Find the correct transitionEnd vendor prefix.
+  // window.transEndEventName = transEndEventNames[
+  //     Modernizr.prefixed('transition')];
+  //
+  // // When slides are done transitioning, kickoff loading iframes.
+  // // Note: we're only looking at a single transition (on the slide). This
+  // // doesn't include autobuilds the slides may have. Also, if the slide
+  // // transitions on multiple properties (e.g. not just 'all'), this doesn't
+  // // handle that case.
+  // this.container.addEventListener(transEndEventName, function(e) {
+  //     this.enableSlideFrames_(this.curSlide_);
+  // }.bind(this), false);
+
+  // document.addEventListener('slideenter', function(e) {
+  //   var slide = e.target;
+  //   window.setTimeout(function() {
+  //     this.enableSlideFrames_(e.slideNumber);
+  //     this.enableSlideFrames_(e.slideNumber + 1);
+  //   }.bind(this), 300);
+  // }.bind(this), false);
+};
+
+/**
+ * @private
+ * @param {Event} e The pop event.
+ */
+SlideDeck.prototype.onPopState_ = function(e) {
+  if (e.state != null) {
+    this.curSlide_ = e.state;
+    this.updateSlides_(true);
+  }
+};
+
+/**
+ * @param {Event} e
+ */
+SlideDeck.prototype.onBodyKeyDown_ = function(e) {
+
+  // Don't handle keys if an input or text area is active. Do special handling
+  // for selectize because it keeps focus within an offscreen textbox even
+  // when just the select control is showing -- for selectize we refrain from
+  // handling keys only when the text input is active or when the up or down
+  // arrow key is pressed (which is used to open the list from the keyboard)
+  var parentNode = e.target.parentNode || e.target; // handle no parent
+  if (parentNode.classList && parentNode.classList.contains('selectize-input')) {
+    if (parentNode.classList.contains('input-active') ||  // text input is active
+       (e.keyCode == 38) || (e.keyCode == 40))            // up or down arrow
+      return;
+  } else if (/^(input|textarea)$/i.test(e.target.nodeName) ||
+      e.target.isContentEditable) {
+    return;
+  }
+
+  // Forward keydowns to the main slides if we're the popup.
+  if (this.controller && this.controller.isPopup) {
+    this.controller.sendMsg({keyCode: e.keyCode});
+  }
+
+  switch (e.keyCode) {
+    case 13: // Enter
+      if (document.body.classList.contains('overview')) {
+        this.toggleOverview();
+      }
+      break;
+
+    case 39: // right arrow
+    case 32: // space
+    case 34: // PgDn
+      this.nextSlide();
+      e.preventDefault();
+      break;
+
+    case 37: // left arrow
+    case 8: // Backspace
+    case 33: // PgUp
+      this.prevSlide();
+      e.preventDefault();
+      break;
+
+    case 40: // down arrow
+      this.nextSlide();
+      e.preventDefault();
+      break;
+
+    case 38: // up arrow
+      this.prevSlide();
+      e.preventDefault();
+      break;
+
+    case 72: // H: Toggle code highlighting
+      document.body.classList.toggle('highlight-code');
+      break;
+
+    case 79: // O: Toggle overview
+      this.toggleOverview();
+      break;
+
+    case 80: // P
+      if (this.controller && this.controller.isPopup) {
+        document.body.classList.toggle('with-notes');
+      } else if (this.controller && !this.controller.popup) {
+        document.body.classList.toggle('with-notes');
+      }
+      break;
+
+    case 82: // R
+      // TODO: implement refresh on main slides when popup is refreshed.
+      break;
+
+    case 27: // ESC: Hide notes and highlighting
+      document.body.classList.remove('with-notes');
+      document.body.classList.remove('highlight-code');
+
+      if (document.body.classList.contains('overview')) {
+        this.toggleOverview();
+      }
+      break;
+
+    case 70: // F: Toggle fullscreen
+       // Only respect 'f' on body. Don't want to capture keys from an <input>.
+       // Also, ignore browser's fullscreen shortcut (cmd+shift+f) so we don't
+       // get trapped in fullscreen!
+      if (document.cancelFullScreen !== undefined && e.target == document.body && !(e.shiftKey && e.metaKey)) {
+        if (document.mozFullScreen !== undefined && !document.mozFullScreen) {
+          document.body.mozRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
+        } else if (document.webkitIsFullScreen !== undefined && !document.webkitIsFullScreen) {
+          document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
+        } else {
+          document.cancelFullScreen();
+        }
+      }
+      break;
+
+    case 87: // W: Toggle widescreen
+      // Only respect 'w' on body. Don't want to capture keys from an <input>.
+      if (e.target == document.body && !(e.shiftKey && e.metaKey)) {
+        this.container.classList.toggle('layout-widescreen');
+      }
+      break;
+  }
+};
+
+/**
+ *
+ */
+SlideDeck.prototype.focusOverview_ = function() {
+  var overview = document.body.classList.contains('overview');
+
+  for (var i = 0, slide; slide = this.slides[i]; i++) {
+    slide.style[Modernizr.prefixed('transform')] = overview ?
+        'translateZ(-2500px) translate(' + (( i - this.curSlide_ ) * 105) +
+                                       '%, 0%)' : '';
+  }
+};
+
+/**
+ */
+SlideDeck.prototype.toggleOverview = function() {
+  document.body.classList.toggle('overview');
+
+  this.focusOverview_();
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.loadConfig_ = function(config) {
+  if (!config) {
+    return;
+  }
+
+  this.config_ = config;
+
+  var settings = this.config_.settings;
+
+  this.loadTheme_(settings.theme || []);
+
+  if (settings.favIcon) {
+    this.addFavIcon_(settings.favIcon);
+  }
+
+  // Prettyprint. Default to on.
+  if (!!!('usePrettify' in settings) || settings.usePrettify) {
+    prettyPrint();
+  }
+
+  if (settings.analytics) {
+    this.loadAnalytics_();
+  }
+
+  if (settings.fonts) {
+    this.addFonts_(settings.fonts);
+  }
+
+  // Builds. Default to on.
+  if (!!!('useBuilds' in settings) || settings.useBuilds) {
+    this.makeBuildLists_();
+  }
+
+  if (settings.title) {
+    document.title = settings.title.replace(/<br\/?>/, ' ');
+    if (settings.eventInfo && settings.eventInfo.title) {
+      document.title +=  ' - ' + settings.eventInfo.title;
+    }
+    document.querySelector('[data-config-title]').innerHTML = settings.title;
+  }
+
+  if (settings.subtitle) {
+    document.querySelector('[data-config-subtitle]').innerHTML = settings.subtitle;
+  }
+
+  if (this.config_.presenters) {
+    var presenters = this.config_.presenters;
+    var dataConfigContact = document.querySelector('[data-config-contact]');
+
+    var html = [];
+    if (presenters.length == 1) {
+      var p = presenters[0];
+
+      var presenterTitle = [p.name];
+      if (p.company) {
+        presenterTitle.push(p.company);
+      }
+      html = presenterTitle.join(' - ') + '<br>';
+
+      var gplus = p.gplus ? '<span>g+</span><a href="' + p.gplus +
+          '">' + p.gplus.replace(/https?:\/\//, '') + '</a>' : '';
+
+      var twitter = p.twitter ? '<span>twitter</span>' +
+          '<a href="http://twitter.com/' + p.twitter + '">' +
+          p.twitter + '</a>' : '';
+
+      var www = p.www ? '<span>www</span><a href="' + p.www +
+                        '">' + p.www.replace(/https?:\/\//, '') + '</a>' : '';
+
+      var github = p.github ? '<span>github</span><a href="' + p.github +
+          '">' + p.github.replace(/https?:\/\//, '') + '</a>' : '';
+
+      var html2 = [gplus, twitter, www, github].join('<br>');
+
+      if (dataConfigContact) {
+        dataConfigContact.innerHTML = html2;
+      }
+    } else {
+      for (var i = 0, p; p = presenters[i]; ++i) {
+        html.push(p.name + ' - ' + p.company);
+      }
+      html = html.join('<br>');
+      if (dataConfigContact) {
+        dataConfigContact.innerHTML = html;
+      }
+    }
+
+    var dataConfigPresenter = document.querySelector('[data-config-presenter]');
+    if (dataConfigPresenter) {
+      dataConfigPresenter.innerHTML = html;
+      if (settings.eventInfo) {
+        var date = settings.eventInfo.date;
+        var dateInfo = date ? ' - <time>' + date + '</time>' : '';
+        dataConfigPresenter.innerHTML += settings.eventInfo.title + dateInfo;
+      }
+    }
+  }
+
+  /* Left/Right tap areas. Default to including. */
+  if (!!!('enableSlideAreas' in settings) || settings.enableSlideAreas) {
+    var el = document.createElement('div');
+    el.classList.add('slide-area');
+    el.id = 'prev-slide-area';
+    el.addEventListener('click', this.prevSlide.bind(this), false);
+    this.container.appendChild(el);
+
+    var el = document.createElement('div');
+    el.classList.add('slide-area');
+    el.id = 'next-slide-area';
+    el.addEventListener('click', this.nextSlide.bind(this), false);
+    this.container.appendChild(el);
+  }
+
+  if (Modernizr.touch && (!!!('enableTouch' in settings) ||
+      settings.enableTouch)) {
+    var self = this;
+
+    // Note: this prevents mobile zoom in/out but prevents iOS from doing
+    // it's crazy scroll over effect and disaligning the slides.
+    window.addEventListener('touchstart', function(e) {
+      e.preventDefault();
+    }, false);
+
+    var hammer = new Hammer(this.container);
+    hammer.ondragend = function(e) {
+      if (e.direction == 'right' || e.direction == 'down') {
+        self.prevSlide();
+      } else if (e.direction == 'left' || e.direction == 'up') {
+        self.nextSlide();
+      }
+    };
+  }
+};
+
+/**
+ * @private
+ * @param {Array.<string>} fonts
+ */
+SlideDeck.prototype.addFonts_ = function(fonts) {
+  var el = document.createElement('link');
+  el.rel = 'stylesheet';
+  el.href = ('https:' == document.location.protocol ? 'https' : 'http') +
+      '://fonts.googleapis.com/css?family=' + fonts.join('|') + '&v2';
+  document.querySelector('head').appendChild(el);
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.buildNextItem_ = function() {
+  var slide = this.slides[this.curSlide_];
+  var toBuild = slide.querySelector('.to-build');
+  var built = slide.querySelector('.build-current');
+
+  if (built) {
+    built.classList.remove('build-current');
+    if (built.classList.contains('fade')) {
+      built.classList.add('build-fade');
+    }
+  }
+
+  if (!toBuild) {
+    var items = slide.querySelectorAll('.build-fade');
+    for (var j = 0, item; item = items[j]; j++) {
+      item.classList.remove('build-fade');
+    }
+    return false;
+  }
+
+  toBuild.classList.remove('to-build');
+  toBuild.classList.add('build-current');
+
+  return true;
+};
+
+/**
+ * @param {boolean=} opt_dontPush
+ */
+SlideDeck.prototype.prevSlide = function(opt_dontPush) {
+  if (this.curSlide_ > 0) {
+    var bodyClassList = document.body.classList;
+    bodyClassList.remove('highlight-code');
+
+    // Toggle off speaker notes if they're showing when we move backwards on the
+    // main slides. If we're the speaker notes popup, leave them up.
+    if (this.controller && !this.controller.isPopup) {
+      bodyClassList.remove('with-notes');
+    } else if (!this.controller) {
+      bodyClassList.remove('with-notes');
+    }
+
+    this.prevSlide_ = this.curSlide_--;
+
+    this.updateSlides_(opt_dontPush);
+  }
+};
+
+/**
+ * @param {boolean=} opt_dontPush
+ */
+SlideDeck.prototype.nextSlide = function(opt_dontPush) {
+  if (!document.body.classList.contains('overview') && this.buildNextItem_()) {
+    return;
+  }
+
+  if (this.curSlide_ < this.slides.length - 1) {
+    var bodyClassList = document.body.classList;
+    bodyClassList.remove('highlight-code');
+
+    // Toggle off speaker notes if they're showing when we advanced on the main
+    // slides. If we're the speaker notes popup, leave them up.
+    if (this.controller && !this.controller.isPopup) {
+      bodyClassList.remove('with-notes');
+    } else if (!this.controller) {
+      bodyClassList.remove('with-notes');
+    }
+
+    this.prevSlide_ = this.curSlide_++;
+
+    this.updateSlides_(opt_dontPush);
+  }
+};
+
+/* Slide events */
+
+/**
+ * Triggered when a slide enter/leave event should be dispatched.
+ *
+ * @param {string} type The type of event to trigger
+ *     (e.g. 'slideenter', 'slideleave').
+ * @param {number} slideNo The index of the slide that is being left.
+ */
+SlideDeck.prototype.triggerSlideEvent = function(type, slideNo) {
+  var el = this.getSlideEl_(slideNo);
+  if (!el) {
+    return;
+  }
+
+  // Call onslideenter/onslideleave if the attribute is defined on this slide.
+  var func = el.getAttribute(type);
+  if (func) {
+    new Function(func).call(el); // TODO: Don't use new Function() :(
+  }
+
+  // Dispatch event to listeners setup using addEventListener.
+  var evt = document.createEvent('Event');
+  evt.initEvent(type, true, true);
+  evt.slideNumber = slideNo + 1; // Make it readable
+  evt.slide = el;
+
+  el.dispatchEvent(evt);
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.updateSlides_ = function(opt_dontPush) {
+  var dontPush = opt_dontPush || false;
+
+  var curSlide = this.curSlide_;
+  for (var i = 0; i < this.slides.length; ++i) {
+    switch (i) {
+      case curSlide - 2:
+        this.updateSlideClass_(i, 'far-past');
+        break;
+      case curSlide - 1:
+        this.updateSlideClass_(i, 'past');
+        break;
+      case curSlide:
+        this.updateSlideClass_(i, 'current');
+        break;
+      case curSlide + 1:
+        this.updateSlideClass_(i, 'next');
+        break;
+      case curSlide + 2:
+        this.updateSlideClass_(i, 'far-next');
+        break;
+      default:
+        this.updateSlideClass_(i);
+        break;
+    }
+  };
+
+  this.triggerSlideEvent('slideleave', this.prevSlide_);
+  this.triggerSlideEvent('slideenter', curSlide);
+
+// window.setTimeout(this.disableSlideFrames_.bind(this, curSlide - 2), 301);
+//
+// this.enableSlideFrames_(curSlide - 1); // Previous slide.
+// this.enableSlideFrames_(curSlide + 1); // Current slide.
+// this.enableSlideFrames_(curSlide + 2); // Next slide.
+
+   // Enable current slide's iframes (needed for page loat at current slide).
+   this.enableSlideFrames_(curSlide + 1);
+
+   // No way to tell when all slide transitions + auto builds are done.
+   // Give ourselves a good buffer to preload the next slide's iframes.
+   window.setTimeout(this.enableSlideFrames_.bind(this, curSlide + 2), 1000);
+
+  this.updateHash_(dontPush);
+
+  if (document.body.classList.contains('overview')) {
+    this.focusOverview_();
+    return;
+  }
+
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.enableSlideFrames_ = function(slideNo) {
+  var el = this.slides[slideNo - 1];
+  if (!el) {
+    return;
+  }
+
+  var frames = el.querySelectorAll('iframe');
+  for (var i = 0, frame; frame = frames[i]; i++) {
+    this.enableFrame_(frame);
+  }
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.enableFrame_ = function(frame) {
+  var src = frame.dataset.src;
+  if (src && frame.src != src) {
+    frame.src = src;
+  }
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.disableSlideFrames_ = function(slideNo) {
+  var el = this.slides[slideNo - 1];
+  if (!el) {
+    return;
+  }
+
+  var frames = el.querySelectorAll('iframe');
+  for (var i = 0, frame; frame = frames[i]; i++) {
+    this.disableFrame_(frame);
+  }
+};
+
+/**
+ * @private
+ * @param {Node} frame
+ */
+SlideDeck.prototype.disableFrame_ = function(frame) {
+  frame.src = 'about:blank';
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.getSlideEl_ = function(no) {
+  if ((no < 0) || (no >= this.slides.length)) {
+    return null;
+  } else {
+    return this.slides[no];
+  }
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ * @param {string} className
+ */
+SlideDeck.prototype.updateSlideClass_ = function(slideNo, className) {
+  var el = this.getSlideEl_(slideNo);
+
+  if (!el) {
+    return;
+  }
+
+  if (className) {
+    el.classList.add(className);
+  }
+
+  for (var i = 0, slideClass; slideClass = this.SLIDE_CLASSES_[i]; ++i) {
+    if (className != slideClass) {
+      el.classList.remove(slideClass);
+    }
+  }
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.makeBuildLists_ = function () {
+  for (var i = this.curSlide_, slide; slide = this.slides[i]; ++i) {
+    var items = slide.querySelectorAll('.build > *');
+    for (var j = 0, item; item = items[j]; ++j) {
+      if (item.classList) {
+        item.classList.add('to-build');
+        if (item.parentNode.classList.contains('fade')) {
+          item.classList.add('fade');
+        }
+      }
+    }
+  }
+};
+
+/**
+ * @private
+ * @param {boolean} dontPush
+ */
+SlideDeck.prototype.updateHash_ = function(dontPush) {
+  if (!dontPush) {
+    var slideNo = this.curSlide_ + 1;
+    // Add everything except the hash.
+    var loc = location.protocol+'//'+location.host+location.pathname+(location.search?location.search:"");
+    var hash = '#' + slideNo;
+    if (window.history.pushState && (location.protocol !== "file:")) {
+      window.history.pushState(this.curSlide_, 'Slide ' + slideNo, loc + hash);
+    } else {
+      window.location.replace(loc + hash);
+    }
+
+    // Record GA hit on this slide.
+    if(typeof window.ga === 'function') {
+      ga('set', 'page', hash)
+      ga('send', 'pageview');
+    }
+  }
+};
+
+
+/**
+ * @private
+ * @param {string} favIcon
+ */
+SlideDeck.prototype.addFavIcon_ = function(favIcon) {
+  var el = document.createElement('link');
+  el.rel = 'icon';
+  el.type = 'image/png';
+  el.href = favIcon;
+  document.querySelector('head').appendChild(el);
+};
+
+/**
+ * @private
+ * @param {string} theme
+ */
+SlideDeck.prototype.loadTheme_ = function(theme) {
+  var styles = [];
+  if (theme.constructor.name === 'String') {
+    styles.push(theme);
+  } else {
+    styles = theme;
+  }
+
+  for (var i = 0, style; themeUrl = styles[i]; i++) {
+    var style = document.createElement('link');
+    style.rel = 'stylesheet';
+    style.type = 'text/css';
+    if (themeUrl.indexOf('http') == -1) {
+      style.href = this.CSS_DIR_ + themeUrl + '.css';
+    } else {
+      style.href = themeUrl;
+    }
+    document.querySelector('head').appendChild(style);
+  }
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.loadAnalytics_ = function() {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+  ga('create', this.config_.settings.analytics, 'auto');
+  ga('send', 'pageview');
+};
+
+
+var loadDeck = function(event) {
+  // Polyfill missing APIs (if we need to), then create the slide deck.
+  // iOS < 5 needs classList, dataset, and window.matchMedia. Modernizr contains
+  // the last one.
+  Modernizr.load({
+    complete: function() {
+      window.slidedeck = new SlideDeck();
+    }
+  });
+};
+
+if (document.readyState !== "loading" &&
+    document.querySelector('slides') === null) { 
+  // if the document is done loading but our element hasn't yet appeared, defer
+  // loading of the deck
+  window.setTimeout(function() {
+    loadDeck(null);
+  }, 0);
+} else {
+  // still loading the DOM, so wait until it's finished
+  document.addEventListener("DOMContentLoaded", loadDeck);
+}
+
+
+
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/theme/css/default.css b/inst/rmd/ioslides/ioslides-13.5.1/theme/css/default.css
new file mode 100644
index 0000000..ba3fd5c
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/theme/css/default.css
@@ -0,0 +1,1514 @@
+ at charset "UTF-8";
+/* line 17, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font: inherit;
+  font-size: 100%;
+  vertical-align: baseline;
+}
+
+/* line 22, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+html {
+  line-height: 1.2;
+}
+
+/* line 24, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+ul {
+  list-style: none;
+}
+
+/* line 26, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+/* line 28, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+caption, th, td {
+  font-weight: normal;
+  vertical-align: middle;
+}
+
+/* line 30, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+q, blockquote {
+  quotes: none;
+}
+/* line 103, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+q:before, q:after, blockquote:before, blockquote:after {
+  content: "";
+  content: none;
+}
+
+/* line 32, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+a img {
+  border: none;
+}
+
+/* line 116, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary {
+  display: block;
+}
+
+/**
+ * Base SlideDeck Styles
+ */
+/* line 52, ../scss/_base.scss */
+html {
+  height: 100%;
+  overflow: hidden;
+}
+
+/* line 57, ../scss/_base.scss */
+body {
+  margin: 0;
+  padding: 0;
+  opacity: 0;
+  height: 100%;
+  min-height: 740px;
+  width: 100%;
+  overflow: hidden;
+  color: #fff;
+  -webkit-font-smoothing: antialiased;
+  -moz-font-smoothing: antialiased;
+  -ms-font-smoothing: antialiased;
+  -o-font-smoothing: antialiased;
+  -webkit-transition: opacity 250ms ease-in;
+  -webkit-transition-delay: 100ms;
+  -moz-transition: opacity 250ms ease-in 100ms;
+  -o-transition: opacity 250ms ease-in 100ms;
+  transition: opacity 250ms ease-in 100ms;
+}
+/* line 73, ../scss/_base.scss */
+body.loaded {
+  opacity: 1 !important;
+}
+
+/* line 78, ../scss/_base.scss */
+input, button {
+  vertical-align: middle;
+}
+
+/* line 82, ../scss/_base.scss */
+slides > slide[hidden] {
+  display: none !important;
+}
+
+/* line 86, ../scss/_base.scss */
+slides {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  left: 0;
+  top: 0;
+  -webkit-transform: translate3d(0, 0, 0);
+  -moz-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  -o-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-perspective: 1000;
+  -moz-perspective: 1000;
+  -ms-perspective: 1000;
+  -o-perspective: 1000;
+  perspective: 1000;
+  -webkit-transform-style: preserve-3d;
+  -moz-transform-style: preserve-3d;
+  -ms-transform-style: preserve-3d;
+  -o-transform-style: preserve-3d;
+  transform-style: preserve-3d;
+  -webkit-transition: opacity 250ms ease-in;
+  -webkit-transition-delay: 100ms;
+  -moz-transition: opacity 250ms ease-in 100ms;
+  -o-transition: opacity 250ms ease-in 100ms;
+  transition: opacity 250ms ease-in 100ms;
+}
+
+/* line 98, ../scss/_base.scss */
+slides > slide {
+  display: block;
+  position: absolute;
+  overflow: hidden;
+  left: 50%;
+  top: 50%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+/* Slide styles */
+/*article.fill iframe {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+
+  border: 0;
+  margin: 0;
+
+  @include border-radius(10px);
+
+  z-index: -1;
+}
+
+slide.fill {
+  background-repeat: no-repeat;
+  @include background-size(cover);
+}
+
+slide.fill img {
+  position: absolute;
+  left: 0;
+  top: 0;
+  min-width: 100%;
+  min-height: 100%;
+
+  z-index: -1;
+}
+*/
+/**
+ * Theme Styles
+ */
+/* line 22, ../scss/default.scss */
+::selection {
+  color: white;
+  background-color: #ffd14d;
+  text-shadow: none;
+}
+
+/* line 28, ../scss/default.scss */
+::-webkit-scrollbar {
+  height: 16px;
+  overflow: visible;
+  width: 16px;
+}
+
+/* line 33, ../scss/default.scss */
+::-webkit-scrollbar-thumb {
+  background-color: rgba(0, 0, 0, 0.1);
+  background-clip: padding-box;
+  border: solid transparent;
+  min-height: 28px;
+  padding: 100px 0 0;
+  -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+  -moz-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+  box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+  border-width: 1px 1px 1px 6px;
+}
+
+/* line 42, ../scss/default.scss */
+::-webkit-scrollbar-thumb:hover {
+  background-color: rgba(0, 0, 0, 0.5);
+}
+
+/* line 45, ../scss/default.scss */
+::-webkit-scrollbar-button {
+  height: 0;
+  width: 0;
+}
+
+/* line 49, ../scss/default.scss */
+::-webkit-scrollbar-track {
+  background-clip: padding-box;
+  border: solid transparent;
+  border-width: 0 0 0 4px;
+}
+
+/* line 54, ../scss/default.scss */
+::-webkit-scrollbar-corner {
+  background: transparent;
+}
+
+/* line 58, ../scss/default.scss */
+body {
+  background: black;
+}
+
+/* line 62, ../scss/default.scss */
+slides > slide {
+  display: none;
+  font-family: 'Open Sans', Arial, sans-serif;
+  font-size: 26px;
+  color: #797979;
+  width: 900px;
+  height: 700px;
+  margin-left: -450px;
+  margin-top: -350px;
+  padding: 40px 60px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-transition: all 0.6s ease-in-out;
+  -moz-transition: all 0.6s ease-in-out;
+  -o-transition: all 0.6s ease-in-out;
+  transition: all 0.6s ease-in-out;
+}
+/* line 83, ../scss/default.scss */
+slides > slide.far-past {
+  display: none;
+}
+/* line 90, ../scss/default.scss */
+slides > slide.past {
+  display: block;
+  opacity: 0;
+}
+/* line 97, ../scss/default.scss */
+slides > slide.current {
+  display: block;
+  opacity: 1;
+}
+/* line 103, ../scss/default.scss */
+slides > slide.current .auto-fadein {
+  opacity: 1;
+}
+/* line 107, ../scss/default.scss */
+slides > slide.current .gdbar {
+  -webkit-background-size: 100% 100%;
+  -moz-background-size: 100% 100%;
+  -o-background-size: 100% 100%;
+  background-size: 100% 100%;
+}
+/* line 112, ../scss/default.scss */
+slides > slide.next {
+  display: block;
+  opacity: 0;
+  pointer-events: none;
+}
+/* line 120, ../scss/default.scss */
+slides > slide.far-next {
+  display: none;
+}
+/* line 127, ../scss/default.scss */
+slides > slide.dark {
+  background: #515151 !important;
+}
+
+/* line 147, ../scss/default.scss */
+slides > slide:not(.nobackground):after {
+  font-size: 12pt;
+  content: attr(data-slide-num) "/" attr(data-total-slides);
+  position: absolute;
+  bottom: 20px;
+  right: 60px;
+  line-height: 1.9;
+}
+/* line 158, ../scss/default.scss */
+slides > slide.title-slide:after {
+  content: '';
+  position: absolute;
+  bottom: 40px;
+  right: 40px;
+  width: 100%;
+  height: 60px;
+}
+/* line 170, ../scss/default.scss */
+slides > slide.backdrop {
+  z-index: -10;
+  display: block !important;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(85%, #ffffff), color-stop(100%, #e6e6e6));
+  background: -webkit-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -moz-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -o-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background-color: white;
+}
+/* line 175, ../scss/default.scss */
+slides > slide.backdrop:after, slides > slide.backdrop:before {
+  display: none;
+}
+/* line 180, ../scss/default.scss */
+slides > slide > hgroup + article {
+  margin-top: 45px;
+}
+/* line 184, ../scss/default.scss */
+slides > slide > hgroup + article.flexbox.vcenter, slides > slide > hgroup + article.flexbox.vleft, slides > slide > hgroup + article.flexbox.vright {
+  height: 80%;
+}
+/* line 189, ../scss/default.scss */
+slides > slide > hgroup + article p {
+  margin-bottom: 1em;
+}
+/* line 194, ../scss/default.scss */
+slides > slide > article:only-child {
+  height: 100%;
+}
+/* line 197, ../scss/default.scss */
+slides > slide > article:only-child > iframe {
+  height: 95%;
+}
+
+/* line 203, ../scss/default.scss */
+slides.layout-faux-widescreen > slide {
+  padding: 40px 160px;
+}
+
+/* line 212, ../scss/default.scss */
+slides.layout-widescreen > slide,
+slides.layout-faux-widescreen > slide {
+  margin-left: -550px;
+  width: 1100px;
+}
+/* line 217, ../scss/default.scss */
+slides.layout-widescreen > slide.far-past,
+slides.layout-faux-widescreen > slide.far-past {
+  display: block;
+  display: none;
+  -webkit-transform: translate(-2260px);
+  -moz-transform: translate(-2260px);
+  -ms-transform: translate(-2260px);
+  -o-transform: translate(-2260px);
+  transform: translate(-2260px);
+  -webkit-transform: translate3d(-2260px, 0, 0);
+  -moz-transform: translate3d(-2260px, 0, 0);
+  -ms-transform: translate3d(-2260px, 0, 0);
+  -o-transform: translate3d(-2260px, 0, 0);
+  transform: translate3d(-2260px, 0, 0);
+}
+/* line 224, ../scss/default.scss */
+slides.layout-widescreen > slide.past,
+slides.layout-faux-widescreen > slide.past {
+  display: block;
+  opacity: 0;
+}
+/* line 231, ../scss/default.scss */
+slides.layout-widescreen > slide.current,
+slides.layout-faux-widescreen > slide.current {
+  display: block;
+  opacity: 1;
+}
+/* line 238, ../scss/default.scss */
+slides.layout-widescreen > slide.next,
+slides.layout-faux-widescreen > slide.next {
+  display: block;
+  opacity: 0;
+  pointer-events: none;
+}
+/* line 246, ../scss/default.scss */
+slides.layout-widescreen > slide.far-next,
+slides.layout-faux-widescreen > slide.far-next {
+  display: block;
+  display: none;
+  -webkit-transform: translate(2260px);
+  -moz-transform: translate(2260px);
+  -ms-transform: translate(2260px);
+  -o-transform: translate(2260px);
+  transform: translate(2260px);
+  -webkit-transform: translate3d(2260px, 0, 0);
+  -moz-transform: translate3d(2260px, 0, 0);
+  -ms-transform: translate3d(2260px, 0, 0);
+  -o-transform: translate3d(2260px, 0, 0);
+  transform: translate3d(2260px, 0, 0);
+}
+/* line 253, ../scss/default.scss */
+slides.layout-widescreen #prev-slide-area,
+slides.layout-faux-widescreen #prev-slide-area {
+  margin-left: -650px;
+}
+/* line 257, ../scss/default.scss */
+slides.layout-widescreen #next-slide-area,
+slides.layout-faux-widescreen #next-slide-area {
+  margin-left: 550px;
+}
+
+/* line 262, ../scss/default.scss */
+b {
+  font-weight: 600;
+}
+
+/* line 266, ../scss/default.scss */
+a {
+  color: #2a7cdf;
+  text-decoration: none;
+  border-bottom: 1px solid rgba(42, 124, 223, 0.5);
+}
+/* line 271, ../scss/default.scss */
+a:hover {
+  color: black !important;
+}
+
+/* line 276, ../scss/default.scss */
+h1, h2, h3 {
+  font-weight: 600;
+}
+
+/* line 280, ../scss/default.scss */
+h2 {
+  font-size: 45px;
+  line-height: 65px;
+  letter-spacing: -2px;
+  color: #515151;
+}
+
+/* line 287, ../scss/default.scss */
+h3 {
+  font-size: 30px;
+  letter-spacing: -1px;
+  line-height: 2;
+  font-weight: inherit;
+  color: #797979;
+}
+
+/* line 295, ../scss/default.scss */
+ol, ul {
+  margin-left: 1.2em;
+  margin-bottom: 1em;
+  position: relative;
+}
+
+ol {
+  margin-left: 1.4em;
+}
+
+/* line 300, ../scss/default.scss */
+ol li,
+ul li {
+  margin-bottom: 0.5em;
+}
+/* line 303, ../scss/default.scss */
+ul li ul {
+  margin-left: 2em;
+  margin-bottom: 0;
+}
+/* line 307, ../scss/default.scss */
+ul li ul li:before {
+  content: '-';
+  font-weight: 600;
+}
+/* line 314, ../scss/default.scss */
+ul > li:before {
+  content: '\00B7';
+  margin-left: -1em;
+  position: absolute;
+  font-weight: 600;
+}
+/* line 321, ../scss/default.scss */
+ul ul,
+ol ul {
+  margin-top: .5em;
+}
+
+ol ul,
+ol ol {
+  margin-top: .5em;
+}
+
+/* line 328, ../scss/default.scss */
+.highlight-code slide.current pre > * {
+  opacity: 0.25;
+  -webkit-transition: opacity 0.5s ease-in;
+  -moz-transition: opacity 0.5s ease-in;
+  -o-transition: opacity 0.5s ease-in;
+  transition: opacity 0.5s ease-in;
+}
+/* line 332, ../scss/default.scss */
+.highlight-code slide.current b {
+  opacity: 1;
+}
+
+/* line 337, ../scss/default.scss */
+pre {
+  font-family: 'Source Code Pro', 'Courier New', monospace;
+  font-size: 20px;
+  line-height: 28px;
+  padding: 10px 0 10px 60px;
+  letter-spacing: -1px;
+  margin-bottom: 20px;
+  width: 106%;
+  left: -60px;
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  /*overflow: hidden;*/
+}
+
+.prettyprint {
+  background-color: #e6e6e6;
+}
+
+/* line 351, ../scss/default.scss */
+pre[data-lang]:after {
+  content: attr(data-lang);
+  background-color: darkgrey;
+  right: 0;
+  top: 0;
+  position: absolute;
+  font-size: 16pt;
+  color: white;
+  padding: 2px 25px;
+  text-transform: uppercase;
+}
+
+/* line 364, ../scss/default.scss */
+pre[data-lang="go"] {
+  color: #333;
+}
+
+/* line 368, ../scss/default.scss */
+code {
+  font-size: 95%;
+  font-family: 'Source Code Pro', 'Courier New', monospace;
+  color: black;
+}
+
+/* line 374, ../scss/default.scss */
+iframe {
+  width: 100%;
+  height: 510px;
+  background: white;
+  border: 1px solid #e6e6e6;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+/* line 382, ../scss/default.scss */
+dt {
+  font-weight: bold;
+}
+
+/* line 386, ../scss/default.scss */
+button {
+  display: inline-block;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #f9f9f9), color-stop(70%, #e3e3e3));
+  background: -webkit-linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  background: -moz-linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  background: -o-linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  background: linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  border: 1px solid darkgrey;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  -ms-border-radius: 3px;
+  -o-border-radius: 3px;
+  border-radius: 3px;
+  padding: 5px 8px;
+  outline: none;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  user-select: none;
+  cursor: pointer;
+  text-shadow: 1px 1px white;
+  font-size: 10pt;
+}
+
+/* line 400, ../scss/default.scss */
+button:not(:disabled):hover {
+  border-color: #515151;
+}
+
+/* line 404, ../scss/default.scss */
+button:not(:disabled):active {
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #e3e3e3), color-stop(70%, #f9f9f9));
+  background: -webkit-linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+  background: -moz-linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+  background: -o-linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+  background: linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+}
+
+/* line 408, ../scss/default.scss */
+:disabled {
+  color: darkgrey;
+}
+
+/* line 412, ../scss/default.scss */
+.blue {
+  color: #4387fd;
+}
+
+/* line 415, ../scss/default.scss */
+.blue2 {
+  color: #3c8ef3;
+}
+
+/* line 418, ../scss/default.scss */
+.blue3 {
+  color: #2a7cdf;
+}
+
+/* line 421, ../scss/default.scss */
+.yellow {
+  color: #ffd14d;
+}
+
+/* line 424, ../scss/default.scss */
+.yellow2 {
+  color: #f9cc46;
+}
+
+/* line 427, ../scss/default.scss */
+.yellow3 {
+  color: #f6c000;
+}
+
+/* line 430, ../scss/default.scss */
+.green {
+  color: #0da861;
+}
+
+/* line 433, ../scss/default.scss */
+.green2 {
+  color: #00a86d;
+}
+
+/* line 436, ../scss/default.scss */
+.green3 {
+  color: #009f5d;
+}
+
+/* line 439, ../scss/default.scss */
+.red {
+  color: #f44a3f;
+}
+
+/* line 442, ../scss/default.scss */
+.red2 {
+  color: #e0543e;
+}
+
+/* line 445, ../scss/default.scss */
+.red3 {
+  color: #d94d3a;
+}
+
+/* line 448, ../scss/default.scss */
+.gray {
+  color: #e6e6e6;
+}
+
+/* line 451, ../scss/default.scss */
+.gray2 {
+  color: darkgrey;
+}
+
+/* line 454, ../scss/default.scss */
+.gray3 {
+  color: #797979;
+}
+
+/* line 457, ../scss/default.scss */
+.gray4 {
+  color: #515151;
+}
+
+/* line 461, ../scss/default.scss */
+.white {
+  color: white !important;
+}
+
+/* line 464, ../scss/default.scss */
+.black {
+  color: black !important;
+}
+
+/* line 468, ../scss/default.scss */
+.columns-2 {
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -ms-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+
+/* workaround for Safari 8 render bug with lists in columns */
+.columns-2 ul, .columns-2 ol {
+  -webkit-transform: translate3d(0, 0, 0);
+}
+
+/* line 472, ../scss/default.scss */
+table.rmdtable {
+  width: 100%;
+  border-collapse: -moz-initial;
+  border-collapse: initial;
+  border-spacing: 2px;
+  border-bottom: 1px solid #797979;
+}
+/* line 479, ../scss/default.scss */
+table.rmdtable tr > td:first-child, table th {
+  font-weight: 600;
+  color: #515151;
+}
+/* line 484, ../scss/default.scss */
+table.rmdtable tr:nth-child(odd) {
+  background-color: #e6e6e6;
+}
+/* line 488, ../scss/default.scss */
+table.rmdtable th {
+  color: white;
+  font-size: 18px;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #4387fd), color-stop(80%, #2a7cdf)) no-repeat;
+  background: -webkit-linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+  background: -moz-linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+  background: -o-linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+  background: linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+}
+/* line 494, ../scss/default.scss */
+table.rmdtable td, table th {
+  font-size: 18px;
+  padding: 1em 0.5em;
+}
+/* line 499, ../scss/default.scss */
+table.rmdtable td.highlight {
+  color: #515151;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #ffd14d), color-stop(80%, #f6c000)) no-repeat;
+  background: -webkit-linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+  background: -moz-linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+  background: -o-linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+  background: linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+}
+/* line 504, ../scss/default.scss */
+table.rmdtable.rows {
+  border-bottom: none;
+  border-right: 1px solid #797979;
+}
+
+/* line 510, ../scss/default.scss */
+q {
+  font-size: 45px;
+  line-height: 72px;
+}
+/* line 514, ../scss/default.scss */
+q:before {
+  content: '\201C';
+  position: absolute;
+  margin-left: -0.5em;
+}
+/* line 519, ../scss/default.scss */
+q:after {
+  content: '\201D';
+  position: absolute;
+  margin-left: 0.1em;
+}
+
+/* line 526, ../scss/default.scss */
+slide.fill {
+  background-repeat: no-repeat;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-background-size: cover;
+  -moz-background-size: cover;
+  -o-background-size: cover;
+  background-size: cover;
+}
+
+/* Size variants */
+/* line 535, ../scss/default.scss */
+article.smaller p, article.smaller ul, article.smaller ol {
+  font-size: 20px;
+  line-height: 24px;
+  letter-spacing: 0;
+}
+/* line 541, ../scss/default.scss */
+article.smaller table td, article.smaller table th {
+  font-size: 14px;
+}
+/* line 545, ../scss/default.scss */
+article.smaller pre {
+  font-size: 15px;
+  line-height: 20px;
+  letter-spacing: 0;
+}
+/* line 550, ../scss/default.scss */
+article.smaller q {
+  font-size: 40px;
+  line-height: 48px;
+}
+/* line 554, ../scss/default.scss */
+article.smaller q:before, article.smaller q:after {
+  font-size: 60px;
+}
+
+/* Builds */
+/* line 563, ../scss/default.scss */
+.build > * {
+  -webkit-transition: opacity 0.5s ease-in-out;
+  -webkit-transition-delay: 0.2s;
+  -moz-transition: opacity 0.5s ease-in-out 0.2s;
+  -o-transition: opacity 0.5s ease-in-out 0.2s;
+  transition: opacity 0.5s ease-in-out 0.2s;
+}
+/* line 567, ../scss/default.scss */
+.build .to-build {
+  opacity: 0;
+}
+/* line 571, ../scss/default.scss */
+.build .build-fade {
+  opacity: 0.3;
+}
+/* line 574, ../scss/default.scss */
+.build .build-fade:hover {
+  opacity: 1.0;
+}
+
+/* line 581, ../scss/default.scss */
+.popup .next .build .to-build {
+  opacity: 1;
+}
+/* line 585, ../scss/default.scss */
+.popup .next .build .build-fade {
+  opacity: 1;
+}
+
+/* Pretty print */
+/* line 593, ../scss/default.scss */
+.prettyprint .str,
+.prettyprint .atv {
+  /* a markup attribute value */
+  color: #009f5d;
+}
+
+/* line 597, ../scss/default.scss */
+.prettyprint .kwd,
+.prettyprint .tag {
+  /* a markup tag name */
+  color: #0066cc;
+}
+
+/* line 600, ../scss/default.scss */
+.prettyprint .com {
+  /* a comment */
+  color: #797979;
+  font-style: italic;
+}
+
+/* line 604, ../scss/default.scss */
+.prettyprint .lit {
+  /* a literal value */
+  color: #7f0000;
+}
+
+/* line 609, ../scss/default.scss */
+.prettyprint .pun,
+.prettyprint .opn,
+.prettyprint .clo {
+  color: #515151;
+}
+
+/* line 615, ../scss/default.scss */
+.prettyprint .typ,
+.prettyprint .atn,
+.prettyprint .dec,
+.prettyprint .var {
+  /* a declaration; a variable name */
+  color: #d94d3a;
+}
+
+/* line 618, ../scss/default.scss */
+.prettyprint .pln {
+  color: #515151;
+}
+
+/* line 622, ../scss/default.scss */
+.note {
+  position: absolute;
+  z-index: 100;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  padding: 1em;
+  background: rgba(0, 0, 0, 0.3);
+  opacity: 0;
+  pointer-events: none;
+  display: -webkit-box !important;
+  display: -moz-box !important;
+  display: -ms-box !important;
+  display: -o-box !important;
+  display: box !important;
+  -webkit-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -ms-box-orient: vertical;
+  box-orient: vertical;
+  -webkit-box-align: center;
+  -moz-box-align: center;
+  -ms-box-align: center;
+  box-align: center;
+  -webkit-box-pack: center;
+  -moz-box-pack: center;
+  -ms-box-pack: center;
+  box-pack: center;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateY(350px);
+  -moz-transform: translateY(350px);
+  -ms-transform: translateY(350px);
+  -o-transform: translateY(350px);
+  transform: translateY(350px);
+  -webkit-transition: all 0.4s ease-in-out;
+  -moz-transition: all 0.4s ease-in-out;
+  -o-transition: all 0.4s ease-in-out;
+  transition: all 0.4s ease-in-out;
+}
+/* line 640, ../scss/default.scss */
+.note > section {
+  background: #fff;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-box-shadow: 0 0 10px #797979;
+  -moz-box-shadow: 0 0 10px #797979;
+  box-shadow: 0 0 10px #797979;
+  width: 60%;
+  padding: 2em;
+}
+
+/* line 657, ../scss/default.scss */
+.with-notes.popup slides.layout-widescreen slide.next,
+.with-notes.popup slides.layout-faux-widescreen slide.next {
+  -webkit-transform: translate3d(690px, 80px, 0) scale(0.35);
+  -moz-transform: translate3d(690px, 80px, 0) scale(0.35);
+  -ms-transform: translate3d(690px, 80px, 0) scale(0.35);
+  -o-transform: translate3d(690px, 80px, 0) scale(0.35);
+  transform: translate3d(690px, 80px, 0) scale(0.35);
+}
+/* line 660, ../scss/default.scss */
+.with-notes.popup slides.layout-widescreen slide .note,
+.with-notes.popup slides.layout-faux-widescreen slide .note {
+  -webkit-transform: translate3d(300px, 800px, 0) scale(1.5);
+  -moz-transform: translate3d(300px, 800px, 0) scale(1.5);
+  -ms-transform: translate3d(300px, 800px, 0) scale(1.5);
+  -o-transform: translate3d(300px, 800px, 0) scale(1.5);
+  transform: translate3d(300px, 800px, 0) scale(1.5);
+}
+/* line 666, ../scss/default.scss */
+.with-notes.popup slide {
+  overflow: visible;
+  background: white;
+  -webkit-transition: none;
+  -moz-transition: none;
+  -o-transition: none;
+  transition: none;
+  pointer-events: none;
+  -webkit-transform-origin: 0 0;
+  -moz-transform-origin: 0 0;
+  -ms-transform-origin: 0 0;
+  -o-transform-origin: 0 0;
+  transform-origin: 0 0;
+}
+/* line 673, ../scss/default.scss */
+.with-notes.popup slide:not(.backdrop) {
+  -webkit-transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  -moz-transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  -ms-transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  -o-transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  -webkit-box-shadow: 0 0 10px #797979;
+  -moz-box-shadow: 0 0 10px #797979;
+  box-shadow: 0 0 10px #797979;
+}
+/* line 678, ../scss/default.scss */
+.with-notes.popup slide.backdrop {
+  background-image: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 600, color-stop(0%, #b1dfff), color-stop(100%, #4387fd));
+  background-image: -webkit-radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+  background-image: -moz-radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+  background-image: -o-radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+  background-image: radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+}
+/* line 684, ../scss/default.scss */
+.with-notes.popup slide.next {
+  -webkit-transform: translate3d(570px, 80px, 0) scale(0.35);
+  -moz-transform: translate3d(570px, 80px, 0) scale(0.35);
+  -ms-transform: translate3d(570px, 80px, 0) scale(0.35);
+  -o-transform: translate3d(570px, 80px, 0) scale(0.35);
+  transform: translate3d(570px, 80px, 0) scale(0.35);
+  opacity: 1 !important;
+}
+/* line 688, ../scss/default.scss */
+.with-notes.popup slide.next .note {
+  display: none !important;
+}
+/* line 694, ../scss/default.scss */
+.with-notes.popup .note {
+  width: 109%;
+  height: 260px;
+  background: #e6e6e6;
+  padding: 0;
+  -webkit-box-shadow: 0 0 10px #797979;
+  -moz-box-shadow: 0 0 10px #797979;
+  box-shadow: 0 0 10px #797979;
+  -webkit-transform: translate3d(250px, 800px, 0) scale(1.5);
+  -moz-transform: translate3d(250px, 800px, 0) scale(1.5);
+  -ms-transform: translate3d(250px, 800px, 0) scale(1.5);
+  -o-transform: translate3d(250px, 800px, 0) scale(1.5);
+  transform: translate3d(250px, 800px, 0) scale(1.5);
+  -webkit-transition: opacity 400ms ease-in-out;
+  -moz-transition: opacity 400ms ease-in-out;
+  -o-transition: opacity 400ms ease-in-out;
+  transition: opacity 400ms ease-in-out;
+}
+/* line 705, ../scss/default.scss */
+.with-notes.popup .note > section {
+  background: #fff;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  height: 100%;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+  overflow: auto;
+  padding: 1em;
+}
+/* line 718, ../scss/default.scss */
+.with-notes .note {
+  opacity: 1;
+  -webkit-transform: translateY(0);
+  -moz-transform: translateY(0);
+  -ms-transform: translateY(0);
+  -o-transform: translateY(0);
+  transform: translateY(0);
+  pointer-events: auto;
+}
+
+/* line 725, ../scss/default.scss */
+.source {
+  font-size: 14px;
+  color: darkgrey;
+  position: absolute;
+  bottom: 70px;
+  left: 60px;
+}
+
+/* line 733, ../scss/default.scss */
+.centered {
+  text-align: center;
+}
+
+/* line 737, ../scss/default.scss */
+.reflect {
+  -webkit-box-reflect: below 3px -webkit-linear-gradient(rgba(255, 255, 255, 0) 85%, white 150%);
+  -moz-box-reflect: below 3px -moz-linear-gradient(rgba(255, 255, 255, 0) 85%, white 150%);
+  -o-box-reflect: below 3px -o-linear-gradient(rgba(255, 255, 255, 0) 85%, white 150%);
+  -ms-box-reflect: below 3px -ms-linear-gradient(rgba(255, 255, 255, 0) 85%, white 150%);
+  box-reflect: below 3px linear-gradient(rgba(255, 255, 255, 0) 85%, #ffffff 150%);
+}
+
+/* line 745, ../scss/default.scss */
+.flexbox {
+  display: -webkit-box !important;
+  display: -moz-box !important;
+  display: -ms-box !important;
+  display: -o-box !important;
+  display: box !important;
+}
+
+/* line 749, ../scss/default.scss */
+.flexbox.vcenter {
+  -webkit-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -ms-box-orient: vertical;
+  box-orient: vertical;
+  -webkit-box-align: center;
+  -moz-box-align: center;
+  -ms-box-align: center;
+  box-align: center;
+  -webkit-box-pack: center;
+  -moz-box-pack: center;
+  -ms-box-pack: center;
+  box-pack: center;
+  height: 100%;
+  width: 100%;
+}
+
+/* line 755, ../scss/default.scss */
+.flexbox.vleft {
+  -webkit-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -ms-box-orient: vertical;
+  box-orient: vertical;
+  -webkit-box-align: left;
+  -moz-box-align: left;
+  -ms-box-align: left;
+  box-align: left;
+  -webkit-box-pack: center;
+  -moz-box-pack: center;
+  -ms-box-pack: center;
+  box-pack: center;
+  height: 100%;
+  width: 100%;
+}
+
+/* line 761, ../scss/default.scss */
+.flexbox.vright {
+  -webkit-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -ms-box-orient: vertical;
+  box-orient: vertical;
+  -webkit-box-align: end;
+  -moz-box-align: end;
+  -ms-box-align: end;
+  box-align: end;
+  -webkit-box-pack: center;
+  -moz-box-pack: center;
+  -ms-box-pack: center;
+  box-pack: center;
+  height: 100%;
+  width: 100%;
+}
+
+/* line 767, ../scss/default.scss */
+.auto-fadein {
+  -webkit-transition: opacity 0.6s ease-in;
+  -webkit-transition-delay: 0.6s;
+  -moz-transition: opacity 0.6s ease-in 0.6s;
+  -o-transition: opacity 0.6s ease-in 0.6s;
+  transition: opacity 0.6s ease-in 0.6s;
+  opacity: 0;
+}
+
+/* Clickable/tappable areas */
+/* line 773, ../scss/default.scss */
+.slide-area {
+  z-index: 1000;
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100px;
+  height: 700px;
+  left: 50%;
+  top: 50%;
+  cursor: pointer;
+  margin-top: -350px;
+}
+
+/* line 790, ../scss/default.scss */
+#prev-slide-area {
+  margin-left: -550px;
+}
+
+/* line 795, ../scss/default.scss */
+#next-slide-area {
+  margin-left: 450px;
+}
+
+/* ===== SLIDE CONTENT ===== */
+/* line 803, ../scss/default.scss */
+.logoslide img {
+  width: 383px;
+  height: 92px;
+}
+
+/* line 809, ../scss/default.scss */
+.segue {
+  padding: 60px 120px;
+}
+/* line 812, ../scss/default.scss */
+.segue h2 {
+  color: #e6e6e6;
+  font-size: 60px;
+}
+/* line 816, ../scss/default.scss */
+.segue h3 {
+  color: #e6e6e6;
+  line-height: 2.8;
+}
+/* line 820, ../scss/default.scss */
+.segue hgroup {
+  position: absolute;
+  bottom: 225px;
+}
+
+/* line 826, ../scss/default.scss */
+.thank-you-slide {
+  background: #4387fd !important;
+  color: white;
+}
+/* line 830, ../scss/default.scss */
+.thank-you-slide h2 {
+  font-size: 60px;
+  color: inherit;
+}
+/* line 835, ../scss/default.scss */
+.thank-you-slide article > p {
+  margin-top: 2em;
+  font-size: 20pt;
+}
+/* line 840, ../scss/default.scss */
+.thank-you-slide > p {
+  position: absolute;
+  bottom: 80px;
+  font-size: 24pt;
+  line-height: 1.3;
+}
+
+/* line 848, ../scss/default.scss */
+aside.gdbar {
+  height: 97px;
+  width: 215px;
+  position: absolute;
+  left: -1px;
+  top: 125px;
+  -webkit-border-radius: 0 10px 10px 0;
+  -moz-border-radius: 0 10px 10px 0;
+  -ms-border-radius: 0 10px 10px 0;
+  -o-border-radius: 0 10px 10px 0;
+  border-radius: 0 10px 10px 0;
+  background: -webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #e6e6e6), color-stop(100%, #e6e6e6)) no-repeat;
+  background: -webkit-linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  background: -moz-linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  background: -o-linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  background: linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  -webkit-background-size: 0% 100%;
+  -moz-background-size: 0% 100%;
+  -o-background-size: 0% 100%;
+  background-size: 0% 100%;
+  -webkit-transition: all 0.5s ease-out;
+  -webkit-transition-delay: 0.5s;
+  -moz-transition: all 0.5s ease-out 0.5s;
+  -o-transition: all 0.5s ease-out 0.5s;
+  transition: all 0.5s ease-out 0.5s;
+  /* Better to transition only on background-size, but not sure how to do that with the mixin. */
+}
+/* line 859, ../scss/default.scss */
+aside.gdbar.right {
+  right: 0;
+  left: -moz-initial;
+  left: initial;
+  top: 254px;
+  /* 96 is height of gray icon bar */
+  -webkit-transform: rotateZ(180deg);
+  -moz-transform: rotateZ(180deg);
+  -ms-transform: rotateZ(180deg);
+  -o-transform: rotateZ(180deg);
+  transform: rotateZ(180deg);
+}
+/* line 866, ../scss/default.scss */
+aside.gdbar.right img {
+  -webkit-transform: rotateZ(180deg);
+  -moz-transform: rotateZ(180deg);
+  -ms-transform: rotateZ(180deg);
+  -o-transform: rotateZ(180deg);
+  transform: rotateZ(180deg);
+}
+/* line 871, ../scss/default.scss */
+aside.gdbar.bottom {
+  top: -moz-initial;
+  top: initial;
+  bottom: 60px;
+}
+/* line 877, ../scss/default.scss */
+aside.gdbar img {
+  width: 85px;
+  height: 85px;
+  position: absolute;
+  right: 0;
+  margin: 8px 15px;
+}
+
+/* line 888, ../scss/default.scss */
+.title-slide hgroup {
+  bottom: 100px;
+}
+/* line 891, ../scss/default.scss */
+.title-slide hgroup h1 {
+  font-size: 65px;
+  line-height: 1.4;
+  letter-spacing: -3px;
+  color: #515151;
+}
+/* line 898, ../scss/default.scss */
+.title-slide hgroup h2 {
+  font-size: 34px;
+  color: darkgrey;
+  font-weight: inherit;
+}
+/* line 904, ../scss/default.scss */
+.title-slide hgroup p {
+  font-size: 20px;
+  color: #797979;
+  line-height: 1.3;
+  margin-top: 2em;
+}
+
+/* line 913, ../scss/default.scss */
+.quote {
+  color: #e6e6e6;
+}
+/* line 916, ../scss/default.scss */
+.quote .author {
+  font-size: 24px;
+  position: absolute;
+  bottom: 80px;
+  line-height: 1.4;
+}
+
+/* line 925, ../scss/default.scss */
+[data-config-contact] a {
+  color: white;
+  border-bottom: none;
+}
+/* line 929, ../scss/default.scss */
+[data-config-contact] span {
+  width: 115px;
+  display: inline-block;
+}
+
+/* line 938, ../scss/default.scss */
+.overview.popup .note {
+  display: none !important;
+}
+/* line 944, ../scss/default.scss */
+.overview slides slide {
+  display: block;
+  cursor: pointer;
+  opacity: 0.5;
+  pointer-events: auto !important;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(85%, #ffffff), color-stop(100%, #e6e6e6));
+  background: -webkit-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -moz-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -o-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background-color: white;
+}
+/* line 945, ../scss/default.scss */
+.overview slides slide.backdrop {
+  display: none !important;
+}
+/* line 960, ../scss/default.scss */
+.overview slides slide.far-past, .overview slides slide.past, .overview slides slide.next, .overview slides slide.far-next, .overview slides slide.far-past {
+  opacity: 0.5;
+  display: block;
+}
+/* line 965, ../scss/default.scss */
+.overview slides slide.current {
+  opacity: 1;
+}
+/* line 971, ../scss/default.scss */
+.overview .slide-area {
+  display: none;
+}
+
+ at media print {
+  /* line 978, ../scss/default.scss */
+  slides slide {
+    display: block !important;
+    position: relative;
+    background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(85%, #ffffff), color-stop(100%, #e6e6e6));
+    background: -webkit-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background: -moz-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background: -o-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background: linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background-color: white;
+    -webkit-transform: none !important;
+    -moz-transform: none !important;
+    -ms-transform: none !important;
+    -o-transform: none !important;
+    transform: none !important;
+    width: 100%;
+    height: 100%;
+    page-break-after: always;
+    top: auto !important;
+    left: auto !important;
+    margin-top: 0 !important;
+    margin-left: 0 !important;
+    opacity: 1 !important;
+    color: #555;
+  }
+  /* line 998, ../scss/default.scss */
+  slides slide.far-past, slides slide.past, slides slide.next, slides slide.far-next, slides slide.far-past, slides slide.current {
+    opacity: 1 !important;
+    display: block !important;
+  }
+  /* line 1004, ../scss/default.scss */
+  slides slide .build > * {
+    -webkit-transition: none;
+    -moz-transition: none;
+    -o-transition: none;
+    transition: none;
+  }
+  /* line 1009, ../scss/default.scss */
+  slides slide .build .to-build,
+  slides slide .build .build-fade {
+    opacity: 1;
+  }
+  /* line 1014, ../scss/default.scss */
+  slides slide .auto-fadein {
+    opacity: 1 !important;
+  }
+  /* line 1018, ../scss/default.scss */
+  slides slide.backdrop {
+    display: none !important;
+  }
+  /* line 1022, ../scss/default.scss */
+  slides slide table.rows {
+    border-right: 0;
+  }
+  /* line 1027, ../scss/default.scss */
+  slides slide[hidden] {
+    display: none !important;
+  }
+
+  /* line 1032, ../scss/default.scss */
+  .slide-area {
+    display: none;
+  }
+
+  /* line 1036, ../scss/default.scss */
+  .reflect {
+    -webkit-box-reflect: none;
+    -moz-box-reflect: none;
+    -o-box-reflect: none;
+    -ms-box-reflect: none;
+    box-reflect: none;
+  }
+
+  /* line 1044, ../scss/default.scss */
+  pre, code {
+    font-family: monospace !important;
+  }
+}
+
+/* Additions for Shiny compatibility */
+label {
+  display: block;
+  margin-bottom: 4px;
+}
+label, input {
+  font-size: 16px;
+  color: #333;
+}
+input {
+  width: 220px;
+}
+.jslider {
+  margin-top: 8px;
+}
+
+/* Additions for DT package */
+
+.dataTables_info, .dataTables_paginate {
+  font-size: 14px;
+}
+
diff --git a/inst/rmd/ioslides/ioslides-13.5.1/theme/css/phone.css b/inst/rmd/ioslides/ioslides-13.5.1/theme/css/phone.css
new file mode 100644
index 0000000..12028b1
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides-13.5.1/theme/css/phone.css
@@ -0,0 +1,6 @@
+
+ at media only screen and (max-device-width: 480px) {
+
+slides>slide{-webkit-transition:none !important;-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}
+
+}
diff --git a/inst/rmd/ioslides/ioslides_presentation.lua b/inst/rmd/ioslides/ioslides_presentation.lua
new file mode 100644
index 0000000..6f7a52a
--- /dev/null
+++ b/inst/rmd/ioslides/ioslides_presentation.lua
@@ -0,0 +1,520 @@
+
+-- Table to store footnotes, so they can be included at the end.
+local notes = {}
+
+-- Rendering state
+local in_slide = false
+local build_slide = false
+local in_notes = false
+
+-- Character escaping
+local function escape(s, in_attribute)
+  s = s:gsub("[<>&\"']",
+    function(x)
+      if x == '<' then
+        return '<'
+      elseif x == '>' then
+        return '>'
+      elseif x == '&' then
+        return '&'
+      elseif x == '"' then
+        return '"'
+      elseif x == "'" then
+        return '''
+      else
+        return x
+      end
+    end)
+  return s
+end
+
+
+-- Helper function to convert an attributes table into
+-- a string that can be put into HTML tags.
+local function attributes(attr)
+  local attr_table = {}
+  for x,y in pairs(attr) do
+    if y and y ~= "" then
+      table.insert(attr_table, ' ' .. x .. '="' .. escape(y,true) .. '"')
+    end
+  end
+  return table.concat(attr_table)
+end
+
+-- Helper function to split a string on spaces
+-- returns a table
+local function split(str)
+  local words = {}
+  for word in str:gmatch("%S+") do table.insert(words, word) end
+  return words
+end
+
+-- Helper function to remove duplicates
+-- returns a table http://stackoverflow.com/a/20067270
+local function uniq(t)
+  local seen = {}
+  local res = {}
+  for _,v in ipairs(t) do
+    if (not seen[v]) then
+      res[#res+1] = v
+      seen[v] = true
+    end
+  end
+  return res
+end
+
+-- Helper function to filter a list
+-- returns a table
+local function grep(f, l)
+  local res = {}
+  for _,v in ipairs(l) do
+    if (f(v)) then
+      res[#res+1] = v
+    end
+  end
+  return res
+end
+
+-- Blocksep is used to separate block elements.
+function Blocksep()
+  return "\n\n"
+end
+
+local function CompleteSlide()
+  if (in_slide) then
+    in_slide = false
+    return  "</article></slide>"
+  else
+    return ""
+  end
+end
+
+
+-- This function is called once for the whole document. Parameters:
+-- body is a string, metadata is a table, variables is a table.
+-- One could use some kind of templating
+-- system here; this just gives you a simple standalone HTML file.
+function Doc(body, metadata, variables)
+  -- complete any active slide
+  local suffix = CompleteSlide()
+
+  return body .. suffix
+end
+
+-- The functions that follow render corresponding pandoc elements.
+-- s is always a string, attr is always a table of attributes, and
+-- items is always an array of strings (the items in a list).
+-- Comments indicate the types of other variables.
+
+function Str(s)
+  s = escape(s)
+  if smart then
+    s = s:gsub("%-%-%-", "—")
+    s = s:gsub("%-%-", "–")
+    s = s:gsub("%.%.%.", "…")
+  end
+  return s
+end
+
+function Space()
+  return " "
+end
+
+function LineBreak()
+  return "<br/>"
+end
+
+function SoftBreak()
+  return " "
+end
+
+function Emph(s)
+  return "<em>" .. s .. "</em>"
+end
+
+function Strong(s)
+  return "<strong>" .. s .. "</strong>"
+end
+
+function Subscript(s)
+  return "<sub>" .. s .. "</sub>"
+end
+
+function Superscript(s)
+  return "<sup>" .. s .. "</sup>"
+end
+
+function SmallCaps(s)
+  return '<span style="font-variant: small-caps;">' .. s .. '</span>'
+end
+
+function Strikeout(s)
+  return '<del>' .. s .. '</del>'
+end
+
+function SingleQuoted(s)
+  if smart then
+    return '‘' .. s .. '’'
+  else
+    return '"' .. s .. '"'
+  end
+end
+
+function DoubleQuoted(s)
+  if smart then
+    return '“' .. s .. '”'
+  else
+    return '"' .. s .. '"'
+  end
+end
+
+function Link(s, src, tit)
+  return "<a href='" .. escape(src,true) .. "' title='" ..
+         escape(tit,true) .. "'>" .. s .. "</a>"
+end
+
+function Image(s, src, tit)
+  return "<img src='" .. escape(src,true) .. "' title='" ..
+         escape(tit,true) .. "'/>"
+end
+
+function CaptionedImage(src, tit, s)
+  local caption = ""
+  if fig_caption and (string.len(s) > 0) then
+    caption = "<p class='caption'>" .. s .. "</p>"
+  end
+  return Image(s, src, tit) .. caption
+end
+
+function Code(s, attr)
+  return "<code" .. attributes(attr) .. ">" .. escape(s) .. "</code>"
+end
+
+function InlineMath(s)
+  s = escape(s)
+  if mathjax then
+    return "\\(" .. s .. "\\)"
+  else
+    return "$" .. s .. "$"
+  end
+end
+
+function DisplayMath(s)
+  s = escape(s)
+  if mathjax then
+    return "\\[" .. s .. "\\]"
+  else
+    return "$$" .. s .. "$$"
+  end
+end
+
+function Note(s)
+  local num = #notes + 1
+  -- insert the back reference right before the final closing tag.
+  s = string.gsub(s,
+          '(.*)</', '%1 <a href="#fnref' .. num ..  '">↩</a></')
+  -- add a list item with the note to the note table.
+  table.insert(notes, '<li id="fn' .. num .. '">' .. s .. '</li>')
+  -- return the footnote reference, linked to the note.
+  return '<a id="fnref' .. num .. '" href="#fn' .. num ..
+            '"><sup>' .. num .. '</sup></a>'
+end
+
+function Span(s, attr)
+  return "<span" .. attributes(attr) .. ">" .. s .. "</span>"
+end
+
+function Cite(s)
+  return "<span class=\"cite\">" .. s .. "</span>"
+end
+
+function Plain(s)
+  return s
+end
+
+function Para(s)
+  return "<p>" .. s .. "</p>"
+end
+
+-- lev is an integer, the header level.
+function Header(lev, s, attr)
+
+  -- detect level 1 header and convert it to a segue slide
+  local slide_class = ""
+  local hgroup_class = ""
+  local slide_style = ""
+
+  -- make all headers < slide_level as segue slides
+  if lev < slide_level then
+  	-- create a segue slide but add lev class for possible customization
+    slide_class = "segue dark nobackground" .. " level" .. lev
+    hgroup_class = " class = 'auto-fadein'"
+    lev = 2
+  end
+
+  -- support for slide specific image backgrounds
+  -- alternative is this css
+  -- slide > slide [data-slide-num="7"] {
+  --   background-image: url("figures/xx.jpg");
+  -- }
+  if attr["data-background"] then
+    -- dark is incompatible with fill and let us uniquify nobackground
+    local slide = split(slide_class .. " fill nobackground")
+    slide = grep(function (v)
+      if v:match("^dark$") then return false else return true end
+    end, slide)
+    slide_class = table.concat(uniq(slide), " ")
+    if attr["data-background"]:match("^#") then
+      slide_style = 'background-color: ' .. attr["data-background"] .. ';'
+    else
+      -- assume url
+      slide_style = 'background-image: url(' .. attr["data-background"] .. ');'
+      local bg_size = attr["data-background-size"]
+      if not bg_size then bg_size = "contain" end
+      slide_style = slide_style .. ' background-size: ' .. bg_size .. ';'
+      local bg_position = attr["data-background-position"]
+      if not bg_position then bg_position = "center" end
+      slide_style = slide_style .. ' background-position: ' .. bg_position .. ';'
+    end
+    -- remove noise attributes for article
+    attr["data-background"] = nil
+    attr["data-background-size"] = nil
+    attr["data-background-position"] = nil
+  end
+
+  -- extract optional subtitle
+  local subtitle = ""
+  if lev == 2 then
+    local i, j = string.find(s, "|")
+    if i then
+      subtitle = string.sub(s, i+1, string.len(s))
+      s = string.sub(s, 1, i-1)
+    end
+  end
+
+  -- trick: as lev value 2 is used in code below to start a new slide
+  -- we force all lev <= slide_level as new slides
+  if lev > 2 and lev <= slide_level then
+  	lev = 2
+  end
+
+  -- build slide header (including optional subtitle)
+  local header = "<h" .. lev ..  ">" .. s .. "</h" .. lev .. ">"
+  if string.len(subtitle) > 0 then
+    header = header .. "<h3>" .. subtitle .. "</h3>"
+  end
+
+  -- treat level 2 headers as slides
+  if lev == 2 then
+
+    -- complete previous slide
+    local preface = CompleteSlide()
+
+    -- start a new slide
+    in_slide = true
+
+    -- update build flag (used by ol and ul)
+    if attr["class"] and string.find(attr["class"], "build") then
+      build_slide = true
+    else
+      build_slide = false
+    end
+
+    -- add 'smaller' class if it was globally specified
+    if smaller then
+      if (attr["class"]) then
+        attr["class"] = "smaller " .. attr["class"]
+      else
+        attr["class"] = "smaller"
+      end
+    end
+
+    if string.len(slide_style) > 0 then
+      slide_style = ' style="' .. slide_style .. '"'
+    end
+
+    -- return the beginning of the slide
+    return preface .. "<slide class=\"" .. slide_class .. "\"" .. slide_style .. ">" ..
+           "<hgroup" .. hgroup_class .. ">" .. header ..  "</hgroup>" ..
+           "<article " .. attributes(attr) .. ">"
+  else
+    return header
+  end
+
+end
+
+function BlockQuote(s)
+  -- if this is a list then blockquote means invert the default
+  -- incremental behavior
+  local prefix = string.sub(s, 1, 3)
+  if prefix == "<ol" or prefix == "<ul" then
+    if not incremental then
+      s = s:gsub(prefix .. ">", prefix .. " class = 'build'>", 1)
+    else
+      s = s:gsub(prefix .. " class = 'build'>", prefix .. ">", 1)
+    end
+    return s
+  else
+    return "<blockquote>\n" .. s .. "\n</blockquote>"
+  end
+end
+
+function HorizontalRule()
+  return Header(2, "", {})
+end
+
+function CodeBlock(s, attr)
+
+  -- if this code block has a class then add prettyprint to it
+  local class_attrib = ''
+  if attr["class"] then
+    local class = attr["class"]
+    if string.len(class) > 0 then
+      class_attrib = "class = 'prettyprint lang-" .. class .. "'"
+    end
+  end
+
+  -- substitute for code highlighting/emphasis
+  local code = escape(s)
+  code_sub = code:gsub("[ \t]*[#/]+[ \t]*<b>[ \t]*\n", "<b>")
+  code = code_sub:gsub("[ \t]*[#/]+[ \t]*</b>[ \t]*\n", "</b>")
+  code = code:gsub("[ \t]*[#/]+[ \t]*</b>[ \t]*$", "</b>")
+
+  return "<pre " .. class_attrib .. ">" .. code .. "</pre>"
+end
+
+function BulletList(items)
+  local buffer = {}
+  for _, item in pairs(items) do
+    table.insert(buffer, "<li>" .. item .. "</li>")
+  end
+  list_class = ""
+  if incremental then
+    list_class = " class = 'build'"
+  end
+  return "<ul" .. list_class .. ">\n" .. table.concat(buffer, "\n") .. "\n</ul>"
+end
+
+function OrderedList(items)
+  local buffer = {}
+  for _, item in pairs(items) do
+    table.insert(buffer, "<li>" .. item .. "</li>")
+  end
+  list_class = ""
+  if incremental then
+    list_class = " class = 'build'"
+  end
+  return "<ol" .. list_class .. ">\n" .. table.concat(buffer, "\n") .. "\n</ol>"
+end
+
+-- Revisit association list STackValue instance.
+function DefinitionList(items)
+  local buffer = {}
+  for _,item in pairs(items) do
+    for k, v in pairs(item) do
+      table.insert(buffer,"<dt>" .. k .. "</dt>\n<dd>" ..
+                        table.concat(v,"</dd>\n<dd>") .. "</dd>")
+    end
+  end
+  return "<dl>\n" .. table.concat(buffer, "\n") .. "\n</dl>"
+end
+
+-- Convert pandoc alignment to something HTML can use.
+-- align is AlignLeft, AlignRight, AlignCenter, or AlignDefault.
+function html_align(align)
+  if align == 'AlignLeft' then
+    return 'left'
+  elseif align == 'AlignRight' then
+    return 'right'
+  elseif align == 'AlignCenter' then
+    return 'center'
+  else
+    return 'left'
+  end
+end
+
+-- Caption is a string, aligns is an array of strings,
+-- widths is an array of floats, headers is an array of
+-- strings, rows is an array of arrays of strings.
+function Table(caption, aligns, widths, headers, rows)
+  local buffer = {}
+  local function add(s)
+    table.insert(buffer, s)
+  end
+  add("<table class = 'rmdtable'>")
+  if caption ~= "" then
+    add("<caption>" .. caption .. "</caption>")
+  end
+  if widths and widths[1] ~= 0 then
+    for _, w in pairs(widths) do
+      add('<col width="' .. string.format("%d%%", w * 100) .. '" />')
+    end
+  end
+  local header_row = {}
+  local empty_header = true
+  for i, h in pairs(headers) do
+    local align = html_align(aligns[i])
+    table.insert(header_row,'<th align="' .. align .. '">' .. h .. '</th>')
+    empty_header = empty_header and h == ""
+  end
+  if empty_header then
+    head = ""
+  else
+    add('<tr class="header">')
+    for _,h in pairs(header_row) do
+      add(h)
+    end
+    add('</tr>')
+  end
+  local class = "even"
+  for _, row in pairs(rows) do
+    class = (class == "even" and "odd") or "even"
+    add('<tr class="' .. class .. '">')
+    for i,c in pairs(row) do
+      add('<td align="' .. html_align(aligns[i]) .. '">' .. c .. '</td>')
+    end
+    add('</tr>')
+  end
+  add('</table>')
+  return table.concat(buffer,'\n')
+end
+
+function Div(s, attr)
+  if attr["class"] == "notes" then
+    return "<aside class='note'><section>" .. s ..
+           "</section></aside>"
+  else
+    return "<div" .. attributes(attr) .. ">\n" .. s .. "</div>"
+  end
+end
+
+function Span(s, attr)
+  return "<span" .. attributes(attr) .. ">\n" .. s .. "</span>"
+end
+
+function RawInline(f, s)
+  if f == "html" then
+    return s
+  else
+    return ''
+  end
+end
+
+function RawBlock(f, s)
+  if f == "html" then
+    return s
+  else
+    return ''
+  end
+end
+
+-- The following code will produce runtime warnings when you haven't defined
+-- all of the functions you need for the custom writer, so it's useful
+-- to include when you're working on a writer.
+local meta = {}
+meta.__index =
+  function(_, key)
+    io.stderr:write(string.format("WARNING: Undefined function '%s'\n",key))
+    return function() return "" end
+  end
+setmetatable(_G, meta)
diff --git a/inst/rmd/latex/default-1.14.tex b/inst/rmd/latex/default-1.14.tex
new file mode 100644
index 0000000..fdbc14b
--- /dev/null
+++ b/inst/rmd/latex/default-1.14.tex
@@ -0,0 +1,244 @@
+\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$lang$,$endif$$if(papersize)$$papersize$,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$}
+$if(fontfamily)$
+\usepackage{$fontfamily$}
+$else$
+\usepackage{lmodern}
+$endif$
+$if(linestretch)$
+\usepackage{setspace}
+\setstretch{$linestretch$}
+$endif$
+\usepackage{amssymb,amsmath}
+\usepackage{ifxetex,ifluatex}
+\usepackage{fixltx2e} % provides \textsubscript
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \usepackage[T1]{fontenc}
+  \usepackage[utf8]{inputenc}
+$if(euro)$
+  \usepackage{eurosym}
+$endif$
+\else % if luatex or xelatex
+  \ifxetex
+    \usepackage{mathspec}
+    \usepackage{xltxtra,xunicode}
+  \else
+    \usepackage{fontspec}
+  \fi
+  \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
+  \newcommand{\euro}{€}
+$if(mainfont)$
+    \setmainfont{$mainfont$}
+$endif$
+$if(sansfont)$
+    \setsansfont{$sansfont$}
+$endif$
+$if(monofont)$
+    \setmonofont[Mapping=tex-ansi]{$monofont$}
+$endif$
+$if(mathfont)$
+    \setmathfont(Digits,Latin,Greek){$mathfont$}
+$endif$
+\fi
+% use upquote if available, for straight quotes in verbatim environments
+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
+% use microtype if available
+\IfFileExists{microtype.sty}{%
+\usepackage{microtype}
+\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
+}{}
+$if(geometry)$
+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
+$endif$
+\ifxetex
+  \usepackage[setpagesize=false, % page size defined by xetex
+              unicode=false, % unicode breaks when used with xetex
+              xetex]{hyperref}
+\else
+  \usepackage[unicode=true]{hyperref}
+\fi
+\hypersetup{breaklinks=true,
+            bookmarks=true,
+            pdfauthor={$author-meta$},
+            pdftitle={$title-meta$},
+            colorlinks=true,
+            citecolor=$if(citecolor)$$citecolor$$else$blue$endif$,
+            urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$,
+            linkcolor=$if(linkcolor)$$linkcolor$$else$magenta$endif$,
+            pdfborder={0 0 0}}
+\urlstyle{same}  % don't use monospace font for urls
+$if(lang)$
+\ifxetex
+  \usepackage{polyglossia}
+  \setmainlanguage{$mainlang$}
+  \setotherlanguages{$for(otherlang)$$otherlang$$sep$,$endfor$}
+\else
+  \usepackage[shorthands=off,$lang$]{babel}
+\fi
+$endif$
+$if(natbib)$
+\usepackage{natbib}
+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
+$endif$
+$if(biblatex)$
+\usepackage{biblatex}
+$for(bibliography)$
+\addbibresource{$bibliography$}
+$endfor$
+$endif$
+$if(listings)$
+\usepackage{listings}
+$endif$
+$if(lhs)$
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
+$endif$
+$if(highlighting-macros)$
+$highlighting-macros$
+$endif$
+$if(verbatim-in-note)$
+\usepackage{fancyvrb}
+\VerbatimFootnotes
+$endif$
+$if(tables)$
+\usepackage{longtable,booktabs}
+$endif$
+$if(graphics)$
+\usepackage{graphicx,grffile}
+\makeatletter
+\def\maxwidth{\ifdim\Gin at nat@width>\linewidth\linewidth\else\Gin at nat@width\fi}
+\def\maxheight{\ifdim\Gin at nat@height>\textheight\textheight\else\Gin at nat@height\fi}
+\makeatother
+% Scale images if necessary, so that they will not overflow the page
+% margins by default, and it is still possible to overwrite the defaults
+% using explicit options in \includegraphics[width, height, ...]{}
+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
+$endif$
+$if(links-as-notes)$
+% Make links footnotes instead of hotlinks:
+\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
+$endif$
+$if(strikeout)$
+\usepackage[normalem]{ulem}
+% avoid problems with \sout in headers with hyperref:
+\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
+$endif$
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt plus 2pt minus 1pt}
+\setlength{\emergencystretch}{3em}  % prevent overfull lines
+\providecommand{\tightlist}{%
+  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
+$if(numbersections)$
+\setcounter{secnumdepth}{5}
+$else$
+\setcounter{secnumdepth}{0}
+$endif$
+$if(verbatim-in-note)$
+\VerbatimFootnotes % allows verbatim text in footnotes
+$endif$
+
+%%% Use protect on footnotes to avoid problems with footnotes in titles
+\let\rmarkdownfootnote\footnote%
+\def\footnote{\protect\rmarkdownfootnote}
+
+%%% Change title format to be more compact
+\usepackage{titling}
+
+% Create subtitle command for use in maketitle
+\newcommand{\subtitle}[1]{
+  \posttitle{
+    \begin{center}\large#1\end{center}
+    }
+}
+
+\setlength{\droptitle}{-2em}
+$if(title)$
+  \title{$title$}
+  \pretitle{\vspace{\droptitle}\centering\huge}
+  \posttitle{\par}
+$else$
+  \title{}
+  \pretitle{\vspace{\droptitle}}
+  \posttitle{}
+$endif$
+$if(subtitle)$
+\subtitle{$subtitle$}
+$endif$
+$if(author)$
+  \author{$for(author)$$author$$sep$ \\ $endfor$}
+  \preauthor{\centering\large\emph}
+  \postauthor{\par}
+$else$
+  \author{}
+  \preauthor{}\postauthor{}
+$endif$
+$if(date)$
+  \predate{\centering\large\emph}
+  \postdate{\par}
+  \date{$date$}
+$else$
+  \date{}
+  \predate{}\postdate{}
+$endif$
+
+% Redefines (sub)paragraphs to behave more like sections
+\ifx\paragraph\undefined\else
+\let\oldparagraph\paragraph
+\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
+\fi
+\ifx\subparagraph\undefined\else
+\let\oldsubparagraph\subparagraph
+\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
+\fi
+
+$for(header-includes)$
+$header-includes$
+$endfor$
+
+\begin{document}
+\maketitle
+$if(abstract)$
+\begin{abstract}
+$abstract$
+\end{abstract}
+$endif$
+
+$for(include-before)$
+$include-before$
+
+$endfor$
+$if(toc)$
+{
+\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$black$endif$}
+\setcounter{tocdepth}{$toc-depth$}
+\tableofcontents
+}
+$endif$
+$if(lot)$
+\listoftables
+$endif$
+$if(lof)$
+\listoffigures
+$endif$
+$body$
+
+$if(natbib)$
+$if(bibliography)$
+$if(biblio-title)$
+$if(book-class)$
+\renewcommand\bibname{$biblio-title$}
+$else$
+\renewcommand\refname{$biblio-title$}
+$endif$
+$endif$
+\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
+
+$endif$
+$endif$
+$if(biblatex)$
+\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
+
+$endif$
+$for(include-after)$
+$include-after$
+
+$endfor$
+\end{document}
diff --git a/inst/rmd/latex/default-1.15.2.tex b/inst/rmd/latex/default-1.15.2.tex
new file mode 100644
index 0000000..82dd7fa
--- /dev/null
+++ b/inst/rmd/latex/default-1.15.2.tex
@@ -0,0 +1,285 @@
+\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$babel-lang$,$endif$$if(papersize)$$papersize$,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$}
+$if(fontfamily)$
+\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$}
+$else$
+\usepackage{lmodern}
+$endif$
+$if(linestretch)$
+\usepackage{setspace}
+\setstretch{$linestretch$}
+$endif$
+\usepackage{amssymb,amsmath}
+\usepackage{ifxetex,ifluatex}
+\usepackage{fixltx2e} % provides \textsubscript
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}
+  \usepackage[utf8]{inputenc}
+$if(euro)$
+  \usepackage{eurosym}
+$endif$
+\else % if luatex or xelatex
+  \ifxetex
+    \usepackage{mathspec}
+  \else
+    \usepackage{fontspec}
+  \fi
+  \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
+  \newcommand{\euro}{€}
+$if(mainfont)$
+    \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$}
+$endif$
+$if(sansfont)$
+    \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$}
+$endif$
+$if(monofont)$
+    \setmonofont[Mapping=tex-ansi$if(monofontoptions)$,$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$endif$]{$monofont$}
+$endif$
+$if(mathfont)$
+    \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
+$endif$
+$if(CJKmainfont)$
+    \usepackage{xeCJK}
+    \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
+$endif$
+\fi
+% use upquote if available, for straight quotes in verbatim environments
+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
+% use microtype if available
+\IfFileExists{microtype.sty}{%
+\usepackage{microtype}
+\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
+}{}
+$if(geometry)$
+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
+$endif$
+\usepackage{hyperref}
+\PassOptionsToPackage{usenames,dvipsnames}{color} % color is loaded by hyperref
+\hypersetup{unicode=true,
+$if(title-meta)$
+            pdftitle={$title-meta$},
+$endif$
+$if(author-meta)$
+            pdfauthor={$author-meta$},
+$endif$
+$if(subtitle)$
+            pdfsubject={$subtitle$},
+$endif$
+$if(keywords)$
+            pdfkeywords={$for(keywords)$$keywords$$sep$; $endfor$},
+$endif$
+$if(colorlinks)$
+            colorlinks=true,
+            linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$,
+            citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$,
+            urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$,
+$else$
+            pdfborder={0 0 0},
+$endif$
+            breaklinks=true}
+\urlstyle{same}  % don't use monospace font for urls
+$if(lang)$
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}
+$if(babel-newcommands)$
+  $babel-newcommands$
+$endif$
+\else
+  \usepackage{polyglossia}
+  \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$}
+$for(polyglossia-otherlangs)$
+  \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}
+$endfor$
+\fi
+$endif$
+$if(natbib)$
+\usepackage{natbib}
+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
+$endif$
+$if(biblatex)$
+\usepackage$if(biblio-style)$[style=$biblio-style$]$endif${biblatex}
+$for(bibliography)$
+\addbibresource{$bibliography$}
+$endfor$
+$endif$
+$if(listings)$
+\usepackage{listings}
+$endif$
+$if(lhs)$
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
+$endif$
+$if(highlighting-macros)$
+$highlighting-macros$
+$endif$
+$if(verbatim-in-note)$
+\usepackage{fancyvrb}
+\VerbatimFootnotes % allows verbatim text in footnotes
+$endif$
+$if(tables)$
+\usepackage{longtable,booktabs}
+$endif$
+$if(graphics)$
+\usepackage{graphicx,grffile}
+\makeatletter
+\def\maxwidth{\ifdim\Gin at nat@width>\linewidth\linewidth\else\Gin at nat@width\fi}
+\def\maxheight{\ifdim\Gin at nat@height>\textheight\textheight\else\Gin at nat@height\fi}
+\makeatother
+% Scale images if necessary, so that they will not overflow the page
+% margins by default, and it is still possible to overwrite the defaults
+% using explicit options in \includegraphics[width, height, ...]{}
+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
+$endif$
+$if(links-as-notes)$
+% Make links footnotes instead of hotlinks:
+\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
+$endif$
+$if(strikeout)$
+\usepackage[normalem]{ulem}
+% avoid problems with \sout in headers with hyperref:
+\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
+$endif$
+$if(indent)$
+$else$
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt plus 2pt minus 1pt}
+$endif$
+\setlength{\emergencystretch}{3em}  % prevent overfull lines
+\providecommand{\tightlist}{%
+  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
+$if(numbersections)$
+\setcounter{secnumdepth}{5}
+$else$
+\setcounter{secnumdepth}{0}
+$endif$
+$if(dir)$
+\ifxetex
+  % load bidi as late as possible as it modifies e.g. graphicx
+  $if(latex-dir-rtl)$
+  \usepackage[RTLdocument]{bidi}
+  $else$
+  \usepackage{bidi}
+  $endif$
+\fi
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \TeXXeTstate=1
+  \newcommand{\RL}[1]{\beginR #1\endR}
+  \newcommand{\LR}[1]{\beginL #1\endL}
+  \newenvironment{RTL}{\beginR}{\endR}
+  \newenvironment{LTR}{\beginL}{\endL}
+\fi
+$endif$
+
+%%% Use protect on footnotes to avoid problems with footnotes in titles
+\let\rmarkdownfootnote\footnote%
+\def\footnote{\protect\rmarkdownfootnote}
+
+%%% Change title format to be more compact
+\usepackage{titling}
+
+% Create subtitle command for use in maketitle
+\newcommand{\subtitle}[1]{
+  \posttitle{
+    \begin{center}\large#1\end{center}
+    }
+}
+
+\setlength{\droptitle}{-2em}
+$if(title)$
+  \title{$title$}
+  \pretitle{\vspace{\droptitle}\centering\huge}
+  \posttitle{\par}
+$else$
+  \title{}
+  \pretitle{\vspace{\droptitle}}
+  \posttitle{}
+$endif$
+$if(subtitle)$
+\subtitle{$subtitle$}
+$endif$
+$if(author)$
+  \author{$for(author)$$author$$sep$ \\ $endfor$}
+  \preauthor{\centering\large\emph}
+  \postauthor{\par}
+$else$
+  \author{}
+  \preauthor{}\postauthor{}
+$endif$
+$if(date)$
+  \predate{\centering\large\emph}
+  \postdate{\par}
+  \date{$date$}
+$else$
+  \date{}
+  \predate{}\postdate{}
+$endif$
+
+
+$if(subparagraph)$
+$else$
+% Redefines (sub)paragraphs to behave more like sections
+\ifx\paragraph\undefined\else
+\let\oldparagraph\paragraph
+\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
+\fi
+\ifx\subparagraph\undefined\else
+\let\oldsubparagraph\subparagraph
+\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
+\fi
+$endif$
+
+$for(header-includes)$
+$header-includes$
+$endfor$
+
+\begin{document}
+$if(title)$
+\maketitle
+$endif$
+$if(abstract)$
+\begin{abstract}
+$abstract$
+\end{abstract}
+$endif$
+
+$for(include-before)$
+$include-before$
+
+$endfor$
+$if(toc)$
+{
+$if(colorlinks)$
+\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$black$endif$}
+$endif$
+\setcounter{tocdepth}{$toc-depth$}
+\tableofcontents
+}
+$endif$
+$if(lot)$
+\listoftables
+$endif$
+$if(lof)$
+\listoffigures
+$endif$
+$body$
+
+$if(natbib)$
+$if(bibliography)$
+$if(biblio-title)$
+$if(book-class)$
+\renewcommand\bibname{$biblio-title$}
+$else$
+\renewcommand\refname{$biblio-title$}
+$endif$
+$endif$
+\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
+
+$endif$
+$endif$
+$if(biblatex)$
+\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
+
+$endif$
+$for(include-after)$
+$include-after$
+
+$endfor$
+\end{document}
diff --git a/inst/rmd/latex/default-1.17.0.2.tex b/inst/rmd/latex/default-1.17.0.2.tex
new file mode 100644
index 0000000..a8c4085
--- /dev/null
+++ b/inst/rmd/latex/default-1.17.0.2.tex
@@ -0,0 +1,290 @@
+\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$babel-lang$,$endif$$if(papersize)$$papersize$paper,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$}
+$if(fontfamily)$
+\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$}
+$else$
+\usepackage{lmodern}
+$endif$
+$if(linestretch)$
+\usepackage{setspace}
+\setstretch{$linestretch$}
+$endif$
+\usepackage{amssymb,amsmath}
+\usepackage{ifxetex,ifluatex}
+\usepackage{fixltx2e} % provides \textsubscript
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}
+  \usepackage[utf8]{inputenc}
+$if(euro)$
+  \usepackage{eurosym}
+$endif$
+\else % if luatex or xelatex
+  \ifxetex
+    \usepackage{mathspec}
+  \else
+    \usepackage{fontspec}
+  \fi
+  \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
+$if(euro)$
+  \newcommand{\euro}{€}
+$endif$
+$if(mainfont)$
+    \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$}
+$endif$
+$if(sansfont)$
+    \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$}
+$endif$
+$if(monofont)$
+    \setmonofont[Mapping=tex-ansi$if(monofontoptions)$,$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$endif$]{$monofont$}
+$endif$
+$if(mathfont)$
+    \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
+$endif$
+$if(CJKmainfont)$
+    \usepackage{xeCJK}
+    \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
+$endif$
+\fi
+% use upquote if available, for straight quotes in verbatim environments
+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
+% use microtype if available
+\IfFileExists{microtype.sty}{%
+\usepackage{microtype}
+\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
+}{}
+$if(geometry)$
+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
+$endif$
+\usepackage{hyperref}
+$if(colorlinks)$
+\PassOptionsToPackage{usenames,dvipsnames}{color} % color is loaded by hyperref
+$endif$
+\hypersetup{unicode=true,
+$if(title-meta)$
+            pdftitle={$title-meta$},
+$endif$
+$if(author-meta)$
+            pdfauthor={$author-meta$},
+$endif$
+$if(keywords)$
+            pdfkeywords={$for(keywords)$$keywords$$sep$; $endfor$},
+$endif$
+$if(colorlinks)$
+            colorlinks=true,
+            linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$,
+            citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$,
+            urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$,
+$else$
+            pdfborder={0 0 0},
+$endif$
+            breaklinks=true}
+\urlstyle{same}  % don't use monospace font for urls
+$if(lang)$
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}
+$if(babel-newcommands)$
+  $babel-newcommands$
+$endif$
+\else
+  \usepackage{polyglossia}
+  \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$}
+$for(polyglossia-otherlangs)$
+  \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}
+$endfor$
+\fi
+$endif$
+$if(natbib)$
+\usepackage{natbib}
+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
+$endif$
+$if(biblatex)$
+\usepackage$if(biblio-style)$[style=$biblio-style$]$endif${biblatex}
+$if(biblatexoptions)$\ExecuteBibliographyOptions{$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$}$endif$
+$for(bibliography)$
+\addbibresource{$bibliography$}
+$endfor$
+$endif$
+$if(listings)$
+\usepackage{listings}
+$endif$
+$if(lhs)$
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
+$endif$
+$if(highlighting-macros)$
+$highlighting-macros$
+$endif$
+$if(verbatim-in-note)$
+\usepackage{fancyvrb}
+\VerbatimFootnotes % allows verbatim text in footnotes
+$endif$
+$if(tables)$
+\usepackage{longtable,booktabs}
+$endif$
+$if(graphics)$
+\usepackage{graphicx,grffile}
+\makeatletter
+\def\maxwidth{\ifdim\Gin at nat@width>\linewidth\linewidth\else\Gin at nat@width\fi}
+\def\maxheight{\ifdim\Gin at nat@height>\textheight\textheight\else\Gin at nat@height\fi}
+\makeatother
+% Scale images if necessary, so that they will not overflow the page
+% margins by default, and it is still possible to overwrite the defaults
+% using explicit options in \includegraphics[width, height, ...]{}
+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
+$endif$
+$if(links-as-notes)$
+% Make links footnotes instead of hotlinks:
+\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
+$endif$
+$if(strikeout)$
+\usepackage[normalem]{ulem}
+% avoid problems with \sout in headers with hyperref:
+\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
+$endif$
+$if(indent)$
+$else$
+\IfFileExists{parskip.sty}{%
+\usepackage{parskip}
+}{% else
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt plus 2pt minus 1pt}
+}
+$endif$
+\setlength{\emergencystretch}{3em}  % prevent overfull lines
+\providecommand{\tightlist}{%
+  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
+$if(numbersections)$
+\setcounter{secnumdepth}{5}
+$else$
+\setcounter{secnumdepth}{0}
+$endif$
+$if(subparagraph)$
+$else$
+% Redefines (sub)paragraphs to behave more like sections
+\ifx\paragraph\undefined\else
+\let\oldparagraph\paragraph
+\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
+\fi
+\ifx\subparagraph\undefined\else
+\let\oldsubparagraph\subparagraph
+\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
+\fi
+$endif$
+$if(dir)$
+\ifxetex
+  % load bidi as late as possible as it modifies e.g. graphicx
+  $if(latex-dir-rtl)$
+  \usepackage[RTLdocument]{bidi}
+  $else$
+  \usepackage{bidi}
+  $endif$
+\fi
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \TeXXeTstate=1
+  \newcommand{\RL}[1]{\beginR #1\endR}
+  \newcommand{\LR}[1]{\beginL #1\endL}
+  \newenvironment{RTL}{\beginR}{\endR}
+  \newenvironment{LTR}{\beginL}{\endL}
+\fi
+$endif$
+
+%%% Use protect on footnotes to avoid problems with footnotes in titles
+\let\rmarkdownfootnote\footnote%
+\def\footnote{\protect\rmarkdownfootnote}
+
+%%% Change title format to be more compact
+\usepackage{titling}
+
+% Create subtitle command for use in maketitle
+\newcommand{\subtitle}[1]{
+  \posttitle{
+    \begin{center}\large#1\end{center}
+    }
+}
+
+\setlength{\droptitle}{-2em}
+$if(title)$
+  \title{$title$}
+  \pretitle{\vspace{\droptitle}\centering\huge}
+  \posttitle{\par}
+$else$
+  \title{}
+  \pretitle{\vspace{\droptitle}}
+  \posttitle{}
+$endif$
+$if(subtitle)$
+\subtitle{$subtitle$}
+$endif$
+$if(author)$
+  \author{$for(author)$$author$$sep$ \\ $endfor$}
+  \preauthor{\centering\large\emph}
+  \postauthor{\par}
+$else$
+  \author{}
+  \preauthor{}\postauthor{}
+$endif$
+$if(date)$
+  \predate{\centering\large\emph}
+  \postdate{\par}
+  \date{$date$}
+$else$
+  \date{}
+  \predate{}\postdate{}
+$endif$
+
+$for(header-includes)$
+$header-includes$
+$endfor$
+
+\begin{document}
+$if(title)$
+\maketitle
+$endif$
+$if(abstract)$
+\begin{abstract}
+$abstract$
+\end{abstract}
+$endif$
+
+$for(include-before)$
+$include-before$
+
+$endfor$
+$if(toc)$
+{
+$if(colorlinks)$
+\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$black$endif$}
+$endif$
+\setcounter{tocdepth}{$toc-depth$}
+\tableofcontents
+}
+$endif$
+$if(lot)$
+\listoftables
+$endif$
+$if(lof)$
+\listoffigures
+$endif$
+$body$
+
+$if(natbib)$
+$if(bibliography)$
+$if(biblio-title)$
+$if(book-class)$
+\renewcommand\bibname{$biblio-title$}
+$else$
+\renewcommand\refname{$biblio-title$}
+$endif$
+$endif$
+\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
+
+$endif$
+$endif$
+$if(biblatex)$
+\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
+
+$endif$
+$for(include-after)$
+$include-after$
+
+$endfor$
+
+\end{document}
diff --git a/inst/rmd/latex/default.tex b/inst/rmd/latex/default.tex
new file mode 100644
index 0000000..0f9979d
--- /dev/null
+++ b/inst/rmd/latex/default.tex
@@ -0,0 +1,235 @@
+\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$lang$,$endif$$if(papersize)$$papersize$,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$}
+$if(fontfamily)$
+\usepackage{$fontfamily$}
+$else$
+\usepackage{lmodern}
+$endif$
+$if(linestretch)$
+\usepackage{setspace}
+\setstretch{$linestretch$}
+$endif$
+\usepackage{amssymb,amsmath}
+\usepackage{ifxetex,ifluatex}
+\usepackage{fixltx2e} % provides \textsubscript
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \usepackage[T1]{fontenc}
+  \usepackage[utf8]{inputenc}
+$if(euro)$
+  \usepackage{eurosym}
+$endif$
+\else % if luatex or xelatex
+  \ifxetex
+    \usepackage{mathspec}
+    \usepackage{xltxtra,xunicode}
+  \else
+    \usepackage{fontspec}
+  \fi
+  \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
+  \newcommand{\euro}{€}
+$if(mainfont)$
+    \setmainfont{$mainfont$}
+$endif$
+$if(sansfont)$
+    \setsansfont{$sansfont$}
+$endif$
+$if(monofont)$
+    \setmonofont[Mapping=tex-ansi]{$monofont$}
+$endif$
+$if(mathfont)$
+    \setmathfont(Digits,Latin,Greek){$mathfont$}
+$endif$
+\fi
+% use upquote if available, for straight quotes in verbatim environments
+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
+% use microtype if available
+\IfFileExists{microtype.sty}{%
+\usepackage{microtype}
+\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
+}{}
+$if(geometry)$
+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
+$endif$
+$if(lang)$
+\ifxetex
+  \usepackage{polyglossia}
+  \setmainlanguage{$mainlang$}
+\else
+  \usepackage[shorthands=off,$lang$]{babel}
+\fi
+$endif$
+$if(natbib)$
+\usepackage{natbib}
+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
+$endif$
+$if(biblatex)$
+\usepackage{biblatex}
+$if(biblio-files)$
+\bibliography{$biblio-files$}
+$endif$
+$endif$
+$if(listings)$
+\usepackage{listings}
+$endif$
+$if(lhs)$
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
+$endif$
+$if(highlighting-macros)$
+$highlighting-macros$
+$endif$
+$if(verbatim-in-note)$
+\usepackage{fancyvrb}
+\VerbatimFootnotes
+$endif$
+$if(tables)$
+\usepackage{longtable,booktabs}
+$endif$
+$if(graphics)$
+\usepackage{graphicx}
+\makeatletter
+\def\maxwidth{\ifdim\Gin at nat@width>\linewidth\linewidth\else\Gin at nat@width\fi}
+\def\maxheight{\ifdim\Gin at nat@height>\textheight\textheight\else\Gin at nat@height\fi}
+\makeatother
+% Scale images if necessary, so that they will not overflow the page
+% margins by default, and it is still possible to overwrite the defaults
+% using explicit options in \includegraphics[width, height, ...]{}
+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
+$endif$
+\ifxetex
+  \usepackage[setpagesize=false, % page size defined by xetex
+              unicode=false, % unicode breaks when used with xetex
+              xetex]{hyperref}
+\else
+  \usepackage[unicode=true]{hyperref}
+\fi
+\hypersetup{breaklinks=true,
+            bookmarks=true,
+            pdfauthor={$author-meta$},
+            pdftitle={$title-meta$},
+            colorlinks=true,
+            citecolor=$if(citecolor)$$citecolor$$else$blue$endif$,
+            urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$,
+            linkcolor=$if(linkcolor)$$linkcolor$$else$magenta$endif$,
+            pdfborder={0 0 0}}
+\urlstyle{same}  % don't use monospace font for urls
+$if(links-as-notes)$
+% Make links footnotes instead of hotlinks:
+\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
+$endif$
+$if(strikeout)$
+\usepackage[normalem]{ulem}
+% avoid problems with \sout in headers with hyperref:
+\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
+$endif$
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt plus 2pt minus 1pt}
+\setlength{\emergencystretch}{3em}  % prevent overfull lines
+$if(numbersections)$
+\setcounter{secnumdepth}{5}
+$else$
+\setcounter{secnumdepth}{0}
+$endif$
+$if(verbatim-in-note)$
+\VerbatimFootnotes % allows verbatim text in footnotes
+$endif$
+
+%%% Use protect on footnotes to avoid problems with footnotes in titles
+\let\rmarkdownfootnote\footnote%
+\def\footnote{\protect\rmarkdownfootnote}
+
+%%% Change title format to be more compact
+\usepackage{titling}
+
+% Create subtitle command for use in maketitle
+\newcommand{\subtitle}[1]{
+  \posttitle{
+    \begin{center}\large#1\end{center}
+    }
+}
+
+\setlength{\droptitle}{-2em}
+$if(title)$
+  \title{$title$}
+  \pretitle{\vspace{\droptitle}\centering\huge}
+  \posttitle{\par}
+$else$
+  \title{}
+  \pretitle{\vspace{\droptitle}}
+  \posttitle{}
+$endif$
+$if(subtitle)$
+\subtitle{$subtitle$}
+$endif$
+$if(author)$
+  \author{$for(author)$$author$$sep$ \\ $endfor$}
+  \preauthor{\centering\large\emph}
+  \postauthor{\par}
+$else$
+  \author{}
+  \preauthor{}\postauthor{}
+$endif$
+$if(date)$
+  \predate{\centering\large\emph}
+  \postdate{\par}
+  \date{$date$}
+$else$
+  \date{}
+  \predate{}\postdate{}
+$endif$
+
+$for(header-includes)$
+$header-includes$
+$endfor$
+
+\begin{document}
+
+$if(title)$
+\maketitle
+$endif$
+
+$if(abstract)$
+\begin{abstract}
+$abstract$
+\end{abstract}
+$endif$
+
+$for(include-before)$
+$include-before$
+
+$endfor$
+$if(toc)$
+{
+\hypersetup{linkcolor=black}
+\setcounter{tocdepth}{$toc-depth$}
+\tableofcontents
+}
+$endif$
+$if(lot)$
+\listoftables
+$endif$
+$if(lof)$
+\listoffigures
+$endif$
+$body$
+
+$if(natbib)$
+$if(biblio-files)$
+$if(biblio-title)$
+$if(book-class)$
+\renewcommand\bibname{$biblio-title$}
+$else$
+\renewcommand\refname{$biblio-title$}
+$endif$
+$endif$
+\bibliography{$biblio-files$}
+
+$endif$
+$endif$
+$if(biblatex)$
+\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
+
+$endif$
+$for(include-after)$
+$include-after$
+
+$endfor$
+\end{document}
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.gif b/inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.gif
new file mode 100644
index 0000000..bce1a2a
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.png b/inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.png
new file mode 100644
index 0000000..4e28cfa
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-fold-dim.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-fold.gif b/inst/rmd/slidy/Slidy2/graphics/bullet-fold.gif
new file mode 100644
index 0000000..d4b063c
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-fold.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-fold.png b/inst/rmd/slidy/Slidy2/graphics/bullet-fold.png
new file mode 100644
index 0000000..b5334f3
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-fold.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-nofold-dim.gif b/inst/rmd/slidy/Slidy2/graphics/bullet-nofold-dim.gif
new file mode 100644
index 0000000..98a4c39
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-nofold-dim.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-nofold-dim.png b/inst/rmd/slidy/Slidy2/graphics/bullet-nofold-dim.png
new file mode 100644
index 0000000..27bccb2
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-nofold-dim.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-nofold.gif b/inst/rmd/slidy/Slidy2/graphics/bullet-nofold.gif
new file mode 100644
index 0000000..76102a3
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-nofold.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-nofold.png b/inst/rmd/slidy/Slidy2/graphics/bullet-nofold.png
new file mode 100644
index 0000000..28215ec
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-nofold.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-unfold-dim.gif b/inst/rmd/slidy/Slidy2/graphics/bullet-unfold-dim.gif
new file mode 100644
index 0000000..b758cbe
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-unfold-dim.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-unfold-dim.png b/inst/rmd/slidy/Slidy2/graphics/bullet-unfold-dim.png
new file mode 100644
index 0000000..1dec59d
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-unfold-dim.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-unfold.gif b/inst/rmd/slidy/Slidy2/graphics/bullet-unfold.gif
new file mode 100644
index 0000000..e5ecd5b
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-unfold.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet-unfold.png b/inst/rmd/slidy/Slidy2/graphics/bullet-unfold.png
new file mode 100644
index 0000000..ce9de96
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet-unfold.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet.gif b/inst/rmd/slidy/Slidy2/graphics/bullet.gif
new file mode 100644
index 0000000..8a5bec9
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/bullet.png b/inst/rmd/slidy/Slidy2/graphics/bullet.png
new file mode 100644
index 0000000..14ebd95
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/bullet.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/example.png b/inst/rmd/slidy/Slidy2/graphics/example.png
new file mode 100644
index 0000000..7ce9b3f
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/example.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/example.svg b/inst/rmd/slidy/Slidy2/graphics/example.svg
new file mode 100644
index 0000000..581358e
--- /dev/null
+++ b/inst/rmd/slidy/Slidy2/graphics/example.svg
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 11.0, SVG Export Plug-In  -->
+<svg  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+	 viewBox="-0.724 -0.46 279 52" xml:space="preserve">
+        <desc>W3C Indian Office logo</desc>
+	<defs>
+	</defs>
+	<g>
+		<rect x="107.669" y="15.986" style="fill:#0C479D" width="163.338" height="13.73"/> 
+		<path style="fill:#FFFFFF" d="M117.042,25.062c-0.6,0.853-1.279,1.812-2.692,1.812c-0.879,0-1.985-0.574-1.985-2.052
+			c0-2.039,1.919-4.277,3.758-4.277c1.053,0,1.532,0.586,1.532,1.172c0,0.6-0.333,0.96-0.839,0.96c-0.36,0-0.759-0.239-0.759-0.693
+			c0-0.372,0.28-0.586,0.28-0.772c0-0.174-0.187-0.227-0.307-0.227c-1.16,0-1.959,2.799-1.959,3.745
+			c0,1.065,0.587,1.293,0.973,1.293c0.6,0,1.093-0.428,1.626-1.201L117.042,25.062z"/>
+		<path style="fill:#FFFFFF" d="M134.227,22.596c0,1.985-1.652,4.278-3.784,4.278c-1.093,0-2.132-0.705-2.132-1.986
+			c0-2.053,1.719-4.344,3.825-4.344C132.641,20.544,134.227,20.81,134.227,22.596z M129.896,25.554c0,0.268,0,0.934,0.693,0.934
+			c1.279,0,2.052-3.705,2.052-4.705c0-0.666-0.293-0.852-0.64-0.852C130.562,20.931,129.896,24.702,129.896,25.554z"/>
+		<path style="fill:#FFFFFF" d="M151.587,25.076c-0.426,0.718-1.053,1.746-2.092,1.746c-0.213,0-0.934,0-0.934-0.867
+			c0-0.946,1.174-3.864,1.174-4.157c0-0.161-0.16-0.294-0.334-0.294c-0.333,0-1.679,0.666-2.852,5.197h-1.612
+			c0.679-2.544,1.359-4.744,1.359-5.077c0-0.347-0.36-0.347-0.72-0.347v-0.36c0.293,0,1.612-0.119,2.665-0.359l-0.8,2.479
+			l0.04,0.027c0.96-1.412,1.679-2.519,2.839-2.519c0.32,0,1.013,0.025,1.013,1.052c0,0.866-1.159,3.692-1.159,4.079
+			c0,0.119,0.053,0.24,0.199,0.24c0.268,0,0.574-0.48,0.92-1.013L151.587,25.076z"/>
+		<path style="fill:#FFFFFF" d="M166.562,22.596l-0.36-0.026c-0.106-0.666-0.387-1.586-1.173-1.586c-0.706,0-0.706,0.652-0.706,0.72
+			c0,0.839,1.825,2.013,1.825,3.385c0,1.292-1.146,1.786-1.998,1.786c-0.587,0-0.92-0.266-1.227-0.266
+			c-0.053,0-0.32,0.039-0.387,0.266h-0.359l0.293-2.211l0.36,0.039c0.199,1.772,1.159,1.772,1.278,1.772
+			c0.507,0,0.76-0.398,0.76-0.732c0-0.346-0.319-0.879-0.746-1.373c-0.693-0.799-1.066-1.346-1.066-2.158
+			c0-1.187,0.92-1.666,1.786-1.666c0.666,0,0.826,0.293,1.267,0.293c0.199,0,0.239-0.054,0.373-0.28h0.386L166.562,22.596z"/>
+		<path style="fill:#FFFFFF" d="M183.493,22.596c0,1.985-1.653,4.278-3.785,4.278c-1.093,0-2.132-0.705-2.132-1.986
+			c0-2.053,1.719-4.344,3.824-4.344C181.907,20.544,183.493,20.81,183.493,22.596z M179.161,25.554c0,0.268,0,0.934,0.694,0.934
+			c1.278,0,2.052-3.705,2.052-4.705c0-0.666-0.293-0.852-0.64-0.852C179.828,20.931,179.161,24.702,179.161,25.554z"/>
+		<path style="fill:#FFFFFF" d="M194.643,20.917c1.359-0.119,1.772-0.146,2.665-0.372l-0.746,2.372l0.066,0.026
+			c0.4-0.8,1.188-2.398,2.066-2.398c0.053,0,0.772,0,0.772,0.879c0,0.613-0.373,0.973-0.786,0.973c-0.466,0-0.613-0.506-0.8-0.506
+			c-0.373,0-1.065,1.333-1.359,2.039c-0.347,0.893-0.479,1.532-0.906,2.771h-1.612c0.707-2.398,1.359-4.636,1.359-5.064
+			c0-0.333-0.24-0.346-0.72-0.359V20.917z"/>
+		<path style="fill:#FFFFFF" d="M213.214,21.277h-1.105c-0.44,1.626-1.16,3.958-1.16,4.412c0,0.16,0.187,0.199,0.2,0.199
+			c0.333,0,0.853-0.786,1.026-1.066l0.293,0.187c-0.494,0.774-1.146,1.813-2.187,1.813c-0.959,0-0.959-0.799-0.959-0.893
+			c0-0.547,0.64-2.546,1.227-4.652h-0.681V20.81c0.521-0.199,1.533-0.612,2.439-2.024h0.467l-0.52,1.932h0.959V21.277z"/>
+		<path style="fill:#FFFFFF" d="M226.346,25.008c-0.68,1.04-1.239,1.813-2.226,1.813c-0.773,0-0.92-0.574-0.92-0.893
+			c0-0.586,1.04-3.918,1.04-4.225c0-0.427-0.4-0.439-0.787-0.427v-0.36c0.534-0.039,1.786-0.159,2.692-0.372
+			c-0.52,1.905-1.333,4.717-1.333,5.144c0,0.133,0.121,0.199,0.201,0.199c0.319,0,0.771-0.666,1.039-1.066L226.346,25.008z
+			 M225.759,17.585c0.507,0,0.92,0.413,0.92,0.906c0,0.479-0.399,0.88-0.92,0.88c-0.626,0-0.879-0.56-0.879-0.906
+			C224.88,18.145,225.159,17.585,225.759,17.585z"/>
+		<path style="fill:#FFFFFF" d="M243.436,25.102c-0.254,0.452-0.999,1.719-2.119,1.719c-0.2,0-0.893,0-0.893-0.746
+			c0-0.574,0.16-1.027,0.293-1.427l-0.026-0.013c-1.014,1.413-1.572,2.186-2.586,2.186c-1.025,0-1.025-0.732-1.025-1.039
+			c0-0.92,0.999-3.345,0.999-4.119c0-0.347-0.293-0.36-0.746-0.387v-0.36c1.186-0.053,2.599-0.359,2.785-0.372l-1.253,4.104
+			c-0.16,0.507-0.199,0.654-0.199,0.894c0,0.252,0.133,0.318,0.307,0.318c0.532,0,1.345-1.265,1.519-1.584
+			c0.6-1.08,0.906-2.133,1.319-3.559h1.573c-0.268,0.934-1.374,4.518-1.374,4.944c0,0.227,0.134,0.254,0.2,0.254
+			c0.32,0,0.826-0.8,0.946-0.987L243.436,25.102z"/>
+		<path style="fill:#FFFFFF" d="M254.745,20.917c1.412-0.119,1.745-0.146,2.665-0.359l-0.8,2.479l0.04,0.027
+			c0.772-1.187,1.64-2.519,2.825-2.519c0.066,0,0.879,0,0.879,0.893c0,0.52-0.187,0.973-0.307,1.279l0.014,0.027
+			c0.68-1.08,1.466-2.199,2.559-2.199c0.733,0,1.054,0.466,1.054,1.052c0,0.88-1.187,3.599-1.187,4.118
+			c0,0.16,0.146,0.201,0.227,0.201c0.254,0,0.68-0.667,0.906-1.013l0.293,0.174c-0.413,0.707-1.026,1.746-2.092,1.746
+			c-0.227,0-0.934,0-0.934-0.867c0-0.972,1.173-3.811,1.173-4.13c0-0.16-0.106-0.307-0.319-0.307c-0.561,0-1.266,1.159-1.479,1.546
+			c-0.493,0.853-0.68,1.453-1.346,3.637h-1.6c1.026-3.318,1.466-4.49,1.466-4.864c0-0.253-0.159-0.319-0.253-0.319
+			c-0.093,0-1.572,0.333-2.812,5.183h-1.612c0.759-2.785,1.359-4.636,1.359-5.077c0-0.386-0.521-0.359-0.72-0.347V20.917z"/>
+		<path d="M123.286,1.771h2.012l-4.572,15.43h-0.206l-2.858-9.555l-2.857,9.555h-0.183l-4.572-15.43h2.012l2.743,9.396l1.874-6.332
+			l-0.914-3.063h2.012l2.743,9.396L123.286,1.771z"/>
+		<path d="M189.955,1.453h2.012l-4.572,15.43h-0.206l-2.856-9.555l-2.857,9.555h-0.184l-4.572-15.43h2.013l2.743,9.396l1.874-6.333
+			l-0.914-3.063h2.012l2.742,9.396L189.955,1.453z"/>
+		<path d="M244.878,1.453h2.012l-4.572,15.43h-0.205l-2.858-9.555l-2.857,9.555h-0.183l-4.572-15.43h2.012l2.743,9.396l1.874-6.333
+			l-0.914-3.063h2.012l2.744,9.396L244.878,1.453z"/>
+		<path d="M248.27,3.238h6.096v2.024h-4.048v2.438h4.048v2.048h-4.048v3.658h4.048v2.024h-6.096V3.238z"/>
+		<path d="M257.815,3.238h4.268c1.805,0,3.268,1.463,3.268,3.243c0,0.829-0.268,1.463-0.707,2.024
+			c0.927,0.707,1.512,1.731,1.512,3.072c0,2.122-1.73,3.853-3.853,3.853c-0.22,0-4.487,0-4.487,0V3.238z M259.863,7.701h2.22
+			c0.683,0,1.219-0.537,1.219-1.22c0-0.658-0.536-1.219-1.219-1.219c-0.171,0-2.22,0-2.22,0V7.701z M259.863,13.407h2.439
+			c0.999,0,1.829-0.829,1.829-1.829c0-1.024-0.83-1.829-1.829-1.829c-0.391,0-2.439,0-2.439,0V13.407z"/>
+		<path d="M130.116,3.042c2.756,0,4.268,2.829,4.268,6.292s-1.512,6.291-4.268,6.291c-2.731,0-4.268-2.828-4.268-6.291
+			S127.385,3.042,130.116,3.042z M130.116,13.602c1.17,0,2.122-1.926,2.122-4.267c0-2.341-0.951-4.268-2.122-4.268
+			c-1.146,0-2.122,1.926-2.122,4.268C127.994,11.675,128.97,13.602,130.116,13.602z"/>
+		<path d="M146.575,15.431h-2.487l-2.927-4.072c-0.487,0-1.487,0-1.487,0v4.072h-2.049V3.238h3.878c2.219,0,4.048,1.829,4.048,4.072
+			c0,1.561-0.878,2.926-2.194,3.609L146.575,15.431z M143.526,7.31c0-1.122-0.902-2.048-2.023-2.048c-0.22,0-1.829,0-1.829,0v4.072
+			h1.829C142.624,9.334,143.526,8.407,143.526,7.31z"/>
+		<path d="M151.256,13.407h4.048v2.024h-6.096V3.238h2.048V13.407z"/>
+		<path d="M156.724,3.238h2.853c3.024,0,5.487,2.731,5.487,6.097c0,3.365-2.463,6.096-5.487,6.096c-0.269,0-2.853,0-2.853,0V3.238z
+			 M158.771,13.407h0.805c1.78,0,3.243-1.829,3.243-4.072c0-2.244-1.463-4.072-3.243-4.072c-0.316,0-0.805,0-0.805,0V13.407z"/>
+		<path d="M200.331,3.238h2.854c3.023,0,5.487,2.731,5.487,6.097c0,3.365-2.464,6.096-5.487,6.096c-0.269,0-2.854,0-2.854,0V3.238z
+			 M202.38,13.407h0.805c1.78,0,3.243-1.829,3.243-4.072c0-2.244-1.463-4.072-3.243-4.072c-0.316,0-0.805,0-0.805,0V13.407z"/>
+		<path d="M211.913,3.238h6.097v2.024h-4.048v2.438h4.048v2.048h-4.048v3.658h4.048v2.024h-6.097V3.238z"/>
+		<rect x="194.518" y="3.188" width="1.786" height="12.203"/> 
+		<path style="fill-rule:evenodd;clip-rule:evenodd" d="M274.845,25.169c-0.659,0-1.251,0.238-1.699,0.693c-0.477,0.482-0.741,1.109-0.741,1.754
+			c0,0.646,0.252,1.244,0.714,1.713c0.469,0.477,1.074,0.734,1.727,0.734c0.639,0,1.258-0.258,1.74-0.729
+			c0.463-0.447,0.714-1.045,0.714-1.719c0-0.652-0.259-1.264-0.707-1.719C276.122,25.42,275.511,25.169,274.845,25.169z
+			 M276.973,27.638c0,0.564-0.218,1.086-0.619,1.475c-0.421,0.408-0.944,0.625-1.522,0.625c-0.544,0-1.081-0.225-1.481-0.633
+			c-0.401-0.408-0.626-0.932-0.626-1.488s0.231-1.102,0.646-1.521c0.389-0.395,0.911-0.606,1.482-0.606
+			c0.585,0,1.107,0.217,1.517,0.633C276.762,26.515,276.973,27.046,276.973,27.638z M274.913,26.183h-1.047v2.773h0.522v-1.184
+			h0.518l0.563,1.184h0.585l-0.618-1.264c0.4-0.082,0.632-0.355,0.632-0.75C276.068,26.44,275.688,26.183,274.913,26.183z
+			 M274.817,26.522c0.49,0,0.713,0.135,0.713,0.475c0,0.326-0.223,0.443-0.699,0.443h-0.442v-0.918H274.817z"/>
+		<path d="M93.451,0l1.056,6.42l-3.738,7.152c0,0-1.436-3.034-3.82-4.714c-2.009-1.416-3.318-1.723-5.364-1.301
+			c-2.628,0.542-5.608,3.685-6.908,7.559c-1.556,4.636-1.571,6.879-1.625,8.94c-0.087,3.304,0.434,5.256,0.434,5.256
+			s-2.27-4.199-2.249-10.349c0.015-4.389,0.704-8.371,2.736-12.299c1.787-3.454,4.443-5.526,6.8-5.77
+			c2.437-0.252,4.363,0.923,5.852,2.194c1.562,1.334,3.143,4.253,3.143,4.253L93.451,0z"/>
+		<path d="M93.911,36.329c0,0-1.653,2.953-2.682,4.091c-1.03,1.138-2.872,3.143-5.147,4.146c-2.275,1.001-3.468,1.191-5.716,0.975
+			c-2.246-0.216-4.334-1.517-5.066-2.06c-0.731-0.541-2.601-2.14-3.657-3.629c-1.057-1.49-2.709-4.471-2.709-4.471
+			s0.921,2.986,1.497,4.254c0.332,0.729,1.351,2.96,2.797,4.902c1.349,1.813,3.969,4.932,7.951,5.635
+			c3.982,0.705,6.719-1.083,7.396-1.517c0.677-0.433,2.104-1.628,3.007-2.594c0.943-1.009,1.835-2.296,2.33-3.067
+			c0.361-0.564,0.948-1.707,0.948-1.707L93.911,36.329z"/>
+		<path style="fill:#0C479D" d="M25.146,0.284l9.003,30.611l9.003-30.611h6.519L34.771,50.576h-0.621l-9.313-31.168l-9.314,31.168h-0.621
+			L0,0.284h6.519l9.003,30.611l6.085-20.614l-2.98-9.997H25.146z"/>
+		<path style="fill:#0C479D" d="M68.184,34.434c0,4.554-1.211,8.383-3.632,11.487c-2.422,3.104-5.558,4.655-9.407,4.655
+			c-2.898,0-5.423-0.921-7.576-2.763c-2.152-1.842-3.746-4.335-4.781-7.481l5.091-2.11c0.746,1.904,1.729,3.405,2.95,4.501
+			c1.221,1.097,2.659,1.645,4.315,1.645c1.738,0,3.208-0.972,4.409-2.917s1.801-4.284,1.801-7.017c0-3.022-0.642-5.36-1.925-7.017
+			c-1.491-1.945-3.83-2.918-7.017-2.918h-2.483v-2.98l8.693-15.026H48.128l-2.918,4.967h-1.862V0.284h24.215v3.042l-9.19,15.833
+			c3.229,1.036,5.671,2.919,7.326,5.652C67.354,27.542,68.184,30.749,68.184,34.434z"/>
+		<g>
+			<g>
+				<g>
+					<path d="M135.359,42.137h-4.523v1.736c0.018,0.145,0.018,0.249,0,0.313c-0.075,0.21-0.261,0.314-0.558,0.314
+						c-0.299,0-0.909-0.407-1.831-1.219c-0.922-0.814-1.382-1.357-1.382-1.631c0-0.146,0.093-0.272,0.278-0.385
+						c0.186-0.113,0.324-0.17,0.418-0.17h1.671v-3.802c0-0.337-0.105-0.602-0.318-0.794c-0.212-0.192-0.567-0.29-1.064-0.29
+						c-0.388,0-0.692,0.104-0.914,0.313s-0.332,0.503-0.332,0.886c0,0.271,0.067,0.552,0.202,0.838
+						c0.039,0.095,0.115,0.217,0.231,0.361h-1.27c-0.094-0.163-0.16-0.293-0.197-0.389c-0.151-0.323-0.226-0.59-0.226-0.799
+						c0-0.728,0.246-1.267,0.738-1.621c0.491-0.355,1.118-0.534,1.879-0.534c0.743,0,1.375,0.194,1.894,0.582
+						c0.52,0.387,0.78,0.887,0.78,1.499v3.75h4.523V42.137z M133.104,36.527h-1.116v-0.945h1.116V36.527z"/>
+				</g>
+				<g>
+					<path d="M139.753,36.527h-3.214v11.124h-1.404V36.527h-2.376v-0.945h6.995V36.527z"/>
+				</g>
+				<g>
+					<path d="M145.448,36.527h-3.215v11.124h-1.403V36.527h-2.376v-0.945h6.995V36.527z"/>
+				</g>
+				<g>
+					<path d="M156.204,36.527h-3.776v3.074c0,0.388-0.101,0.75-0.303,1.09c-0.205,0.34-0.556,0.614-1.056,0.822
+						c-0.259,0.114-0.514,0.198-0.763,0.253c-0.25,0.058-0.522,0.088-0.819,0.088c-0.352,0-0.646-0.042-0.888-0.128
+						c0.166,0.211,0.296,0.381,0.388,0.509c0.59,0.774,1.097,1.413,1.521,1.913c0.369,0.403,0.94,0.977,1.714,1.719
+						c0.24,0.227,0.572,0.541,0.996,0.945l-1.01,0.849c-0.628-0.6-1.307-1.285-2.036-2.061c-0.729-0.776-1.399-1.535-2.008-2.28
+						c-0.776-0.984-1.451-1.904-2.023-2.763c-0.203-0.289-0.434-0.653-0.692-1.092l1.082-0.701l1.082,1.649
+						c0.092,0.145,0.287,0.273,0.583,0.388c0.295,0.112,0.619,0.17,0.971,0.17c0.61,0,1.072-0.138,1.388-0.412
+						c0.313-0.273,0.471-0.634,0.471-1.087v-2.945h-6.875v-0.945h12.055V36.527z"/>
+				</g>
+				<g>
+					<path d="M163.116,36.527h-7.771v-0.945h7.771V36.527z M165.354,40.09h-5.216c-0.663,0-1.141,0.116-1.436,0.348
+						c-0.295,0.234-0.441,0.552-0.441,0.954c0,1.125,0.615,2.34,1.848,3.643c0.401,0.434,1.028,0.98,1.873,1.64l-0.886,0.796
+						c-0.939-0.708-1.642-1.304-2.101-1.789c-1.401-1.464-2.102-2.857-2.102-4.179c0-0.742,0.233-1.309,0.705-1.705
+						c0.47-0.393,1.092-0.592,1.866-0.592h5.889V40.09z"/>
+				</g>
+				<g>
+					<path d="M169.777,36.527h-3.214v11.124h-1.404V36.527h-2.377v-0.945h6.995V36.527z"/>
+				</g>
+				<g>
+					<path d="M175.486,36.527h-3.192v11.124h-1.404V36.527h-2.411v-0.945h2.391c-0.35-0.916-0.671-1.6-0.964-2.049
+						c-0.921-1.365-2.052-2.05-3.395-2.05c-0.625,0-1.09,0.17-1.393,0.507c-0.304,0.337-0.456,0.785-0.456,1.347
+						c0,0.546,0.145,1.099,0.432,1.66c0.091,0.177,0.235,0.4,0.433,0.674h-1.267c-0.221-0.291-0.378-0.533-0.47-0.727
+						c-0.33-0.612-0.495-1.154-0.495-1.622c0-0.921,0.284-1.613,0.856-2.08c0.571-0.468,1.345-0.704,2.321-0.704
+						c1.825,0,3.32,0.841,4.479,2.522c0.369,0.549,0.765,1.389,1.19,2.521h3.344V36.527z"/>
+				</g>
+				<g>
+					<path d="M184.403,44.03c-0.333,0.241-0.628,0.419-0.885,0.533c-0.776,0.357-1.635,0.537-2.574,0.537
+						c-1.551,0-2.755-0.447-3.613-1.342c-0.857-0.895-1.287-1.896-1.287-3.008c0.075,0.029,0.133,0.045,0.171,0.045
+						c0.316,0.074,0.57,0.112,0.758,0.112c0.729,0,1.29-0.145,1.684-0.438c0.466-0.337,0.701-0.861,0.701-1.571
+						c0-0.485-0.223-1.025-0.669-1.621c-0.148-0.194-0.371-0.444-0.669-0.751h-3.846v-0.945h8.172v0.945h-2.672
+						c0.242,0.322,0.419,0.589,0.531,0.798c0.371,0.646,0.555,1.196,0.555,1.646c0,1.066-0.514,1.856-1.545,2.372
+						c-0.334,0.161-0.858,0.322-1.577,0.484c0.185,0.531,0.378,0.926,0.579,1.182c0.627,0.806,1.539,1.208,2.737,1.208
+						c0.755,0,1.444-0.18,2.07-0.534c0.753-0.436,1.212-0.864,1.379-1.284V44.03z"/>
+				</g>
+				<g>
+					<path d="M188.993,36.527h-3.216v11.124h-1.404V36.527h-2.375v-0.945h6.995V36.527z"/>
+				</g>
+				<g>
+					<path d="M215.396,36.527h-8.921v3.529c0.221-0.279,0.424-0.483,0.607-0.614c0.57-0.41,1.252-0.614,2.041-0.614
+						c1.087,0,1.96,0.281,2.622,0.847c0.662,0.566,0.994,1.285,0.994,2.155c0,0.791-0.451,1.729-1.352,2.81
+						c-0.293,0.356-0.753,0.824-1.379,1.405l-1.158-0.73c0.549-0.468,0.95-0.858,1.206-1.166c0.804-0.924,1.207-1.742,1.207-2.456
+						c0-0.582-0.171-1.049-0.509-1.397c-0.341-0.349-0.831-0.521-1.473-0.521c-0.753,0-1.408,0.324-1.967,0.972
+						c-0.562,0.649-0.841,1.249-0.841,1.801v5.105h-1.403v-3.497c-0.238,0.191-0.442,0.333-0.605,0.429
+						c-0.57,0.303-1.179,0.453-1.818,0.453c-1.049,0-1.944-0.318-2.688-0.956c-0.744-0.634-1.115-1.405-1.115-2.308
+						s0.361-1.654,1.083-2.259c0.724-0.604,1.597-0.905,2.622-0.905c0.273,0,0.566,0.034,0.878,0.109
+						c0.092,0.015,0.22,0.051,0.385,0.11v1.07c-0.129-0.07-0.231-0.123-0.305-0.159c-0.294-0.124-0.57-0.187-0.829-0.187
+						c-0.664,0-1.232,0.21-1.713,0.632c-0.479,0.421-0.718,0.93-0.718,1.527c0,0.648,0.213,1.206,0.637,1.674
+						c0.426,0.472,0.98,0.704,1.665,0.704c0.628,0,1.164-0.168,1.606-0.507c0.61-0.469,0.916-0.886,0.916-1.259v-5.797h-8.172
+						v-0.945h18.496V36.527z"/>
+				</g>
+				<g>
+					<path d="M220.87,36.527h-3.216v11.124h-1.404V36.527h-2.375v-0.945h6.995V36.527z"/>
+				</g>
+				<g>
+					<path d="M229.798,44.03c-0.33,0.241-0.626,0.419-0.885,0.533c-0.773,0.357-1.633,0.537-2.572,0.537
+						c-1.551,0-2.755-0.447-3.611-1.342c-0.858-0.895-1.287-1.896-1.287-3.008c0.075,0.029,0.13,0.045,0.167,0.045
+						c0.32,0.074,0.572,0.112,0.76,0.112c0.729,0,1.29-0.145,1.684-0.438c0.468-0.337,0.701-0.861,0.701-1.571
+						c0-0.485-0.223-1.025-0.669-1.621c-0.15-0.194-0.371-0.444-0.668-0.751h-3.847v-0.945h8.172v0.945h-2.67
+						c0.242,0.322,0.417,0.589,0.527,0.798c0.371,0.646,0.559,1.196,0.559,1.646c0,1.066-0.518,1.856-1.549,2.372
+						c-0.33,0.161-0.856,0.322-1.577,0.484c0.186,0.531,0.378,0.926,0.583,1.182c0.626,0.806,1.539,1.208,2.735,1.208
+						c0.755,0,1.444-0.18,2.068-0.534c0.756-0.436,1.216-0.864,1.379-1.284V44.03z"/>
+				</g>
+				<g>
+					<path d="M234.388,36.527h-3.214v11.124h-1.404V36.527h-2.375v-0.945h6.993V36.527z"/>
+				</g>
+				<g>
+					<path d="M240.085,36.527h-3.216v11.124h-1.405V36.527h-2.375v-0.945h6.996V36.527z"/>
+				</g>
+				<g>
+					<path d="M238.137,31.033c-0.146-0.065-0.275-0.104-0.386-0.122c-0.331-0.081-0.68-0.119-1.048-0.119
+						c-0.514,0-0.931,0.135-1.253,0.402c-0.321,0.268-0.483,0.671-0.483,1.208c0,0.668,0.307,1.418,0.916,2.246
+						c0.203,0.263,0.508,0.604,0.913,1.028h-1.078c-0.148-0.05-0.497-0.455-1.051-1.215c-0.664-0.925-0.994-1.742-0.994-2.454
+						c0-0.794,0.304-1.368,0.909-1.727c0.496-0.291,1.158-0.436,1.983-0.436c0.403,0,0.79,0.046,1.156,0.141
+						c0.112,0.034,0.248,0.08,0.415,0.145V31.033z"/>
+				</g>
+				<g>
+					<path d="M251.558,36.527H239.78v-0.945h11.777V36.527z M252.608,40.539c-0.313,0.048-0.572,0.097-0.773,0.146
+						c-0.593,0.176-1.104,0.457-1.537,0.844c-0.435,0.384-0.807,0.842-1.122,1.37c-0.238,0.403-0.367,0.684-0.385,0.844
+						l-1.164-0.533l0.395-0.896l0.508-0.752c-0.13-0.274-0.518-0.572-1.161-0.897c-0.518-0.258-1.053-0.388-1.605-0.388
+						c-0.756,0-1.378,0.206-1.866,0.619c-0.488,0.411-0.733,0.965-0.733,1.659c0,1.099,0.756,2.115,2.263,3.052
+						c0.495,0.307,1.249,0.662,2.261,1.067l-0.664,1.04c-0.867,0-2.065-0.692-3.594-2.08c-1.09-0.984-1.633-2.033-1.633-3.146
+						c0-1.017,0.349-1.808,1.05-2.371c0.702-0.565,1.658-0.847,2.878-0.847c0.699,0,1.389,0.157,2.073,0.474
+						c0.681,0.319,1.171,0.665,1.466,1.037c0.184-0.145,0.332-0.25,0.44-0.313c0.37-0.243,0.664-0.411,0.886-0.51
+						c0.388-0.161,0.839-0.289,1.355-0.388c0.167-0.031,0.388-0.063,0.664-0.096V40.539z"/>
+				</g>
+				<g>
+					<path d="M257.114,36.527h-3.216v11.124h-1.402V36.527h-2.377v-0.945h6.995V36.527z"/>
+				</g>
+				<g>
+					<path d="M266.044,44.03c-0.332,0.241-0.627,0.419-0.886,0.533c-0.774,0.357-1.634,0.537-2.573,0.537
+						c-1.55,0-2.755-0.447-3.611-1.342c-0.858-0.895-1.287-1.896-1.287-3.008c0.075,0.029,0.131,0.045,0.169,0.045
+						c0.318,0.074,0.571,0.112,0.759,0.112c0.729,0,1.291-0.145,1.683-0.438c0.468-0.337,0.701-0.861,0.701-1.571
+						c0-0.485-0.222-1.025-0.668-1.621c-0.149-0.194-0.371-0.444-0.669-0.751h-3.846v-0.945h8.172v0.945h-2.669
+						c0.239,0.322,0.417,0.589,0.527,0.798c0.371,0.646,0.559,1.196,0.559,1.646c0,1.066-0.518,1.856-1.55,2.372
+						c-0.332,0.161-0.857,0.322-1.576,0.484c0.184,0.531,0.378,0.926,0.58,1.182c0.629,0.806,1.539,1.208,2.736,1.208
+						c0.756,0,1.443-0.18,2.07-0.534c0.754-0.436,1.214-0.864,1.379-1.284V44.03z"/>
+				</g>
+				<g>
+					<path d="M270.634,36.527h-3.214v11.124h-1.405V36.527h-2.376v-0.945h6.995V36.527z"/>
+				</g>
+			</g>
+		</g>
+	</g>
+</svg>
diff --git a/inst/rmd/slidy/Slidy2/graphics/face1.gif b/inst/rmd/slidy/Slidy2/graphics/face1.gif
new file mode 100644
index 0000000..04e50cd
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/face1.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/face2.gif b/inst/rmd/slidy/Slidy2/graphics/face2.gif
new file mode 100644
index 0000000..12d8240
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/face2.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/face3.gif b/inst/rmd/slidy/Slidy2/graphics/face3.gif
new file mode 100644
index 0000000..ac6e5e4
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/face3.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/face4.gif b/inst/rmd/slidy/Slidy2/graphics/face4.gif
new file mode 100644
index 0000000..3f68740
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/face4.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/fold-bright.gif b/inst/rmd/slidy/Slidy2/graphics/fold-bright.gif
new file mode 100644
index 0000000..7e38faa
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/fold-bright.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/fold-dim.bmp b/inst/rmd/slidy/Slidy2/graphics/fold-dim.bmp
new file mode 100644
index 0000000..117f91a
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/fold-dim.bmp differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/fold-dim.gif b/inst/rmd/slidy/Slidy2/graphics/fold-dim.gif
new file mode 100644
index 0000000..346fcbf
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/fold-dim.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/fold.bmp b/inst/rmd/slidy/Slidy2/graphics/fold.bmp
new file mode 100644
index 0000000..6ba9e56
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/fold.bmp differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/fold.gif b/inst/rmd/slidy/Slidy2/graphics/fold.gif
new file mode 100644
index 0000000..133e594
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/fold.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/icon-blue.png b/inst/rmd/slidy/Slidy2/graphics/icon-blue.png
new file mode 100644
index 0000000..58bf969
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/icon-blue.png differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/keys2.jpg b/inst/rmd/slidy/Slidy2/graphics/keys2.jpg
new file mode 100644
index 0000000..4739be0
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/keys2.jpg differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/nofold-dim.bmp b/inst/rmd/slidy/Slidy2/graphics/nofold-dim.bmp
new file mode 100644
index 0000000..8a12826
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/nofold-dim.bmp differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/nofold-dim.gif b/inst/rmd/slidy/Slidy2/graphics/nofold-dim.gif
new file mode 100644
index 0000000..996fb5e
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/nofold-dim.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/nofold.bmp b/inst/rmd/slidy/Slidy2/graphics/nofold.bmp
new file mode 100644
index 0000000..0937d32
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/nofold.bmp differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/unfold-bright.gif b/inst/rmd/slidy/Slidy2/graphics/unfold-bright.gif
new file mode 100644
index 0000000..2748131
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/unfold-bright.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/unfold-dim.bmp b/inst/rmd/slidy/Slidy2/graphics/unfold-dim.bmp
new file mode 100644
index 0000000..c2a6baf
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/unfold-dim.bmp differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/unfold-dim.gif b/inst/rmd/slidy/Slidy2/graphics/unfold-dim.gif
new file mode 100644
index 0000000..bee5671
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/unfold-dim.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/unfold.bmp b/inst/rmd/slidy/Slidy2/graphics/unfold.bmp
new file mode 100644
index 0000000..30af625
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/unfold.bmp differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/unfold.gif b/inst/rmd/slidy/Slidy2/graphics/unfold.gif
new file mode 100644
index 0000000..0753ae4
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/unfold.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.gif b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.gif
new file mode 100644
index 0000000..890bc97
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.svg b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.svg
new file mode 100644
index 0000000..6595d01
--- /dev/null
+++ b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-blue.svg
@@ -0,0 +1,14 @@
+<svg  xmlns="http://www.w3.org/2000/svg" viewBox="0 0 93 45" xmlns:xlink="http://www.w3.org/1999/xlink">
+      <a xlink:href="http://www.w3.org">
+      <desc>W3C logo</desc>
+          <rect width="103" height="65" fill="#90A7D0" x="-10"  y="-10"/>
+        	<g transform="translate(2,2)">
+        		<path d="M74.5,.2l0.8,5.1l-3,5.6c0,0-1.13-2.39-3-3.7 c-1.6-1.1-2.6-1.4-4.2-1 c-2.1,0.4-4.4,2.9-5.4,5.9 c-1.2,3.6-1.2,5.4-1.3,7c-0.07,2.6,0.3,4.14,0.3,4.1 s-1.8-3.3-1.8-8.1c0.01-3.5,0.6-6.6,2.2-9.7 c1.41-2.7,3.5-4.4,5.4-4.5 c1.9-0.2,3.4,0.7,4.6,1.7 c1.2,1,2.5,3.3,2.5,3.4z"/>
+        		<path d="M74.9,28.8c0,0-1.3,2.3-2.1,3.2c-.8.9-2.3,2.5-4.1,3.3 c-1.8.8-2.7.9-4.5,0.8 c-1.8-.2-3.4-1.2-4-1.6s-2-1.7-2.9-2.9 c-.8-1.2-2.1-3.5-2.1-3.5 s.7,2.4,1.2,3.3c.3.6,1.1,2.3,2.2,3.9c1.1,1.4,3.1,3.9,6.3,4.4 c3.1,.6,5.3-.9,5.8-1.2c.5-.3,1.7-1.3,2.4-2.1 c.7-.8,1.4-1.8,1.8-2.4c.3-.4,0.7-1.3.7-1.3z"/>
+        		<path fill="#0C479D" d="M20.7,0.43l7.1,24.1l7.1-24.1 h5.1l-11.7,39.6h-.5l-7.35-24.5l-7.35,24.5h-.5l-11.7-39.6h5.1l7.1,24.1l4.8-16.2l-2.3-7.9z"/>
+        		<path fill="#0C479D" d="M54.6,27.3c0,3.6-1,6.6-2.9,9 c-1.9,2.4-4.4,3.7-7.4,3.7 c-2.3,0-4.3-0.7-5.9-2.2 c-1.7-1.4-2.9-3.4-3.8-5.9l4-1.7c.6,1.5,1.4,2.7,2.3,3.5 c1,.9,2.1,1.3,3.4,1.3c1.4,0,2.5-.8,3.5-2.3 c.9-1.5,1.4-3.4,1.4-5.5 c0-2.4-.5-4.2-1.5-5.5 c-1.2-1.5-3-2.3-5.5-2.3h-2v-2.3l6.8-11.8h-8.2l-2.3,3.9 h-1.5v-8.7h19.1v2.4l-7.2,12.5c2.5.8,4.5,2.3,5.8,4.4 c1.3,2.1,2,4.7,1.9,7.5z"/>
+        		<text x="78" y="10" font-size="13" font-family="sans-serif">®</text>
+        	</g>
+     </a>
+</svg>
+
diff --git a/inst/rmd/slidy/Slidy2/graphics/w3c-logo-slanted.jpg b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-slanted.jpg
new file mode 100644
index 0000000..54e0ac3
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-slanted.jpg differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.gif b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.gif
new file mode 100644
index 0000000..3b3c6fd
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.gif differ
diff --git a/inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.svg b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.svg
new file mode 100644
index 0000000..d63907f
--- /dev/null
+++ b/inst/rmd/slidy/Slidy2/graphics/w3c-logo-white.svg
@@ -0,0 +1,14 @@
+<svg  xmlns="http://www.w3.org/2000/svg" viewBox="0 0 93 45" xmlns:xlink="http://www.w3.org/1999/xlink">
+      <a xlink:href="http://www.w3.org">
+      <desc>W3C logo</desc>
+          <rect width="103" height="65" fill="#728ec2" x="-10"  y="-10"/>
+        	<g transform="translate(2,2)">
+        		<path fill="#FFFFFF" d="M74.5,.2l0.8,5.1l-3,5.6c0,0-1.13-2.39-3-3.7 c-1.6-1.1-2.6-1.4-4.2-1 c-2.1,0.4-4.4,2.9-5.4,5.9 c-1.2,3.6-1.2,5.4-1.3,7c-0.07,2.6,0.3,4.14,0.3,4.1 s-1.8-3.3-1.8-8.1c0.01-3.5,0.6-6.6,2.2-9.7 c1.41-2.7,3.5-4.4,5.4-4.5 c1.9-0.2,3.4,0.7,4.6,1.7 c1.2,1,2.5,3.3,2.5,3.4z"/>
+        		<path fill="#FFFFFF" d="M74.9,28.8c0,0-1.3,2.3-2.1,3.2c-.8.9-2.3,2.5-4.1,3.3 c-1.8.8-2.7.9-4.5,0.8 c-1.8-.2-3.4-1.2-4-1.6s-2-1.7-2.9-2.9 c-.8-1.2-2.1-3.5-2.1-3.5 s.7,2.4,1.2,3.3c.3.6,1.1,2.3,2.2,3.9c1.1,1.4,3.1,3.9,6.3,4.4 c3.1,.6,5.3-.9,5.8-1.2c.5-.3,1.7-1.3,2.4-2.1 c.7-.8,1.4-1.8,1.8-2.4c.3-.4,0.7-1.3.7-1.3z"/>
+        		<path fill="#FFFFFF" d="M20.7,0.43l7.1,24.1l7.1-24.1 h5.1l-11.7,39.6h-.5l-7.35-24.5l-7.35,24.5h-.5l-11.7-39.6h5.1l7.1,24.1l4.8-16.2l-2.3-7.9z"/>
+        		<path fill="#FFFFFF" d="M54.6,27.3c0,3.6-1,6.6-2.9,9 c-1.9,2.4-4.4,3.7-7.4,3.7 c-2.3,0-4.3-0.7-5.9-2.2 c-1.7-1.4-2.9-3.4-3.8-5.9l4-1.7c.6,1.5,1.4,2.7,2.3,3.5 c1,.9,2.1,1.3,3.4,1.3c1.4,0,2.5-.8,3.5-2.3 c.9-1.5,1.4-3.4,1.4-5.5 c0-2.4-.5-4.2-1.5-5.5 c-1.2-1.5-3-2.3-5.5-2.3h-2v-2.3l6.8-11.8h-8.2l-2.3,3.9 h-1.5v-8.7h19.1v2.4l-7.2,12.5c2.5.8,4.5,2.3,5.8,4.4 c1.3,2.1,2,4.7,1.9,7.5z"/>
+        		<text x="78" y="10" font-size="13" font-family="sans-serif">®</text>
+        	</g>
+     </a>
+</svg>
+
diff --git a/inst/rmd/slidy/Slidy2/scripts/img.srcset.js b/inst/rmd/slidy/Slidy2/scripts/img.srcset.js
new file mode 100644
index 0000000..b83e5ac
--- /dev/null
+++ b/inst/rmd/slidy/Slidy2/scripts/img.srcset.js
@@ -0,0 +1,153 @@
+/* imgsrcset - Img srcset polyfill for resolution responsive images. Authors & copyright (c) 2012: WebLinc, David Knight. */
+
+// Imgsrcset
+(function(win) {
+    'use strict';
+
+    var _viewport       = win.document.documentElement,
+        _srcsetID       = 0,
+        _srcsets        = [],
+        _eventPrefix    = '',
+        _addEvent       = win.addEventListener || (_eventPrefix = 'on') && win.attachEvent,
+        _removeEvent    = win.removeEventListener || win.detachEvent,
+        _srcExpr        = /[^\s]+/g,
+        _digitExpr      = /[0-9\.]+/g,
+        _timer          = 0,
+
+        /*
+            _matches
+        */
+        _matches    = function(srcset) {
+            var srcList     = (srcset.indexOf(',') !== -1 && srcset.split(',')) || [srcset],
+                srcIndex    = srcList.length - 1,
+                srcLength   = srcIndex,
+
+                list        = null,
+                listIndex   = 0,
+
+                src         = '',
+                media       = '';
+
+            if (srcIndex < 0) {
+                return;
+            }
+
+            do {
+                var list        = srcList[srcLength - srcIndex].match(_srcExpr) || [],
+                    listIndex   = list.length;
+
+                while (listIndex--) {
+                    var item    = list[listIndex],
+                        feature = 0,
+                        digits  = 0;
+
+                    if (listIndex > 0) {
+                        feature =   (item.indexOf('w') !== -1 && (win.innerWidth || _viewport.clientWidth)) || 
+                                    (item.indexOf('h') !== -1 && (win.innerHeight ||  _viewport.clientHeight)) || 
+                                    (item.indexOf('x') !== -1 && (win.devicePixelRatio || 1));
+
+                        digits  = Number(item.match(_digitExpr));
+
+                        if (feature && digits && digits > feature) {
+                            break;
+                        }
+                    } else {
+                        src     = item;
+                        media   = srcList[srcIndex];
+                    }
+                }
+            } while (srcIndex--);
+
+            return (src && media && {src: src, media: media}) || false;
+        },
+
+        /*
+            watch
+        */
+        _watch      = function(evt) {
+            clearTimeout(_timer);
+
+            _timer = setTimeout(function() {
+                var srcset          = null,
+                    srcsetIndex     = _srcsetID - 1,
+                    srcsetLength    = srcsetIndex,
+                    match           = false;
+
+                do {
+                    srcset = _srcsets[srcsetLength - srcsetIndex];
+
+                    // If img element does not have a parent, remove array index to prevent caching
+                    if (!srcset.element.parentNode) {
+                        _srcsetID--;
+                        srcset.splice(srcsetIndex, 1);
+                        continue;
+                    }
+
+                    match = _matches(srcset.media);
+
+                    if (match && (srcset.matches !== match.media)) {
+                        srcset.matches = match.media;
+
+                        srcset.element.src = match.src;
+                    } else if (!match) {
+                        srcset.matches = false;
+                        srcset.src && (srcset.element.src = srcset.src);
+                    }
+                } while(srcsetIndex--);
+            }, 10);
+        },
+
+        /*
+            init
+        */
+        _init        = function() {
+            _removeEvent(_eventPrefix + 'load', _init);
+
+            win.Imgsrcset.parse();
+            _watch();
+
+            // Processes '_srcsets' array and determines which source to use
+            // '_watch' will clear out any images from the array that do not have parents, which should eliminate element caching
+            _addEvent(_eventPrefix + 'resize', _watch);
+            _addEvent(_eventPrefix + 'orientationchange', _watch);
+        };
+
+    /*
+        imgsrcset
+    */
+    win.Imgsrcset = {
+        /*
+            parse
+            
+            Called on '_init' and can also be called if new images are added/removed
+         */
+        parse: function() {
+            _srcsets = [];
+
+            var imgs        = win.document.getElementsByTagName('img') || [],
+                imgIndex    = imgs.length - 1,
+                imgLength   = imgIndex,
+                img         = null,
+                srcset      = '';
+
+            do {
+                img     = imgs[imgLength - imgIndex];
+                srcset  = img.getAttribute('srcset') || '';
+
+                if (!srcset) {
+                    continue;
+                }
+
+                _srcsetID = _srcsets.push({
+                    element     : img,
+                    media       : srcset,
+                    matches     : false,
+                    src         : img.getAttribute('src') || ''
+                });
+            } while(imgIndex--);
+        }
+    };
+
+    // Set up listeners
+    _addEvent(_eventPrefix + 'load', _init);
+})(window);
diff --git a/inst/rmd/slidy/Slidy2/scripts/slidy-irc.js b/inst/rmd/slidy/Slidy2/scripts/slidy-irc.js
new file mode 100644
index 0000000..b628642
--- /dev/null
+++ b/inst/rmd/slidy/Slidy2/scripts/slidy-irc.js
@@ -0,0 +1,49 @@
+var slidy_irc = {
+  shown: [],
+  pin_regex: /^\d{4}$/,
+
+  start: function ()
+  {
+    w3c_slidy.add_observer(function(number, title, url) {
+      var pin = document.getElementById('slidy_pin');
+
+      if (pin.value && slidy_irc.pin_regex.test(pin.value) && slidy_irc.unposted(number))
+      {
+        slidy_irc.post("https://www.w3.org/Talks/Tools/slidy-irc.php?" +
+          "pin=" + escape(pin.value) +
+          "&slide=" + number + 
+          "&title=" + escape(title) +
+          "&uri=" + escape(url));
+        slidy_irc.shown.push(number);
+      }
+    });
+
+    var pin = document.getElementById('slidy_pin');
+
+    pin.addEventListener('change', function () {
+      if (slidy_irc.pin_regex.test(pin.value))
+      {
+        w3c_slidy.notify_observers();
+        pin.blur();
+      }
+      else
+        alert("The PIN should be a 4 digit number");
+    }, false);
+  },
+
+  post: function (url)
+  {
+    var req = new XMLHttpRequest();
+    req.open("POST", url, true);
+    req.send();
+  },
+
+  unposted: function (number)
+  {
+    return this.shown.indexOf(number) < 0;
+  }
+}
+
+window.addEventListener("load", function() { slidy_irc.start(); }, false); 
+document.write('<p id="slidy_irc" title="for notifying slide turns to IRC"'+
+  '<label>Presenter PIN: <input id="slidy_pin" type="password"></label></p>');
diff --git a/inst/rmd/slidy/Slidy2/scripts/slidy.js b/inst/rmd/slidy/Slidy2/scripts/slidy.js
new file mode 100644
index 0000000..c14eb64
--- /dev/null
+++ b/inst/rmd/slidy/Slidy2/scripts/slidy.js
@@ -0,0 +1,3079 @@
+/* slidy.js
+
+   Copyright (c) 2005-2013 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+   W3C liability, trademark, document use and software licensing
+   rules apply, see:
+
+   http://www.w3.org/Consortium/Legal/copyright-documents
+   http://www.w3.org/Consortium/Legal/copyright-software
+
+   Defines single name "w3c_slidy" in global namespace
+   Adds event handlers without trampling on any others
+*/
+
+// the slidy object implementation
+var w3c_slidy = {
+  // classify which kind of browser we're running under
+  ns_pos: (typeof window.pageYOffset!='undefined'),
+  khtml: ((navigator.userAgent).indexOf("KHTML") >= 0 ? true : false),
+  opera: ((navigator.userAgent).indexOf("Opera") >= 0 ? true : false),
+  ipad: ((navigator.userAgent).indexOf("iPad") >= 0 ? true : false),
+  iphone: ((navigator.userAgent).indexOf("iPhone") >= 0 ? true : false),
+  android: ((navigator.userAgent).indexOf("Android") >= 0 ? true : false),
+  ie: (typeof document.all != "undefined" && !this.opera),
+  ie6: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 6") != -1),
+  ie7: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 7") != -1),
+  ie8: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 8") != -1),
+  ie9: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 9") != -1),
+
+  // data for swipe and double tap detection on touch screens
+  last_tap: 0,
+  prev_tap: 0,
+  start_x: 0,
+  start_y: 0,
+  delta_x: 0,
+  delta_y: 0,
+
+  // are we running as XHTML? (doesn't work on Opera)
+  is_xhtml: /xml/.test(document.contentType),
+
+  slide_number: 0, // integer slide count: 0, 1, 2, ...
+  slide_number_element: null, // element containing slide number
+  slides: [], // set to array of slide div's
+  notes: [], // set to array of handout div's
+  backgrounds: [], // set to array of background div's
+  observers: [], // list of observer functions
+  toolbar: null, // element containing toolbar
+  title: null, // document title
+  last_shown: null, // last incrementally shown item
+  eos: null,  // span element for end of slide indicator
+  toc: null, // table of contents
+  outline: null, // outline element with the focus
+  selected_text_len: 0, // length of drag selection on document
+  view_all: 0,  // 1 to view all slides + handouts
+  want_toolbar: true,  // user preference to show/hide toolbar
+  mouse_click_enabled: true, // enables left click for next slide
+  scroll_hack: 0, // IE work around for position: fixed
+  disable_slide_click: false,  // used by clicked anchors
+
+  lang: "en", // updated to language specified by html file
+
+  help_anchor: null, // used for keyboard focus hack in showToolbar()
+  help_page: "http://www.w3.org/Talks/Tools/Slidy2/help/help.html",
+  help_text: "Navigate with mouse click, space bar, Cursor Left/Right, " +
+             "or Pg Up and Pg Dn. Use S and B to change font size.",
+
+  size_index: 0,
+  size_adjustment: 0,
+  sizes:  new Array("10pt", "12pt", "14pt", "16pt", "18pt", "20pt",
+                    "22pt", "24pt", "26pt", "28pt", "30pt", "32pt"),
+
+  // needed for efficient resizing
+  last_width: 0,
+  last_height: 0,
+
+
+  // Needed for cross browser support for relative width/height on
+  // object elements. The work around is to save width/height attributes
+  // and then to recompute absolute width/height dimensions on resizing
+   objects: [],
+
+  // attach initialiation event handlers
+  set_up: function () {
+    var init = function() { w3c_slidy.init(); };
+    if (typeof window.addEventListener != "undefined")
+      window.addEventListener("load", init, false);
+    else
+      window.attachEvent("onload", init);
+  },
+
+  hide_slides: function () {
+    if (document.body && !w3c_slidy.initialized)
+      document.body.style.visibility = "hidden";
+    else
+      setTimeout(w3c_slidy.hide_slides, 50);
+  },
+
+  // hack to persuade IE to compute correct document height
+  // as needed for simulating fixed positioning of toolbar
+  ie_hack: function () {
+    window.resizeBy(0,-1);
+    window.resizeBy(0, 1);
+  },
+
+  init: function () {
+    //alert("slidy starting test 10");
+    document.body.style.visibility = "visible";
+    this.init_localization();
+    this.add_toolbar();
+    this.wrap_implicit_slides();
+    this.collect_slides();
+    this.collect_notes();
+    this.collect_backgrounds();
+    this.objects = document.body.getElementsByTagName("object");
+    this.patch_anchors();
+    this.slide_number = this.find_slide_number(location.href);
+    window.offscreenbuffering = true;
+    this.size_adjustment = this.find_size_adjust();
+    this.time_left = this.find_duration();
+    this.hide_image_toolbar();  // suppress IE image toolbar popup
+    this.init_outliner();  // activate fold/unfold support
+    this.title = document.title;
+    this.keyboardless = (this.ipad||this.iphone||this.android);
+
+    if (this.keyboardless)
+    {
+      w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden")
+      this.want_toolbar = 0;
+    }
+
+    // work around for opera bug
+    this.is_xhtml = (document.body.tagName == "BODY" ? false : true);
+
+    if (this.slides.length > 0)
+    {
+      var slide = this.slides[this.slide_number];
+   
+      if (this.slide_number > 0)
+      {
+        this.set_visibility_all_incremental("visible");
+        this.last_shown = this.previous_incremental_item(null);
+        this.set_eos_status(true);
+      }
+      else
+      {
+        this.last_shown = null;
+        this.set_visibility_all_incremental("hidden");
+        this.set_eos_status(!this.next_incremental_item(this.last_shown));
+      }
+
+      this.set_location();
+      this.add_class(this.slides[0], "first-slide");
+      w3c_slidy.show_slide(slide);
+    }
+
+    this.toc = this.table_of_contents();
+
+    this.add_initial_prompt();
+
+    // bind event handlers without interfering with custom page scripts
+    // Tap events behave too weirdly to support clicks reliably on
+    // iPhone and iPad, so exclude these from click handler
+
+    if (!this.keyboardless)
+    {
+      this.add_listener(document.body, "click", this.mouse_button_click);
+      this.add_listener(document.body, "mousedown", this.mouse_button_down);
+    }
+
+    this.add_listener(document, "keydown", this.key_down);
+    this.add_listener(document, "keypress", this.key_press);
+    this.add_listener(window, "resize", this.resized);
+    this.add_listener(window, "scroll", this.scrolled);
+    this.add_listener(window, "unload", this.unloaded);
+
+    this.add_listener(document, "gesturechange", function ()
+    {
+      return false;
+    });
+
+    this.attach_touch_handers(this.slides);
+
+    // this seems to be a debugging hack
+    //if (!document.body.onclick)
+    //  document.body.onclick = function () { };
+
+    this.single_slide_view();
+
+    //this.set_location();
+
+    this.resized();
+
+    if (this.ie7)
+      setTimeout(w3c_slidy.ie_hack, 100);
+
+    this.show_toolbar();
+
+    // for back button detection
+    setInterval(function () { w3c_slidy.check_location(); }, 200);
+    w3c_slidy.initialized = true;
+  },
+
+  // create div element with links to each slide
+  table_of_contents: function () {
+    var toc = this.create_element("div");
+    this.add_class(toc, "slidy_toc hidden");
+    //toc.setAttribute("tabindex", "0");
+
+    var heading = this.create_element("div");
+    this.add_class(heading, "toc-heading");
+    heading.innerHTML = this.localize("Table of Contents");
+
+    toc.appendChild(heading);
+    var previous = null;
+
+    for (var i = 0; i < this.slides.length; ++i)
+    {
+      var title = this.has_class(this.slides[i], "title");
+      var num = document.createTextNode((i + 1) + ". ");
+
+      toc.appendChild(num);
+
+      var a = this.create_element("a");
+      a.setAttribute("href", "#(" + (i+1) + ")");
+
+      if (title)
+        this.add_class(a, "titleslide");
+
+      var name = document.createTextNode(this.slide_name(i));
+      a.appendChild(name);
+      a.onclick = w3c_slidy.toc_click;
+      a.onkeydown = w3c_slidy.toc_key_down;
+      a.previous = previous;
+
+      if (previous)
+        previous.next = a;
+
+      toc.appendChild(a);
+
+      if (i == 0)
+        toc.first = a;
+
+      if (i < this.slides.length - 1)
+      {
+        var br = this.create_element("br");
+        toc.appendChild(br);
+      }
+
+      previous = a;
+    }
+
+    toc.focus = function () {
+      if (this.first)
+        this.first.focus();
+    }
+
+    toc.onmouseup = w3c_slidy.mouse_button_up;
+
+    toc.onclick = function (e) {
+      e||(e=window.event);
+
+      if (w3c_slidy.selected_text_len <= 0)
+         w3c_slidy.hide_table_of_contents(true);
+
+      w3c_slidy.stop_propagation(e);
+    
+      if (e.cancel != undefined)
+        e.cancel = true;
+      
+      if (e.returnValue != undefined)
+        e.returnValue = false;
+      
+      return false;
+    };
+
+    document.body.insertBefore(toc, document.body.firstChild);
+    return toc;
+  },
+
+  is_shown_toc: function () {
+    return !w3c_slidy.has_class(w3c_slidy.toc, "hidden");
+  },
+
+  show_table_of_contents: function () {
+    w3c_slidy.remove_class(w3c_slidy.toc, "hidden");
+    var toc = w3c_slidy.toc;
+    toc.focus();
+
+    if (w3c_slidy.ie7 && w3c_slidy.slide_number == 0)
+      setTimeout(w3c_slidy.ie_hack, 100);
+  },
+
+  hide_table_of_contents: function (focus) {
+    w3c_slidy.add_class(w3c_slidy.toc, "hidden");
+
+    if (focus && !w3c_slidy.opera &&
+        !w3c_slidy.has_class(w3c_slidy.toc, "hidden"))
+      w3c_slidy.set_focus();
+  },
+
+  toggle_table_of_contents: function () {
+    if (w3c_slidy.is_shown_toc())
+      w3c_slidy.hide_table_of_contents(true);
+    else
+      w3c_slidy.show_table_of_contents();
+  },
+
+  // called on clicking toc entry
+  toc_click: function (e) {
+    if (!e)
+      e = window.event;
+
+    var target = w3c_slidy.get_target(e);
+
+    if (target && target.nodeType == 1)
+    {
+      var uri = target.getAttribute("href");
+
+      if (uri)
+      {
+        //alert("going to " + uri);
+        var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+        w3c_slidy.hide_slide(slide);
+        w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri);
+        slide = w3c_slidy.slides[w3c_slidy.slide_number];
+        w3c_slidy.last_shown = null;
+        w3c_slidy.set_location();
+        w3c_slidy.set_visibility_all_incremental("hidden");
+        w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
+        w3c_slidy.show_slide(slide);
+        //target.focus();
+
+        try
+        {
+          if (!w3c_slidy.opera)
+            w3c_slidy.set_focus();
+        }
+        catch (e)
+        {
+        }
+      }
+    }
+
+    w3c_slidy.hide_table_of_contents(true);
+    if (w3c_slidy.ie7) w3c_slidy.ie_hack();
+    w3c_slidy.stop_propagation(e);
+    return w3c_slidy.cancel(e);
+  },
+
+  // called onkeydown for toc entry
+  toc_key_down: function (event) {
+    var key;
+
+    if (!event)
+      var event = window.event;
+
+    // kludge around NS/IE differences 
+    if (window.event)
+      key = window.event.keyCode;
+    else if (event.which)
+      key = event.which;
+    else
+      return true; // Yikes! unknown browser
+
+    // ignore event if key value is zero
+    // as for alt on Opera and Konqueror
+    if (!key)
+      return true;
+
+    // check for concurrent control/command/alt key
+    // but are these only present on mouse events?
+
+    if (event.ctrlKey || event.altKey)
+      return true;
+
+    if (key == 13)
+    {
+      var uri = this.getAttribute("href");
+
+      if (uri)
+      {
+        //alert("going to " + uri);
+       var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+        w3c_slidy.hide_slide(slide);
+        w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri);
+        slide = w3c_slidy.slides[w3c_slidy.slide_number];
+        w3c_slidy.last_shown = null;
+        w3c_slidy.set_location();
+        w3c_slidy.set_visibility_all_incremental("hidden");
+        w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
+        w3c_slidy.show_slide(slide);
+        //target.focus();
+
+        try
+        {
+          if (!w3c_slidy.opera)
+            w3c_slidy.set_focus();
+        }
+        catch (e)
+        {
+        }
+      }
+
+      w3c_slidy.hide_table_of_contents(true);
+
+      if (self.ie7)
+       w3c_slidy.ie_hack();
+
+      return w3c_slidy.cancel(event);
+    }
+
+    if (key == 40 && this.next)
+    {
+      this.next.focus();
+      return w3c_slidy.cancel(event);
+    }
+
+    if (key == 38 && this.previous)
+    {
+      this.previous.focus();
+      return w3c_slidy.cancel(event);
+    }
+
+    return true;
+  },
+
+  touchstart: function (e)
+  {
+    // a double touch often starts with a
+    // single touch due to fingers touching
+    // down at slightly different times
+    // thus avoid calling preventDefault here
+    this.prev_tap = this.last_tap;
+    this.last_tap = (new Date).getTime();
+
+    var tap_delay = this.last_tap - this.prev_tap;
+
+    if (tap_delay <= 200)
+    {
+      // double tap
+    }
+
+    var touch = e.touches[0];
+
+    this.pageX = touch.pageX;
+    this.pageY = touch.pageY;
+    this.screenX = touch.screenX;
+    this.screenY = touch.screenY;
+    this.clientX = touch.clientX;
+    this.clientY = touch.clientY;
+
+    this.delta_x = this.delta_y = 0;
+  },
+
+  touchmove: function (e)
+  {
+    // override native gestures for single touch
+    if (e.touches.length > 1)
+      return;
+
+    e.preventDefault();
+    var touch = e.touches[0];
+    this.delta_x = touch.pageX - this.pageX;
+    this.delta_y = touch.pageY - this.pageY;
+  },
+
+  touchend: function (e)
+  {
+    // default behavior for multi-touch
+    if (e.touches.length > 1)
+      return;
+
+    var delay = (new Date).getTime() - this.last_tap;
+    var dx = this.delta_x;
+    var dy = this.delta_y;
+    var abs_dx = Math.abs(dx);
+    var abs_dy = Math.abs(dy);
+
+    if (delay < 500 && (abs_dx > 100 || abs_dy > 100))
+    {
+      if (abs_dx > 0.5 * abs_dy)
+      {
+        e.preventDefault();
+
+        if (dx < 0)
+          w3c_slidy.next_slide(true);
+        else
+          w3c_slidy.previous_slide(true);
+      }
+      else if (abs_dy > 2 * abs_dx)
+      {
+        e.preventDefault();
+        w3c_slidy.toggle_table_of_contents();
+      }
+    }
+  },
+
+  // ### OBSOLETE ###
+  before_print: function () {
+    this.show_all_slides();
+    this.hide_toolbar();
+    alert("before print");
+  },
+
+  // ### OBSOLETE ###
+  after_print: function () {
+    if (!this.view_all)
+    {
+      this.single_slide_view();
+      this.show_toolbar();
+    }
+    alert("after print");
+  },
+
+  // ### OBSOLETE ###
+  print_slides: function () {
+    this.before_print();
+    window.print();
+    this.after_print();
+  },
+
+  // ### OBSOLETE ?? ###
+  toggle_view: function () {
+    if (this.view_all)
+    {
+      this.single_slide_view();
+      this.show_toolbar();
+      this.view_all = 0;
+    }
+    else
+    {
+      this.show_all_slides();
+      this.hide_toolbar();
+      this.view_all = 1;
+    }
+  },
+
+  // prepare for printing  ### OBSOLETE ###
+  show_all_slides: function () {
+    this.remove_class(document.body, "single_slide");
+    this.set_visibility_all_incremental("visible");
+  },
+
+  // restore after printing  ### OBSOLETE ###
+  single_slide_view: function () {
+    this.add_class(document.body, "single_slide");
+    this.set_visibility_all_incremental("visible");
+    this.last_shown = this.previous_incremental_item(null);
+  },
+
+  // suppress IE's image toolbar pop up
+  hide_image_toolbar: function () {
+    if (!this.ns_pos)
+    {
+      var images = document.getElementsByTagName("IMG");
+
+      for (var i = 0; i < images.length; ++i)
+        images[i].setAttribute("galleryimg", "no");
+    }
+  },
+
+  unloaded: function (e) {
+    //alert("unloaded");
+  },
+
+  // Safari and Konqueror don't yet support getComputedStyle()
+  // and they always reload page when location.href is updated
+  is_KHTML: function () {
+    var agent = navigator.userAgent;
+    return (agent.indexOf("KHTML") >= 0 ? true : false);
+  },
+
+  // find slide name from first h1 element
+  // default to document title + slide number
+  slide_name: function (index) {
+    var name = null;
+    var slide = this.slides[index];
+
+    var heading = this.find_heading(slide);
+
+    if (heading)
+      name = this.extract_text(heading);
+
+    if (!name)
+      name = this.title + "(" + (index + 1) + ")";
+
+    name.replace(/\&/g, "&");
+    name.replace(/\</g, "<");
+    name.replace(/\>/g, ">");
+
+    return name;
+  },
+
+  // find first h1 element in DOM tree
+  find_heading: function (node) {
+    if (!node || node.nodeType != 1)
+      return null;
+
+    if (node.nodeName == "H1" || node.nodeName == "h1")
+      return node;
+
+    var child = node.firstChild;
+
+    while (child)
+    {
+      node = this.find_heading(child);
+
+      if (node)
+        return node;
+
+      child = child.nextSibling;
+    }
+
+    return null;
+  },
+
+  // recursively extract text from DOM tree
+  extract_text: function (node) {
+    if (!node)
+      return "";
+
+    // text nodes
+    if (node.nodeType == 3)
+      return node.nodeValue;
+
+    // elements
+    if (node.nodeType == 1)
+    {
+      node = node.firstChild;
+      var text = "";
+
+      while (node)
+      {
+        text = text + this.extract_text(node);
+        node = node.nextSibling;
+      }
+
+      return text;
+    }
+
+    return "";
+  },
+
+  // find copyright text from meta element
+  find_copyright: function () {
+    var name, content;
+    var meta = document.getElementsByTagName("meta");
+
+    for (var i = 0; i < meta.length; ++i)
+    {
+      name = meta[i].getAttribute("name");
+      content = meta[i].getAttribute("content");
+
+      if (name == "copyright")
+        return content;
+    }
+
+    return null;
+  },
+
+  find_size_adjust: function () {
+    var name, content, offset;
+    var meta = document.getElementsByTagName("meta");
+
+    for (var i = 0; i < meta.length; ++i)
+    {
+      name = meta[i].getAttribute("name");
+      content = meta[i].getAttribute("content");
+
+      if (name == "font-size-adjustment")
+        return 1 * content;
+    }
+
+    return 1;
+  },
+
+  // <meta name="duration" content="20" />  for 20 minutes
+  find_duration: function () {
+    var name, content, offset;
+    var meta = document.getElementsByTagName("meta");
+
+    for (var i = 0; i < meta.length; ++i)
+    {
+      name = meta[i].getAttribute("name");
+      content = meta[i].getAttribute("content");
+
+      if (name == "duration")
+        return 60000 * content;
+    }
+
+    return null;
+  },
+
+  replace_by_non_breaking_space: function (str) {
+    for (var i = 0; i < str.length; ++i)
+      str[i] = 160;
+  },
+
+  // ### CHECK ME ### is use of "li" okay for text/html?
+  // for XHTML do we also need to specify namespace?
+  init_outliner: function () {
+    var items = document.getElementsByTagName("li");
+
+    for (var i = 0; i < items.length; ++i)
+    {
+      var target = items[i];
+
+      if (!this.has_class(target.parentNode, "outline"))
+        continue;
+
+      target.onclick = this.outline_click;
+/* ### more work needed for IE6
+      if (!this.ns_pos)
+      {
+        target.onmouseover = this.hover_outline;
+        target.onmouseout = this.unhover_outline;
+      }
+*/
+      if (this.foldable(target))
+      {
+        target.foldable = true;
+        target.onfocus = function () {w3c_slidy.outline = this;};
+        target.onblur = function () {w3c_slidy.outline = null;};
+
+        if (!target.getAttribute("tabindex"))
+          target.setAttribute("tabindex", "0");
+
+        if (this.has_class(target, "expand"))
+          this.unfold(target);
+        else
+          this.fold(target);
+      }
+      else
+      {
+        this.add_class(target, "nofold");
+        target.visible = true;
+        target.foldable = false;
+      }
+    }
+  },
+
+  foldable: function (item) {
+    if (!item || item.nodeType != 1)
+      return false;
+
+    var node = item.firstChild;
+
+    while (node)
+    {
+      if (node.nodeType == 1 && this.is_block(node))
+        return true;
+
+      node = node.nextSibling;
+    }
+
+    return false;
+  },
+
+  // ### CHECK ME ### switch to add/remove "hidden" class
+  fold: function (item) {
+    if (item)
+    {
+      this.remove_class(item, "unfolded");
+      this.add_class(item, "folded");
+    }
+
+    var node = item ? item.firstChild : null;
+
+    while (node)
+    {
+      if (node.nodeType == 1 && this.is_block(node)) // element
+      {
+         w3c_slidy.add_class(node, "hidden");
+      }
+
+      node = node.nextSibling;
+    }
+
+    item.visible = false;
+  },
+
+  // ### CHECK ME ### switch to add/remove "hidden" class
+  unfold: function (item) {
+    if (item)
+    {
+      this.add_class(item, "unfolded");
+      this.remove_class(item, "folded");
+    }
+
+    var node = item ? item.firstChild : null;
+
+    while (node)
+    {
+      if (node.nodeType == 1 && this.is_block(node)) // element
+      {
+        w3c_slidy.remove_class(node, "hidden");
+      }
+
+      node = node.nextSibling;
+    }
+
+    item.visible = true;
+  },
+
+  outline_click: function (e) {
+    if (!e)
+      e = window.event;
+
+    var rightclick = false;
+    var target = w3c_slidy.get_target(e);
+
+    while (target && target.visible == undefined)
+      target = target.parentNode;
+
+    if (!target)
+      return true;
+
+    if (e.which)
+      rightclick = (e.which == 3);
+    else if (e.button)
+      rightclick = (e.button == 2);
+
+    if (!rightclick && target.visible != undefined)
+    {
+      if (target.foldable)
+      {
+        if (target.visible)
+          w3c_slidy.fold(target);
+        else
+          w3c_slidy.unfold(target);
+      }
+
+      w3c_slidy.stop_propagation(e);
+      e.cancel = true;
+      e.returnValue = false;
+    }
+
+    return false;
+  },
+
+  add_initial_prompt: function () {
+    var prompt = this.create_element("div");
+    prompt.setAttribute("class", "initial_prompt");
+
+    var p1 = this.create_element("p");
+    prompt.appendChild(p1);
+    p1.setAttribute("class", "help");
+
+    if (this.keyboardless)
+      p1.innerHTML = "swipe left to move to next slide";
+    else
+      p1.innerHTML = "Space, Right Arrow or swipe left to move to " +
+                     "next slide, click help below for more details";
+
+    this.add_listener(prompt, "click", function (e) {
+      document.body.removeChild(prompt);
+      w3c_slidy.stop_propagation(e);
+    
+      if (e.cancel != undefined)
+        e.cancel = true;
+      
+      if (e.returnValue != undefined)
+        e.returnValue = false;
+      
+      return false;
+    });
+
+    document.body.appendChild(prompt);
+    this.initial_prompt = prompt;
+    setTimeout(function() {document.body.removeChild(prompt);}, 5000);
+  },
+
+  add_toolbar: function () {
+    var counter, page;
+
+     this.toolbar = this.create_element("div");
+     this.toolbar.setAttribute("class", "toolbar");
+
+     // a reasonably behaved browser
+     if (this.ns_pos || !this.ie6)
+     {
+       var right = this.create_element("div");
+       right.setAttribute("style", "float: right; text-align: right");
+
+       counter = this.create_element("span")
+       counter.innerHTML = this.localize("slide") + " n/m";
+       right.appendChild(counter);
+       this.toolbar.appendChild(right);
+
+       var left = this.create_element("div");
+       left.setAttribute("style", "text-align: left");
+
+       // global end of slide indicator
+       this.eos = this.create_element("span");
+       this.eos.innerHTML = "* ";
+       left.appendChild(this.eos);
+
+       var help = this.create_element("a");
+       help.setAttribute("href", this.help_page);
+       help.setAttribute("title", this.localize(this.help_text));
+       help.innerHTML = this.localize("help?");
+       left.appendChild(help);
+       help.style.display="none"; 
+       this.help_anchor = help;  // save for focus hack
+
+       var gap1 = document.createTextNode(" ");
+       left.appendChild(gap1);
+
+       var contents = this.create_element("a");
+       contents.setAttribute("href", "javascript:w3c_slidy.toggle_table_of_contents()");
+       contents.setAttribute("title", this.localize("table of contents"));
+       contents.innerHTML = this.localize("Contents");
+       left.appendChild(contents);
+
+       var gap2 = document.createTextNode(" ");
+       left.appendChild(gap2);
+
+       var copyright = this.find_copyright();
+
+       if (copyright)
+       {
+         var span = this.create_element("span");
+         span.className = "copyright";
+         span.innerHTML = copyright;
+         left.appendChild(span);
+       }
+
+       this.toolbar.setAttribute("tabindex", "0");
+       this.toolbar.appendChild(left);
+     }
+     else // IE6 so need to work around its poor CSS support
+     {
+       this.toolbar.style.position = (this.ie7 ? "fixed" : "absolute");
+       this.toolbar.style.zIndex = "200";
+       this.toolbar.style.width = "99.9%";
+       this.toolbar.style.height = "1.2em";
+       this.toolbar.style.top = "auto";
+       this.toolbar.style.bottom = "0";
+       this.toolbar.style.left = "0";
+       this.toolbar.style.right = "0";
+       this.toolbar.style.textAlign = "left";
+       this.toolbar.style.fontSize = "60%";
+       this.toolbar.style.color = "red";
+       this.toolbar.borderWidth = 0;
+       this.toolbar.className = "toolbar";
+       this.toolbar.style.background = "rgb(240,240,240)";
+
+       // would like to have help text left aligned
+       // and page counter right aligned, floating
+       // div's don't work, so instead use nested
+       // absolutely positioned div's.
+
+       var sp = this.create_element("span");
+       sp.innerHTML = "  * ";
+       this.toolbar.appendChild(sp);
+       this.eos = sp;  // end of slide indicator
+
+       var help = this.create_element("a");
+       help.setAttribute("href", this.help_page);
+       help.setAttribute("title", this.localize(this.help_text));
+       help.innerHTML = this.localize("help?");
+       this.toolbar.appendChild(help);
+       this.help_anchor = help;  // save for focus hack
+
+       var gap1 = document.createTextNode(" ");
+       this.toolbar.appendChild(gap1);
+
+       var contents = this.create_element("a");
+       contents.setAttribute("href", "javascript:toggleTableOfContents()");
+       contents.setAttribute("title", this.localize("table of contents".localize));
+       contents.innerHTML = this.localize("contents?");
+       this.toolbar.appendChild(contents);
+
+       var gap2 = document.createTextNode(" ");
+       this.toolbar.appendChild(gap2);
+
+       var copyright = this.find_copyright();
+
+       if (copyright)
+       {
+         var span = this.create_element("span");
+         span.innerHTML = copyright;
+         span.style.color = "black";
+         span.style.marginLeft = "0.5em";
+         this.toolbar.appendChild(span);
+       }
+
+       counter = this.create_element("div")
+       counter.style.position = "absolute";
+       counter.style.width = "auto"; //"20%";
+       counter.style.height = "1.2em";
+       counter.style.top = "auto";
+       counter.style.bottom = 0;
+       counter.style.right = "0";
+       counter.style.textAlign = "right";
+       counter.style.color = "red";
+       counter.style.background = "rgb(240,240,240)";
+
+       counter.innerHTML = this.localize("slide") + " n/m";
+       this.toolbar.appendChild(counter);
+     }
+
+     // ensure that click isn't passed through to the page
+     this.toolbar.onclick =
+         function (e) {
+           if (!e)
+             e = window.event;
+
+           var target = e.target;
+
+           if (!target && e.srcElement)
+             target = e.srcElement;
+
+           // work around Safari bug
+           if (target && target.nodeType == 3)
+             target = target.parentNode;
+
+           w3c_slidy.stop_propagation(e);
+
+           if (target && target.nodeName.toLowerCase() != "a")
+             w3c_slidy.mouse_button_click(e);
+         };
+
+     this.slide_number_element = counter;
+     this.set_eos_status(false);
+     document.body.appendChild(this.toolbar);
+  },
+
+  // wysiwyg editors make it hard to use div elements
+  // e.g. amaya loses the div when you copy and paste
+  // this function wraps div elements around implicit
+  // slides which start with an h1 element and continue
+  // up to the next heading or div element
+  wrap_implicit_slides: function () {
+    var i, heading, node, next, div;
+    var headings = document.getElementsByTagName("h1");
+
+    if (!headings)
+      return;
+
+    for (i = 0; i < headings.length; ++i)
+    {
+      heading = headings[i];
+
+      if (heading.parentNode != document.body)
+        continue;
+
+      node = heading.nextSibling;
+
+      div = document.createElement("div");
+      this.add_class(div, "slide");
+      document.body.replaceChild(div, heading);
+      div.appendChild(heading);
+
+      while (node)
+      {
+        if (node.nodeType == 1) // an element
+        {
+           if (node.nodeName == "H1" || node.nodeName == "h1")
+             break;
+
+           if (node.nodeName == "DIV" || node.nodeName == "div")
+           {
+             if (this.has_class(node, "slide"))
+               break;
+
+             if (this.has_class(node, "handout"))
+               break;
+           }
+        }
+
+        next = node.nextSibling;
+        node = document.body.removeChild(node);
+        div.appendChild(node);
+        node = next;
+      } 
+    }
+  },
+
+  attach_touch_handers: function(slides)
+  {
+    var i, slide;
+
+    for (i = 0; i < slides.length; ++i)
+    {
+      slide = slides[i];
+      this.add_listener(slide, "touchstart", this.touchstart);
+      this.add_listener(slide, "touchmove", this.touchmove);
+      this.add_listener(slide, "touchend", this.touchend);
+    }
+  },
+
+// return new array of all slides
+  collect_slides: function () {
+    var slides = new Array();
+    var divs = document.body.getElementsByTagName("div");
+
+    for (var i = 0; i < divs.length; ++i)
+    {
+      div = divs.item(i);
+
+      if (this.has_class(div, "slide"))
+      {
+        // add slide to collection
+        slides[slides.length] = div;
+
+        // hide each slide as it is found
+        this.add_class(div, "hidden");
+
+        // add dummy <br/> at end for scrolling hack
+        var node1 = document.createElement("br");
+        div.appendChild(node1);
+        var node2 = document.createElement("br");
+        div.appendChild(node2);
+      }
+      else if (this.has_class(div, "background"))
+      {  // work around for Firefox SVG reload bug
+        // which otherwise replaces 1st SVG graphic with 2nd
+        div.style.display = "block";
+      }
+    }
+
+    this.slides = slides;
+  },
+
+  // return new array of all <div class="handout">
+  collect_notes: function () {
+    var notes = new Array();
+    var divs = document.body.getElementsByTagName("div");
+
+    for (var i = 0; i < divs.length; ++i)
+    {
+      div = divs.item(i);
+
+      if (this.has_class(div, "handout"))
+      {
+        // add note to collection
+        notes[notes.length] = div;
+
+        // and hide it
+        this.add_class(div, "hidden");
+      }
+    }
+
+    this.notes = notes;
+  },
+
+  // return new array of all <div class="background">
+  // including named backgrounds e.g. class="background titlepage"
+  collect_backgrounds: function () {
+    var backgrounds = new Array();
+    var divs = document.body.getElementsByTagName("div");
+
+    for (var i = 0; i < divs.length; ++i)
+    {
+      div = divs.item(i);
+
+      if (this.has_class(div, "background"))
+      {
+        // add background to collection
+        backgrounds[backgrounds.length] = div;
+
+        // and hide it
+        this.add_class(div, "hidden");
+      }
+    }
+
+    this.backgrounds = backgrounds;
+  },
+
+  // set click handlers on all anchors
+  patch_anchors: function () {
+    var self = w3c_slidy;
+    var handler = function (event) {
+      // compare this.href with location.href
+      // for link to another slide in this doc
+
+      if (self.page_address(this.href) == self.page_address(location.href))
+      {
+        // yes, so find new slide number
+        var newslidenum = self.find_slide_number(this.href);
+
+        if (newslidenum != self.slide_number)
+        {
+          var slide = self.slides[self.slide_number];
+          self.hide_slide(slide);
+          self.slide_number = newslidenum;
+          slide = self.slides[self.slide_number];
+          self.show_slide(slide);
+          self.set_location();
+        }
+      }
+      else
+        w3c_slidy.stop_propagation(event);
+
+//      else if (this.target == null)
+//        location.href = this.href;
+
+      this.blur();
+      self.disable_slide_click = true;
+    };
+
+    var anchors = document.body.getElementsByTagName("a");
+
+    for (var i = 0; i < anchors.length; ++i)
+    {
+      if (window.addEventListener)
+        anchors[i].addEventListener("click", handler, false);
+      else
+        anchors[i].attachEvent("onclick", handler);
+    }
+  },
+
+  // ### CHECK ME ### see which functions are invoked via setTimeout
+  // either directly or indirectly for use of w3c_slidy vs this
+  show_slide_number: function () {
+    var timer = w3c_slidy.get_timer();
+    w3c_slidy.slide_number_element.innerHTML = timer + w3c_slidy.localize("slide") + " " +
+           (w3c_slidy.slide_number + 1) + "/" + w3c_slidy.slides.length;
+  },
+
+  // every 200mS check if the location has been changed as a
+  // result of the user activating the Back button/menu item
+  // doesn't work for Opera < 9.5
+  check_location: function () {
+    var hash = location.hash;
+
+    if (w3c_slidy.slide_number > 0 && (hash == "" || hash == "#"))
+      w3c_slidy.goto_slide(0);
+    else if (hash.length > 2 && hash != "#("+(w3c_slidy.slide_number+1)+")")
+    {
+      var num = parseInt(location.hash.substr(2));
+
+      if (!isNaN(num))
+        w3c_slidy.goto_slide(num-1);
+    }
+
+    if (w3c_slidy.time_left && w3c_slidy.slide_number > 0)
+    {
+      w3c_slidy.show_slide_number();
+
+      if (w3c_slidy.time_left > 0)
+        w3c_slidy.time_left -= 200;
+    } 
+  },
+
+  get_timer: function () {
+    var timer = "";
+    if (w3c_slidy.time_left)
+    {
+      var mins, secs;
+      secs = Math.floor(w3c_slidy.time_left/1000);
+      mins = Math.floor(secs / 60);
+      secs = secs % 60;
+      timer = (mins ? mins+"m" : "") + secs + "s ";
+    }
+
+    return timer;
+  },
+
+  // this doesn't push location onto history stack for IE
+  // for which a hidden iframe hack is needed: load page into
+  // the iframe with script that set's parent's location.hash
+  // but that won't work for standalone use unless we can
+  // create the page dynamically via a javascript: URL
+  // ### use history.pushState if available
+  set_location: function () {
+     var uri = w3c_slidy.page_address(location.href);
+     var hash = "#(" + (w3c_slidy.slide_number+1) + ")";
+
+     if (w3c_slidy.slide_number >= 0)
+       uri = uri + hash;
+
+     if (typeof(history.pushState) != "undefined" && location.protocol !== "file:")
+     {
+       document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";
+       history.pushState(0, document.title, hash);
+       w3c_slidy.show_slide_number();
+       w3c_slidy.notify_observers();
+       return;
+     }
+
+     if (w3c_slidy.ie && (w3c_slidy.ie6 || w3c_slidy.ie7))
+       w3c_slidy.push_hash(hash);
+
+     if (uri != location.href) // && !khtml
+        location.href = uri;
+
+     if (this.khtml)
+        hash = "(" + (w3c_slidy.slide_number+1) + ")";
+
+     if (!this.ie && location.hash != hash && location.hash != "")
+       location.hash = hash;
+
+     document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";
+     w3c_slidy.show_slide_number();
+     w3c_slidy.notify_observers();
+  },
+
+  notify_observers: function ()
+  {
+    var slide = this.slides[this.slide_number];
+
+    for (var i = 0; i < this.observers.length; ++i)
+      this.observers[i](this.slide_number+1, this.find_heading(slide).innerText, location.href);
+  },
+
+  add_observer: function (observer)
+  {
+    for (var i = 0; i < this.observers.length; ++i)
+    {
+      if (observer == this.observers[i])
+        return;
+    }
+
+    this.observers.push(observer);
+  },
+
+  remove_observer: function (o)
+  {
+    for (var i = 0; i < this.observers.length; ++i)
+    {
+      if (observer == this.observers[i])
+      {
+        this.observers.splice(i,1);
+        break;
+      }
+    }
+  },
+
+  page_address: function (uri) {
+    var i = uri.indexOf("#");
+
+    if (i < 0)
+      i = uri.indexOf("%23");
+
+    // check if anchor is entire page
+
+    if (i < 0)
+      return uri;  // yes
+
+    return uri.substr(0, i);
+  },
+
+  // only used for IE6 and IE7
+  on_frame_loaded: function (hash) {
+    location.hash = hash;
+    var uri = w3c_slidy.page_address(location.href);
+    location.href = uri + hash;
+  },
+
+  // history hack with thanks to Bertrand Le Roy
+  push_hash: function (hash) {
+    if (hash == "") hash = "#(1)";
+      window.location.hash = hash;
+
+    var doc = document.getElementById("historyFrame").contentWindow.document;
+    doc.open("javascript:'<html></html>'");
+    doc.write("<html><head><script type=\"text/javascript\">window.parent.w3c_slidy.on_frame_loaded('"+
+      (hash) + "');</script></head><body>hello mum</body></html>");
+      doc.close();
+  },
+
+  // find current slide based upon location
+  // first find target anchor and then look
+  // for associated div element enclosing it
+  // finally map that to slide number
+  find_slide_number: function (uri) {
+    // first get anchor from page location
+
+    var i = uri.indexOf("#");
+
+    // check if anchor is entire page
+    if (i < 0)
+      return 0;  // yes
+
+    var anchor = unescape(uri.substr(i+1));
+
+    // now use anchor as XML ID to find target
+    var target = document.getElementById(anchor);
+
+    if (!target)
+    {
+      // does anchor look like "(2)" for slide 2 ??
+      // where first slide is (1)
+      var re = /\((\d)+\)/;
+
+      if (anchor.match(re))
+      {
+        var num = parseInt(anchor.substring(1, anchor.length-1));
+
+        if (num > this.slides.length)
+          num = 1;
+
+        if (--num < 0)
+          num = 0;
+
+        return num;
+      }
+
+      // accept [2] for backwards compatibility
+      re = /\[(\d)+\]/;
+
+      if (anchor.match(re))
+      {
+         var num = parseInt(anchor.substring(1, anchor.length-1));
+
+         if (num > this.slides.length)
+            num = 1;
+
+         if (--num < 0)
+            num = 0;
+
+         return num;
+      }
+
+      // oh dear unknown anchor
+      return 0;
+    }
+
+    // search for enclosing slide
+
+    while (true)
+    {
+      // browser coerces html elements to uppercase!
+      if (target.nodeName.toLowerCase() == "div" &&
+            this.has_class(target, "slide"))
+      {
+        // found the slide element
+        break;
+      }
+
+      // otherwise try parent element if any
+
+      target = target.parentNode;
+
+      if (!target)
+      {
+        return 0;   // no luck!
+      }
+    };
+
+    for (i = 0; i < slides.length; ++i)
+    {
+      if (slides[i] == target)
+        return i;  // success
+    }
+
+    // oh dear still no luck
+    return 0;
+  },
+
+  previous_slide: function (incremental) {
+    if (!w3c_slidy.view_all)
+    {
+      var slide;
+
+      if ((incremental || w3c_slidy.slide_number == 0) && w3c_slidy.last_shown != null)
+      {
+        w3c_slidy.last_shown = w3c_slidy.hide_previous_item(w3c_slidy.last_shown);
+        w3c_slidy.set_eos_status(false);
+      }
+      else if (w3c_slidy.slide_number > 0)
+      {
+        slide = w3c_slidy.slides[w3c_slidy.slide_number];
+        w3c_slidy.hide_slide(slide);
+
+        w3c_slidy.slide_number = w3c_slidy.slide_number - 1;
+        slide = w3c_slidy.slides[w3c_slidy.slide_number];
+        w3c_slidy.set_visibility_all_incremental("visible");
+        w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);
+        w3c_slidy.set_eos_status(true);
+        w3c_slidy.show_slide(slide);
+      }
+
+      w3c_slidy.set_location();
+
+      if (!w3c_slidy.ns_pos)
+        w3c_slidy.refresh_toolbar(200);
+    }
+  },
+
+  next_slide: function (incremental) {
+    if (!w3c_slidy.view_all)
+    {
+      var slide, last = w3c_slidy.last_shown;
+
+      if (incremental || w3c_slidy.slide_number == w3c_slidy.slides.length - 1)
+         w3c_slidy.last_shown = w3c_slidy.reveal_next_item(w3c_slidy.last_shown);
+
+      if ((!incremental || w3c_slidy.last_shown == null) &&
+             w3c_slidy.slide_number < w3c_slidy.slides.length - 1)
+      {
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];
+         w3c_slidy.hide_slide(slide);
+
+         w3c_slidy.slide_number = w3c_slidy.slide_number + 1;
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];
+         w3c_slidy.last_shown = null;
+         w3c_slidy.set_visibility_all_incremental("hidden");
+         w3c_slidy.show_slide(slide);
+      }
+      else if (!w3c_slidy.last_shown)
+      {
+         if (last && incremental)
+           w3c_slidy.last_shown = last;
+      }
+
+      w3c_slidy.set_location();
+
+      w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
+
+      if (!w3c_slidy.ns_pos)
+         w3c_slidy.refresh_toolbar(200);
+     }
+  },
+
+  // to first slide with nothing revealed
+  // i.e. state at start of presentation
+  first_slide: function () {
+     if (!w3c_slidy.view_all)
+     {
+       var slide;
+
+       if (w3c_slidy.slide_number != 0)
+       {
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];
+         w3c_slidy.hide_slide(slide);
+
+         w3c_slidy.slide_number = 0;
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];
+         w3c_slidy.last_shown = null;
+         w3c_slidy.set_visibility_all_incremental("hidden");
+         w3c_slidy.show_slide(slide);
+       }
+
+       w3c_slidy.set_eos_status(
+         !w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
+       w3c_slidy.set_location();
+     }
+  },
+
+  // goto last slide with everything revealed
+  // i.e. state at end of presentation
+  last_slide: function () {
+    if (!w3c_slidy.view_all)
+    {
+      var slide;
+
+      w3c_slidy.last_shown = null; //revealNextItem(lastShown);
+
+      if (w3c_slidy.last_shown == null &&
+          w3c_slidy.slide_number < w3c_slidy.slides.length - 1)
+      {
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];
+         w3c_slidy.hide_slide(slide);
+         w3c_slidy.slide_number = w3c_slidy.slides.length - 1;
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];
+         w3c_slidy.set_visibility_all_incremental("visible");
+         w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);
+
+         w3c_slidy.show_slide(slide);
+      }
+      else
+      {
+         w3c_slidy.set_visibility_all_incremental("visible");
+         w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);
+      }
+
+      w3c_slidy.set_eos_status(true);
+      w3c_slidy.set_location();
+    }
+  },
+
+
+  // ### check this and consider add/remove class
+  set_eos_status: function (state) {
+    if (this.eos)
+      this.eos.style.color = (state ? "rgb(240,240,240)" : "red");
+  },
+
+  // first slide is 0
+  goto_slide: function (num) {
+    //alert("going to slide " + (num+1));
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+    w3c_slidy.hide_slide(slide);
+    w3c_slidy.slide_number = num;
+    slide = w3c_slidy.slides[w3c_slidy.slide_number];
+    w3c_slidy.last_shown = null;
+    w3c_slidy.set_visibility_all_incremental("hidden");
+    w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
+    document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";
+    w3c_slidy.show_slide(slide);
+    w3c_slidy.show_slide_number();
+  },
+
+
+  show_slide: function (slide) {
+    this.sync_background(slide);
+    this.remove_class(slide, "hidden");
+
+    // work around IE9 object rendering bug
+    setTimeout("window.scrollTo(0,0);", 1);
+  },
+
+  hide_slide: function (slide) {
+    this.add_class(slide, "hidden");
+  },
+
+  set_focus: function (element)
+  {
+    if (element)
+      element.focus();
+    else
+    {
+      w3c_slidy.help_anchor.focus();
+
+      setTimeout(function() {
+        w3c_slidy.help_anchor.blur();
+      }, 1);
+    }
+  },
+
+  // show just the backgrounds pertinent to this slide
+  // when slide background-color is transparent
+  // this should now work with rgba color values
+  sync_background: function (slide) {
+    var background;
+    var bgColor;
+
+    if (slide.currentStyle)
+      bgColor = slide.currentStyle["backgroundColor"];
+    else if (document.defaultView)
+    {
+      var styles = document.defaultView.getComputedStyle(slide,null);
+
+      if (styles)
+        bgColor = styles.getPropertyValue("background-color");
+      else // broken implementation probably due Safari or Konqueror
+      {
+        //alert("defective implementation of getComputedStyle()");
+        bgColor = "transparent";
+      }
+    }
+    else
+      bgColor == "transparent";
+
+    if (bgColor == "transparent" ||
+        bgColor.indexOf("rgba") >= 0 ||
+        bgColor.indexOf("opacity") >= 0)
+    {
+      var slideClass = this.get_class_list(slide);
+
+      for (var i = 0; i < this.backgrounds.length; i++)
+      {
+        background = this.backgrounds[i];
+
+        var bgClass = this.get_class_list(background);
+
+        if (this.matching_background(slideClass, bgClass))
+          this.remove_class(background, "hidden");
+        else
+          this.add_class(background, "hidden");
+      }
+    }
+    else // forcibly hide all backgrounds
+      this.hide_backgrounds();
+  },
+
+  hide_backgrounds: function () {
+    for (var i = 0; i < this.backgrounds.length; i++)
+    {
+      background = this.backgrounds[i];
+      this.add_class(background, "hidden");
+    }
+  },
+
+  // compare classes for slide and background
+  matching_background: function (slideClass, bgClass) {
+    var i, count, pattern, result;
+
+    // define pattern as regular expression
+    pattern = /\w+/g;
+
+    // check background class names
+    result = bgClass.match(pattern);
+
+    for (i = count = 0; i < result.length; i++)
+    {
+      if (result[i] == "hidden")
+        continue;
+
+      if (result[i] == "background")
+	continue;
+
+      ++count;
+    }
+
+    if (count == 0)  // default match
+      return true;
+
+    // check for matches and place result in array
+    result = slideClass.match(pattern);
+
+    // now check if desired name is present for background
+    for (i = count = 0; i < result.length; i++)
+    {
+      if (result[i] == "hidden")
+        continue;
+
+      if (this.has_token(bgClass, result[i]))
+        return true;
+    }
+
+    return false;
+  },
+
+  resized: function () {
+     var width = 0;
+
+     if ( typeof( window.innerWidth ) == 'number' )
+       width = window.innerWidth;  // Non IE browser
+     else if (document.documentElement && document.documentElement.clientWidth)
+       width = document.documentElement.clientWidth;  // IE6
+     else if (document.body && document.body.clientWidth)
+       width = document.body.clientWidth; // IE4
+
+     var height = 0;
+
+     if ( typeof( window.innerHeight ) == 'number' )
+       height = window.innerHeight;  // Non IE browser
+     else if (document.documentElement && document.documentElement.clientHeight)
+       height = document.documentElement.clientHeight;  // IE6
+     else if (document.body && document.body.clientHeight)
+       height = document.body.clientHeight; // IE4
+
+     if (height && (width/height > 1.05*1024/768))
+     {
+       width = height * 1024.0/768;
+     }
+
+     // IE fires onresize even when only font size is changed!
+     // so we do a check to avoid blocking < and > actions
+     if (width != w3c_slidy.last_width || height != w3c_slidy.last_height)
+     {
+       if (width >= 1100)
+         w3c_slidy.size_index = 5;    // 4
+       else if (width >= 1000)
+         w3c_slidy.size_index = 4;    // 3
+       else if (width >= 800)
+         w3c_slidy.size_index = 3;    // 2
+       else if (width >= 600)
+         w3c_slidy.size_index = 2;    // 1
+       else if (width)
+         w3c_slidy.size_index = 0;
+
+       // add in font size adjustment from meta element e.g.
+       // <meta name="font-size-adjustment" content="-2" />
+       // useful when slides have too much content ;-)
+
+       if (0 <= w3c_slidy.size_index + w3c_slidy.size_adjustment &&
+             w3c_slidy.size_index + w3c_slidy.size_adjustment < w3c_slidy.sizes.length)
+         w3c_slidy.size_index = w3c_slidy.size_index + w3c_slidy.size_adjustment;
+
+       // enables cross browser use of relative width/height
+       // on object elements for use with SVG and Flash media
+       w3c_slidy.adjust_object_dimensions(width, height);
+
+       if (document.body.style.fontSize != w3c_slidy.sizes[w3c_slidy.size_index])
+       {
+         document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];
+       }
+
+       w3c_slidy.last_width = width;
+       w3c_slidy.last_height = height;
+
+       // force reflow to work around Mozilla bug
+       if (w3c_slidy.ns_pos)
+       {
+         var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+         w3c_slidy.hide_slide(slide);
+         w3c_slidy.show_slide(slide);
+       }
+
+       // force correct positioning of toolbar
+       w3c_slidy.refresh_toolbar(200);
+     }
+  },
+
+  scrolled: function () {
+    if (w3c_slidy.toolbar && !w3c_slidy.ns_pos && !w3c_slidy.ie7)
+    {
+      w3c_slidy.hack_offset = w3c_slidy.scroll_x_offset();
+      // hide toolbar
+      w3c_slidy.toolbar.style.display = "none";
+
+      // make it reappear later
+      if (w3c_slidy.scrollhack == 0 && !w3c_slidy.view_all)
+      {
+        setTimeout(function () {w3c_slidy.show_toolbar(); }, 1000);
+        w3c_slidy.scrollhack = 1;
+      }
+    }
+  },
+
+  hide_toolbar: function () {
+    w3c_slidy.add_class(w3c_slidy.toolbar, "hidden");
+    window.focus();
+  },
+
+  // used to ensure IE refreshes toolbar in correct position
+  refresh_toolbar: function (interval) {
+    if (!w3c_slidy.ns_pos && !w3c_slidy.ie7)
+    {
+      w3c_slidy.hide_toolbar();
+      setTimeout(function () {w3c_slidy.show_toolbar();}, interval);
+    }
+  },
+
+  // restores toolbar after short delay
+  show_toolbar: function () {
+    if (w3c_slidy.want_toolbar)
+    {
+      w3c_slidy.toolbar.style.display = "block";
+
+      if (!w3c_slidy.ns_pos)
+      {
+        // adjust position to allow for scrolling
+        var xoffset = w3c_slidy.scroll_x_offset();
+        w3c_slidy.toolbar.style.left = xoffset;
+        w3c_slidy.toolbar.style.right = xoffset;
+
+        // determine vertical scroll offset
+        //var yoffset = scrollYOffset();
+
+        // bottom is doc height - window height - scroll offset
+        //var bottom = documentHeight() - lastHeight - yoffset
+
+        //if (yoffset > 0 || documentHeight() > lastHeight)
+        //   bottom += 16;  // allow for height of scrollbar
+
+        w3c_slidy.toolbar.style.bottom = 0; //bottom;
+      }
+
+      w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden");
+    }
+
+    w3c_slidy.scrollhack = 0;
+
+
+    // set the keyboard focus to the help link on the
+    // toolbar to ensure that document has the focus
+    // IE doesn't always work with window.focus()
+    // and this hack has benefit of Enter for help
+
+    try
+    {
+      if (!w3c_slidy.opera)
+        w3c_slidy.set_focus();
+    }
+    catch (e)
+    {
+    }
+  },
+
+// invoked via F key
+  toggle_toolbar: function () {
+    if (!w3c_slidy.view_all)
+    {
+      if (w3c_slidy.has_class(w3c_slidy.toolbar, "hidden"))
+      {
+        w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden")
+        w3c_slidy.want_toolbar = 1;
+      }
+      else
+      {
+        w3c_slidy.add_class(w3c_slidy.toolbar, "hidden")
+        w3c_slidy.want_toolbar = 0;
+      }
+    }
+  },
+
+  scroll_x_offset: function () {
+    if (window.pageXOffset)
+      return self.pageXOffset;
+
+    if (document.documentElement && 
+             document.documentElement.scrollLeft)
+      return document.documentElement.scrollLeft;
+
+    if (document.body)
+      return document.body.scrollLeft;
+
+    return 0;
+  },
+
+  scroll_y_offset: function () {
+    if (window.pageYOffset)
+      return self.pageYOffset;
+
+    if (document.documentElement && 
+             document.documentElement.scrollTop)
+      return document.documentElement.scrollTop;
+
+    if (document.body)
+      return document.body.scrollTop;
+
+    return 0;
+  },
+
+  // looking for a way to determine height of slide content
+  // the slide itself is set to the height of the window
+  optimize_font_size: function () {
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+
+    //var dh = documentHeight(); //getDocHeight(document);
+    var dh = slide.scrollHeight;
+    var wh = getWindowHeight();
+    var u = 100 * dh / wh;
+
+    alert("window utilization = " + u + "% (doc "
+      + dh + " win " + wh + ")");
+  },
+
+  // from document object
+  get_doc_height: function (doc) {
+    if (!doc)
+      doc = document;
+
+    if (doc && doc.body && doc.body.offsetHeight)
+      return doc.body.offsetHeight;  // ns/gecko syntax
+
+    if (doc && doc.body && doc.body.scrollHeight)
+      return doc.body.scrollHeight;
+
+    alert("couldn't determine document height");
+  },
+
+  get_window_height: function () {
+    if ( typeof( window.innerHeight ) == 'number' )
+      return window.innerHeight;  // Non IE browser
+
+    if (document.documentElement && document.documentElement.clientHeight)
+      return document.documentElement.clientHeight;  // IE6
+
+    if (document.body && document.body.clientHeight)
+      return document.body.clientHeight; // IE4
+  },
+
+  document_height: function () {
+    var sh, oh;
+
+    sh = document.body.scrollHeight;
+    oh = document.body.offsetHeight;
+
+    if (sh && oh)
+    {
+      return (sh > oh ? sh : oh);
+    }
+
+    // no idea!
+    return 0;
+  },
+
+  smaller: function () {
+    if (w3c_slidy.size_index > 0)
+    {
+      --w3c_slidy.size_index;
+    }
+
+    w3c_slidy.toolbar.style.display = "none";
+    document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+    w3c_slidy.hide_slide(slide);
+    w3c_slidy.show_slide(slide);
+    setTimeout(function () {w3c_slidy.show_toolbar(); }, 50);
+  },
+
+  bigger: function () {
+    if (w3c_slidy.size_index < w3c_slidy.sizes.length - 1)
+    {
+      ++w3c_slidy.size_index;
+    }
+
+    w3c_slidy.toolbar.style.display = "none";
+    document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+    w3c_slidy.hide_slide(slide);
+    w3c_slidy.show_slide(slide);
+    setTimeout(function () {w3c_slidy.show_toolbar(); }, 50);
+  },
+
+  // enables cross browser use of relative width/height
+  // on object elements for use with SVG and Flash media
+  // with thanks to Ivan Herman for the suggestion
+  adjust_object_dimensions: function (width, height) {
+    for( var i = 0; i < w3c_slidy.objects.length; i++ )
+    {
+      var obj = this.objects[i];
+      var mimeType = obj.getAttribute("type");
+
+      if (mimeType == "image/svg+xml" || mimeType == "application/x-shockwave-flash")
+      {
+        if ( !obj.initialWidth ) 
+          obj.initialWidth = obj.getAttribute("width");
+
+        if ( !obj.initialHeight ) 
+          obj.initialHeight = obj.getAttribute("height");
+
+        if ( obj.initialWidth && obj.initialWidth.charAt(obj.initialWidth.length-1) == "%" )
+        {
+          var w = parseInt(obj.initialWidth.slice(0, obj.initialWidth.length-1));
+          var newW = width * (w/100.0);
+          obj.setAttribute("width",newW);
+        }
+
+        if ( obj.initialHeight &&
+             obj.initialHeight.charAt(obj.initialHeight.length-1) == "%" )
+        {
+          var h = parseInt(obj.initialHeight.slice(0, obj.initialHeight.length-1));
+          var newH = height * (h/100.0);
+          obj.setAttribute("height", newH);
+        }
+      }
+    }
+  },
+
+  // needed for Opera to inhibit default behavior
+  // since Opera delivers keyPress even if keyDown
+  // was cancelled
+  key_press: function (event) {
+    if (!event)
+      event = window.event;
+
+    if (!w3c_slidy.key_wanted)
+      return w3c_slidy.cancel(event);
+
+    return true;
+  },
+
+  //  See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes
+  key_down: function (event) {
+    var key, target, tag;
+
+    w3c_slidy.key_wanted = true;
+
+    if (!event)
+      event = window.event;
+
+    // kludge around NS/IE differences 
+    if (window.event)
+    {
+      key = window.event.keyCode;
+      target = window.event.srcElement;
+    }
+    else if (event.which)
+    {
+      key = event.which;
+      target = event.target;
+    }
+    else
+      return true; // Yikes! unknown browser
+
+    // ignore event if key value is zero
+    // as for alt on Opera and Konqueror
+    if (!key)
+       return true;
+
+    // avoid interfering with keystroke
+    // behavior for non-slidy chrome elements
+    if (!w3c_slidy.slidy_chrome(target) &&
+        w3c_slidy.special_element(target))
+      return true;
+
+    // check for concurrent control/command/alt key
+    // but are these only present on mouse events?
+
+    if (event.ctrlKey || event.altKey || event.metaKey)
+       return true;
+
+    // dismiss table of contents if visible
+    if (w3c_slidy.is_shown_toc() && key != 9 && key != 16 && key != 38 && key != 40)
+    {
+      w3c_slidy.hide_table_of_contents(true);
+
+      if (key == 27 || key == 84 || key == 67)
+        return w3c_slidy.cancel(event);
+    }
+
+    if (key == 34) // Page Down
+    {
+      if (w3c_slidy.view_all)
+        return true;
+
+      w3c_slidy.next_slide(false);
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 33) // Page Up
+    {
+      if (w3c_slidy.view_all)
+        return true;
+
+      w3c_slidy.previous_slide(false);
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 32) // space bar
+    {
+      w3c_slidy.next_slide(true);
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 37) // Left arrow
+    {
+      w3c_slidy.previous_slide(!event.shiftKey);
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 36) // Home
+    {
+      w3c_slidy.first_slide();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 35) // End
+    {
+      w3c_slidy.last_slide();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 39) // Right arrow
+    {
+      w3c_slidy.next_slide(!event.shiftKey);
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 13) // Enter
+    {
+      if (w3c_slidy.outline)
+      {
+        if (w3c_slidy.outline.visible)
+          w3c_slidy.fold(w3c_slidy.outline);
+        else
+          w3c_slidy.unfold(w3c_slidy.outline);
+          
+       return w3c_slidy.cancel(event);
+      }
+    }
+    else if (key == 188)  // < for smaller fonts
+    {
+      w3c_slidy.smaller();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 190)  // > for larger fonts
+    {
+      w3c_slidy.bigger();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 189 || key == 109)  // - for smaller fonts
+    {
+      w3c_slidy.smaller();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 187 || key == 191 || key == 107)  // = +  for larger fonts
+    {
+      w3c_slidy.bigger();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 83)  // S for smaller fonts
+    {
+      w3c_slidy.smaller();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 66)  // B for larger fonts
+    {
+      w3c_slidy.bigger();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 90)  // Z for last slide
+    {
+      w3c_slidy.last_slide();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 70)  // F for toggle toolbar
+    {
+      w3c_slidy.toggle_toolbar();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 65)  // A for toggle view single/all slides
+    {
+      w3c_slidy.toggle_view();
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 75)  // toggle action of left click for next page
+    {
+      w3c_slidy.mouse_click_enabled = !w3c_slidy.mouse_click_enabled;
+      var alert_msg = (w3c_slidy.mouse_click_enabled ?
+                "enabled" : "disabled") +  " mouse click advance";
+
+      alert(w3c_slidy.localize(alert_msg));
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 84 || key == 67)  // T or C for table of contents
+    {
+      if (w3c_slidy.toc)
+        w3c_slidy.toggle_table_of_contents();
+
+      return w3c_slidy.cancel(event);
+    }
+    else if (key == 72) // H for help
+    {
+      window.location = w3c_slidy.help_page;
+      return w3c_slidy.cancel(event);
+    }
+    //else alert("key code is "+ key);
+
+    return true;
+  },
+
+  // safe for both text/html and application/xhtml+xml
+  create_element: function (name) {
+    if (this.xhtml && (typeof document.createElementNS != 'undefined'))
+      return document.createElementNS("http://www.w3.org/1999/xhtml", name)
+
+    return document.createElement(name);
+  },
+
+  get_element_style: function (elem, IEStyleProp, CSSStyleProp) {
+    if (elem.currentStyle)
+    {
+      return elem.currentStyle[IEStyleProp];
+    }
+    else if (window.getComputedStyle)
+    {
+      var compStyle = window.getComputedStyle(elem, "");
+      return compStyle.getPropertyValue(CSSStyleProp);
+    }
+    return "";
+  },
+
+  // the string str is a whitespace separated list of tokens
+  // test if str contains a particular token, e.g. "slide"
+  has_token: function (str, token) {
+    if (str)
+    {
+      // define pattern as regular expression
+      var pattern = /\w+/g;
+
+      // check for matches
+      // place result in array
+      var result = str.match(pattern);
+
+      // now check if desired token is present
+      for (var i = 0; i < result.length; i++)
+      {
+        if (result[i] == token)
+          return true;
+      }
+    }
+
+    return false;
+  },
+
+  get_class_list: function (element) {
+    if (typeof element.className != 'undefined')
+      return element.className;
+
+    return element.getAttribute("class");
+  },
+
+  has_class: function (element, name) {
+    if (element.nodeType != 1)
+      return false;
+
+    var regexp = new RegExp("(^| )" + name + "\W*");
+
+    if (typeof element.className != 'undefined')
+      return regexp.test(element.className);
+
+    return regexp.test(element.getAttribute("class"));
+  },
+
+  remove_class: function (element, name) {
+    var regexp = new RegExp("(^| )" + name + "\W*");
+    var clsval = "";
+
+    if (typeof element.className != 'undefined')
+    {
+      clsval = element.className;
+
+      if (clsval)
+      {
+        clsval = clsval.replace(regexp, "");
+        element.className = clsval;
+      }
+    }
+    else
+    {
+      clsval = element.getAttribute("class");
+
+      if (clsval)
+      {
+        clsval = clsval.replace(regexp, "");
+        element.setAttribute("class", clsval);
+      }
+    }
+  },
+
+  add_class: function (element, name) {
+    if (!this.has_class(element, name))
+    {
+      if (typeof element.className != 'undefined')
+        element.className += " " + name;
+      else
+      {
+        var clsval = element.getAttribute("class");
+        clsval = clsval ? clsval + " " + name : name;
+        element.setAttribute("class", clsval);
+      }
+    }
+  },
+
+  // HTML elements that can be used with class="incremental"
+  // note that you can also put the class on containers like
+  // up, ol, dl, and div to make their contents appear
+  // incrementally. Upper case is used since this is what
+  // browsers report for HTML node names (text/html).
+  incremental_elements: null,
+  okay_for_incremental: function (name) {
+    if (!this.incremental_elements)
+    {
+      var inclist = new Array();
+      inclist["p"] = true;
+      inclist["pre"] = true;
+      inclist["li"] = true;
+      inclist["blockquote"] = true;
+      inclist["dt"] = true;
+      inclist["dd"] = true;
+      inclist["h2"] = true;
+      inclist["h3"] = true;
+      inclist["h4"] = true;
+      inclist["h5"] = true;
+      inclist["h6"] = true;
+      inclist["span"] = true;
+      inclist["address"] = true;
+      inclist["table"] = true;
+      inclist["tr"] = true;
+      inclist["th"] = true;
+      inclist["td"] = true;
+      inclist["img"] = true;
+      inclist["object"] = true;
+      this.incremental_elements = inclist;
+    }
+    return this.incremental_elements[name.toLowerCase()];
+  },
+
+  next_incremental_item: function (node) {
+    var br = this.is_xhtml ? "br" : "BR";
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+
+    for (;;)
+    {
+      node = w3c_slidy.next_node(slide, node);
+
+      if (node == null || node.parentNode == null)
+        break;
+
+      if (node.nodeType == 1)  // ELEMENT
+      {
+        if (node.nodeName == br)
+          continue;
+
+        if (w3c_slidy.has_class(node, "incremental")
+             && w3c_slidy.okay_for_incremental(node.nodeName))
+          return node;
+
+        if (w3c_slidy.has_class(node.parentNode, "incremental")
+             && !w3c_slidy.has_class(node, "non-incremental"))
+          return node;
+      }
+    }
+
+    return node;
+  },
+
+  previous_incremental_item: function (node) {
+    var br = this.is_xhtml ? "br" : "BR";
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];
+
+    for (;;)
+    {
+      node = w3c_slidy.previous_node(slide, node);
+
+      if (node == null || node.parentNode == null)
+        break;
+
+      if (node.nodeType == 1)
+      {
+        if (node.nodeName == br)
+          continue;
+
+        if (w3c_slidy.has_class(node, "incremental")
+             && w3c_slidy.okay_for_incremental(node.nodeName))
+          return node;
+
+        if (w3c_slidy.has_class(node.parentNode, "incremental")
+             && !w3c_slidy.has_class(node, "non-incremental"))
+          return node;
+      }
+    }
+
+    return node;
+  },
+
+  // set visibility for all elements on current slide with
+  // a parent element with attribute class="incremental"
+  set_visibility_all_incremental: function (value) {
+    var node = this.next_incremental_item(null);
+
+    if (value == "hidden")
+    {
+      while (node)
+      {
+        w3c_slidy.add_class(node, "invisible");
+        node = w3c_slidy.next_incremental_item(node);
+      }
+    }
+    else // value == "visible"
+    {
+      while (node)
+      {
+        w3c_slidy.remove_class(node, "invisible");
+        node = w3c_slidy.next_incremental_item(node);
+      }
+    }
+  },
+
+  // reveal the next hidden item on the slide
+  // node is null or the node that was last revealed
+  reveal_next_item: function (node) {
+    node = w3c_slidy.next_incremental_item(node);
+
+    if (node && node.nodeType == 1)  // an element
+      w3c_slidy.remove_class(node, "invisible");
+
+    return node;
+  },
+
+  // exact inverse of revealNextItem(node)
+  hide_previous_item: function (node) {
+    if (node && node.nodeType == 1)  // an element
+      w3c_slidy.add_class(node, "invisible");
+
+    return this.previous_incremental_item(node);
+  },
+
+  // left to right traversal of root's content
+  next_node: function (root, node) {
+    if (node == null)
+      return root.firstChild;
+
+    if (node.firstChild)
+      return node.firstChild;
+
+    if (node.nextSibling)
+      return node.nextSibling;
+
+    for (;;)
+    {
+      node = node.parentNode;
+
+      if (!node || node == root)
+        break;
+
+      if (node && node.nextSibling)
+        return node.nextSibling;
+    }
+
+    return null;
+  },
+
+  // right to left traversal of root's content
+  previous_node: function (root, node) {
+    if (node == null)
+    {
+      node = root.lastChild;
+
+      if (node)
+      {
+        while (node.lastChild)
+          node = node.lastChild;
+      }
+
+      return node;
+    }
+
+    if (node.previousSibling)
+    {
+      node = node.previousSibling;
+
+      while (node.lastChild)
+        node = node.lastChild;
+
+      return node;
+    }
+
+    if (node.parentNode != root)
+      return node.parentNode;
+
+    return null;
+  },
+
+  previous_sibling_element: function (el) {
+    el = el.previousSibling;
+
+    while (el && el.nodeType != 1)
+      el = el.previousSibling;
+
+    return el;
+  },
+
+  next_sibling_element: function (el) {
+    el = el.nextSibling;
+
+    while (el && el.nodeType != 1)
+      el = el.nextSibling;
+
+    return el;
+  },
+
+  first_child_element: function (el) {
+    var node;
+
+    for (node = el.firstChild; node; node = node.nextSibling)
+    {
+      if (node.nodeType == 1)
+        break;
+    }
+
+    return node;
+  },
+
+  first_tag: function (element, tag) {
+    var node;
+
+    if (!this.is_xhtml)
+      tag = tag.toUpperCase();
+
+    for (node = element.firstChild; node; node = node.nextSibling)
+    {
+      if (node.nodeType == 1 && node.nodeName == tag)
+        break;
+    }
+
+    return node;
+  },
+
+  hide_selection: function () {
+    if (window.getSelection) // Firefox, Chromium, Safari, Opera
+    {
+      var selection = window.getSelection();
+
+      if (selection.rangeCount > 0)
+      {
+        var range = selection.getRangeAt(0);
+        range.collapse (false);
+      }
+    }
+    else // Internet Explorer
+    {
+      var textRange = document.selection.createRange ();
+      textRange.collapse (false);
+    }
+  },
+
+  get_selected_text: function () {
+    try
+    {
+      if (window.getSelection)
+        return window.getSelection().toString();
+
+      if (document.getSelection)
+        return document.getSelection().toString();
+
+      if (document.selection)
+        return document.selection.createRange().text;
+    }
+    catch (e)
+    {
+    }
+
+    return "";
+  },
+
+  // make note of length of selected text
+  // as this evaluates to zero in click event
+  mouse_button_up: function (e) {
+    w3c_slidy.selected_text_len = w3c_slidy.get_selected_text().length;
+  },
+
+  mouse_button_down: function (e) {
+    w3c_slidy.selected_text_len = w3c_slidy.get_selected_text().length;
+    w3c_slidy.mouse_x = e.clientX;
+    w3c_slidy.mouse_y = e.clientY;
+  },
+
+  // right mouse button click is reserved for context menus
+  // it is more reliable to detect rightclick than leftclick
+  mouse_button_click: function (e) {
+    if (!e)
+      var e = window.event;
+
+    if (Math.abs(e.clientX -w3c_slidy.mouse_x) +
+        Math.abs(e.clientY -w3c_slidy.mouse_y) > 10)
+      return true;
+
+    if (w3c_slidy.selected_text_len > 0)
+      return true;
+
+    var rightclick = false;
+    var leftclick = false;
+    var middleclick = false;
+    var target;
+
+    if (!e)
+      var e = window.event;
+
+    if (e.target)
+      target = e.target;
+    else if (e.srcElement)
+      target = e.srcElement;
+
+    // work around Safari bug
+    if (target.nodeType == 3)
+      target = target.parentNode;
+
+    if (e.which) // all browsers except IE
+    {
+      leftclick = (e.which == 1);
+      middleclick = (e.which == 2);
+      rightclick = (e.which == 3);
+    }
+    else if (e.button)
+    {
+      // Konqueror gives 1 for left, 4 for middle
+      // IE6 gives 0 for left and not 1 as I expected
+
+      if (e.button == 4)
+        middleclick = true;
+
+      // all browsers agree on 2 for right button
+      rightclick = (e.button == 2);
+    }
+    else
+      leftclick = true;
+
+    if (w3c_slidy.selected_text_len > 0)
+    {
+      w3c_slidy.stop_propagation(e);
+      e.cancel = true;
+      e.returnValue = false;
+      return false;
+    }
+
+    // dismiss table of contents
+    w3c_slidy.hide_table_of_contents(false);
+
+    // check if target is something that probably want's clicks
+    // e.g. a, embed, object, input, textarea, select, option
+    var tag = target.nodeName.toLowerCase();
+
+    if (w3c_slidy.mouse_click_enabled && leftclick &&
+        !w3c_slidy.special_element(target) &&
+        !target.onclick)
+    {
+      w3c_slidy.next_slide(true);
+      w3c_slidy.stop_propagation(e);
+      e.cancel = true;
+      e.returnValue = false;
+      return false;
+    }
+
+    return true;
+  },
+
+  special_element: function (element) {
+    if (this.has_class(element, "non-interactive"))
+      return false;
+
+    var tag = element.nodeName.toLowerCase();
+
+    return element.onkeydown ||
+      element.onclick ||
+      tag == "a" ||
+      tag == "embed" ||
+      tag == "object" ||
+      tag == "video" ||
+      tag == "audio" ||
+      tag == "svg" ||
+      tag == "canvas" ||
+      tag == "input" ||
+      tag == "textarea" ||
+      tag == "select" ||
+      tag == "option";
+  },
+
+  slidy_chrome: function (el) {
+    while (el)
+    {
+      if (el == w3c_slidy.toc ||
+          el == w3c_slidy.toolbar ||
+          w3c_slidy.has_class(el, "outline"))
+        return true;
+
+      el = el.parentNode;
+    }
+
+    return false;
+  },
+
+  get_key: function (e)
+  {
+    var key;
+
+    // kludge around NS/IE differences 
+    if (typeof window.event != "undefined")
+      key = window.event.keyCode;
+    else if (e.which)
+      key = e.which;
+
+    return key;
+  },
+
+  get_target: function (e) {
+    var target;
+
+    if (!e)
+      e = window.event;
+
+    if (e.target)
+      target = e.target;
+    else if (e.srcElement)
+      target = e.srcElement;
+
+    if (target.nodeType != 1)
+      target = target.parentNode;
+
+    return target;
+  },
+
+  // does display property provide correct defaults?
+  is_block: function (elem) {
+    var tag = elem.nodeName.toLowerCase();
+
+    return tag == "ol" || tag == "ul" || tag == "p" || tag == "dl" ||
+           tag == "li" || tag == "table" || tag == "pre" ||
+           tag == "h1" || tag == "h2" || tag == "h3" ||
+           tag == "h4" || tag == "h5" || tag == "h6" ||
+           tag == "blockquote" || tag == "address"; 
+  },
+
+  add_listener: function (element, event, handler) {
+    if (window.addEventListener)
+      element.addEventListener(event, handler, false);
+    else
+      element.attachEvent("on"+event, handler);
+  },
+
+  // used to prevent event propagation from field controls
+  stop_propagation: function (event) {
+    event = event ? event : window.event;
+    event.cancelBubble = true;  // for IE
+
+    if (event.stopPropagation)
+      event.stopPropagation();
+
+    return true;
+  },
+
+  cancel: function (event) {
+    if (event)
+    {
+       event.cancel = true;
+       event.returnValue = false;
+
+      if (event.preventDefault)
+        event.preventDefault();
+    }
+
+    w3c_slidy.key_wanted = false;
+    return false;
+  },
+
+// for each language define an associative array
+// and also the help text which is longer
+
+  strings_es: {
+    "slide":"pág.",
+    "help?":"Ayuda",
+    "contents?":"Índice",
+    "table of contents":"tabla de contenidos",
+    "Table of Contents":"Tabla de Contenidos",
+    "restart presentation":"Reiniciar presentación",
+    "restart?":"Inicio"
+  },
+  help_es:
+    "Utilice el ratón, barra espaciadora, teclas Izda/Dcha, " +
+    "o Re pág y Av pág. Use S y B para cambiar el tamaño de fuente.",
+
+  strings_ca: {
+    "slide":"pàg..",
+    "help?":"Ajuda",
+    "contents?":"Índex",
+    "table of contents":"taula de continguts",
+    "Table of Contents":"Taula de Continguts",
+    "restart presentation":"Reiniciar presentació",
+    "restart?":"Inici"
+  },
+  help_ca:
+    "Utilitzi el ratolí, barra espaiadora, tecles Esq./Dta. " +
+    "o Re pàg y Av pàg. Usi S i B per canviar grandària de font.",
+
+  strings_cs: {
+    "slide":"snímek",
+    "help?":"nápověda",
+    "contents?":"obsah",
+    "table of contents":"obsah prezentace",
+    "Table of Contents":"Obsah prezentace",
+    "restart presentation":"znovu spustit prezentaci",
+    "restart?":"restart"
+  },
+  help_cs:
+    "Prezentaci můžete procházet pomocí kliknutí myši, mezerníku, " +
+    "šipek vlevo a vpravo nebo kláves PageUp a PageDown. Písmo se " +
+    "dá zvětšit a zmenšit pomocí kláves B a S.",
+
+  strings_nl: {
+    "slide":"pagina",
+    "help?":"Help?",
+    "contents?":"Inhoud?",
+    "table of contents":"inhoudsopgave",
+    "Table of Contents":"Inhoudsopgave",
+    "restart presentation":"herstart presentatie",
+    "restart?":"Herstart?"
+  },
+  help_nl:
+     "Navigeer d.m.v. het muis, spatiebar, Links/Rechts toetsen, " +
+     "of PgUp en PgDn. Gebruik S en B om de karaktergrootte te veranderen.",
+
+  strings_de: {
+    "slide":"Seite",
+    "help?":"Hilfe",
+    "contents?":"Übersicht",
+    "table of contents":"Inhaltsverzeichnis",
+    "Table of Contents":"Inhaltsverzeichnis",
+    "restart presentation":"Präsentation neu starten",
+    "restart?":"Neustart"
+  },
+  help_de:
+    "Benutzen Sie die Maus, Leerschlag, die Cursortasten links/rechts oder " +
+    "Page up/Page Down zum Wechseln der Seiten und S und B für die Schriftgrösse.",
+
+  strings_pl: {
+    "slide":"slajd",
+    "help?":"pomoc?",
+    "contents?":"spis treści?",
+    "table of contents":"spis treści",
+    "Table of Contents":"Spis Treści",
+    "restart presentation":"Restartuj prezentację",
+    "restart?":"restart?"
+  },
+  help_pl:
+    "Zmieniaj slajdy klikając myszą, naciskając spację, strzałki lewo/prawo" +
+    "lub PgUp / PgDn. Użyj klawiszy S i B, aby zmienić rozmiar czczionki.",
+
+  strings_fr: {
+    "slide":"page",
+    "help?":"Aide",
+    "contents?":"Index",
+    "table of contents":"table des matières",
+    "Table of Contents":"Table des matières",
+    "restart presentation":"Recommencer l'exposé",
+    "restart?":"Début"
+  },
+  help_fr:
+    "Naviguez avec la souris, la barre d'espace, les flèches " +
+    "gauche/droite ou les touches Pg Up, Pg Dn. Utilisez " +
+    "les touches S et B pour modifier la taille de la police.",
+
+  strings_hu: {
+    "slide":"oldal",
+    "help?":"segítség",
+    "contents?":"tartalom",
+    "table of contents":"tartalomjegyzék",
+    "Table of Contents":"Tartalomjegyzék",
+    "restart presentation":"bemutató újraindítása",
+    "restart?":"újraindítás"
+  },
+  help_hu:
+    "Az oldalak közti lépkedéshez kattintson az egérrel, vagy " +
+    "használja a szóköz, a bal, vagy a jobb nyíl, illetve a Page Down, " +
+    "Page Up billentyűket. Az S és a B billentyűkkel változtathatja " +
+    "a szöveg méretét.",
+
+  strings_it: {
+    "slide":"pag.",
+    "help?":"Aiuto",
+    "contents?":"Indice",
+    "table of contents":"indice",
+    "Table of Contents":"Indice",
+    "restart presentation":"Ricominciare la presentazione",
+    "restart?":"Inizio"
+  },
+  help_it:
+    "Navigare con mouse, barra spazio, frecce sinistra/destra o " +
+    "PgUp e PgDn. Usare S e B per cambiare la dimensione dei caratteri.",
+
+  strings_el: {
+    "slide":"σελίδα",
+    "help?":"βοήθεια;",
+    "contents?":"περιεχόμενα;",
+    "table of contents":"πίνακας περιεχομένων",
+    "Table of Contents":"Πίνακας Περιεχομένων",
+    "restart presentation":"επανεκκίνηση παρουσίασης",
+    "restart?":"επανεκκίνηση;"
+  },
+  help_el:
+    "Πλοηγηθείτε με το κλίκ του ποντικιού, το space, τα βέλη αριστερά/δεξιά, " +
+    "ή Page Up και Page Down. Χρησιμοποιήστε τα πλήκτρα S και B για να αλλάξετε " +
+    "το μέγεθος της γραμματοσειράς.",
+
+  strings_ja: {
+    "slide":"スライド",
+    "help?":"ヘルプ",
+    "contents?":"目次",
+    "table of contents":"目次を表示",
+    "Table of Contents":"目次",
+    "restart presentation":"最初から再生",
+    "restart?":"最初から"
+  },
+  help_ja:
+     "マウス左クリック ・ スペース ・ 左右キー " +
+     "または Page Up ・ Page Downで操作, S ・ Bでフォントサイズ変更",
+
+  strings_zh: {
+    "slide":"幻灯片",
+    "help?":"帮助?",
+    "contents?":"内容?",
+    "table of contents":"目录",
+    "Table of Contents":"目录",
+    "restart presentation":"重新启动展示",
+    "restart?":"重新启动?"
+  },
+  help_zh:
+    "用鼠标点击, 空格条, 左右箭头, Pg Up 和 Pg Dn 导航. " +
+    "用 S, B 改变字体大小.",
+
+  strings_ru: {
+    "slide":"слайд",
+    "help?":"помощь?",
+    "contents?":"содержание?",
+    "table of contents":"оглавление",
+    "Table of Contents":"Оглавление",
+    "restart presentation":"перезапустить презентацию",
+    "restart?":"перезапуск?"
+  },
+  help_ru:
+    "Перемещайтесь кликая мышкой, используя клавишу пробел, стрелки" +
+    "влево/вправо или Pg Up и Pg Dn. Клавиши S и B меняют размер шрифта.",
+
+  strings_sv: {
+    "slide":"sida",
+    "help?":"hjälp",
+    "contents?":"innehåll",
+    "table of contents":"innehållsförteckning",
+    "Table of Contents":"Innehållsförteckning",
+    "restart presentation":"visa presentationen från början",
+    "restart?":"börja om"
+  },
+  help_sv:
+    "Bläddra med ett klick med vänstra musknappen, mellanslagstangenten, " +
+    "vänster- och högerpiltangenterna eller tangenterna Pg Up, Pg Dn. " +
+    "Använd tangenterna S och B för att ändra textens storlek.",
+
+  strings: { },
+
+  localize: function (src) {
+    if (src == "")
+      return src;
+
+     // try full language code, e.g. en-US
+     var s, lookup = w3c_slidy.strings[w3c_slidy.lang];
+
+     if (lookup)
+     {
+       s = lookup[src];
+
+       if (s)
+        return s;
+     }
+
+     // strip country code suffix, e.g.
+     // try en if undefined for en-US
+     var lg = w3c_slidy.lang.split("-");
+
+     if (lg.length > 1)
+     {
+       lookup = w3c_slidy.strings[lg[0]];
+
+       if (lookup)
+       {
+         s = lookup[src];
+
+         if (s)
+          return s;
+       }
+     }
+
+     // otherwise string as is
+     return src;
+  },
+
+  init_localization: function () {
+    var i18n = w3c_slidy;
+    var help_text = w3c_slidy.help_text;
+
+    // each such language array is declared in the localize array
+    // this is used as in  w3c_slidy.localize("foo");
+    this.strings = {
+      "es":this.strings_es,
+      "ca":this.strings_ca,
+      "cs":this.strings_cs,
+      "nl":this.strings_nl,
+      "de":this.strings_de,
+      "pl":this.strings_pl,
+      "fr":this.strings_fr,
+      "hu":this.strings_hu,
+      "it":this.strings_it,
+      "el":this.strings_el,
+      "jp":this.strings_ja,
+      "zh":this.strings_zh,
+      "ru":this.strings_ru,
+      "sv":this.strings_sv
+    },
+
+    i18n.strings_es[help_text] = i18n.help_es;
+    i18n.strings_ca[help_text] = i18n.help_ca;
+    i18n.strings_cs[help_text] = i18n.help_cs;
+    i18n.strings_nl[help_text] = i18n.help_nl;
+    i18n.strings_de[help_text] = i18n.help_de;
+    i18n.strings_pl[help_text] = i18n.help_pl;
+    i18n.strings_fr[help_text] = i18n.help_fr;
+    i18n.strings_hu[help_text] = i18n.help_hu;
+    i18n.strings_it[help_text] = i18n.help_it;
+    i18n.strings_el[help_text] = i18n.help_el;
+    i18n.strings_ja[help_text] = i18n.help_ja;
+    i18n.strings_zh[help_text] = i18n.help_zh;
+    i18n.strings_ru[help_text] = i18n.help_ru;
+    i18n.strings_sv[help_text] = i18n.help_sv;
+
+    w3c_slidy.lang = document.body.parentNode.getAttribute("lang");
+
+    if (!w3c_slidy.lang)
+      w3c_slidy.lang = document.body.parentNode.getAttribute("xml:lang");
+
+    if (!w3c_slidy.lang)
+      w3c_slidy.lang = "en";
+  }
+};
+
+// hack for back button behavior
+if (w3c_slidy.ie6 || w3c_slidy.ie7)
+{
+  document.write("<iframe id='historyFrame' " +
+  "src='javascript:\"<html"+"></"+"html>\"' " +
+  "height='1' width='1' " +
+  "style='position:absolute;left:-800px'></iframe>");
+}
+
+// attach event listeners for initialization
+w3c_slidy.set_up();
+
+// hide the slides as soon as body element is available
+// to reduce annoying screen mess before the onload event
+setTimeout(w3c_slidy.hide_slides, 50);
+
diff --git a/inst/rmd/slidy/Slidy2/scripts/slidy.js.gz b/inst/rmd/slidy/Slidy2/scripts/slidy.js.gz
new file mode 100644
index 0000000..6fe273e
Binary files /dev/null and b/inst/rmd/slidy/Slidy2/scripts/slidy.js.gz differ
diff --git a/inst/rmd/slidy/Slidy2/styles/slidy.css b/inst/rmd/slidy/Slidy2/styles/slidy.css
new file mode 100644
index 0000000..eac468c
--- /dev/null
+++ b/inst/rmd/slidy/Slidy2/styles/slidy.css
@@ -0,0 +1,436 @@
+/* slidy.css
+
+   Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+   W3C liability, trademark, document use and software licensing
+   rules apply, see:
+
+   http://www.w3.org/Consortium/Legal/copyright-documents
+   http://www.w3.org/Consortium/Legal/copyright-software
+*/
+body
+{
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  width: 100%;
+  height: 100%;
+  color: black;
+  background-color: white;
+  font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif;
+  font-size: 14pt;
+}
+
+div.toolbar {
+  position: fixed; z-index: 200;
+  top: auto; bottom: 0; left: 0; right: 0;
+  height: 1.2em; text-align: right;
+  padding-left: 1em;
+  padding-right: 1em; 
+  font-size: 60%;
+  color: DimGray;
+  background-color: rgb(240,240,240);
+  border-top: solid 1px rgb(180,180,180);
+}
+
+div.toolbar span.copyright {
+  color: DimGray;
+  margin-left: 0.5em;
+}
+
+div.initial_prompt {
+  position: absolute;
+  z-index: 1000;
+  bottom: 1.2em;
+  width: 100%;
+  background-color: rgb(200,200,200);
+  opacity: 0.35;
+  background-color: rgb(200,200,200, 0.35);
+  cursor: pointer;
+}
+
+div.initial_prompt p.help {
+  text-align: center;
+}
+
+div.initial_prompt p.close {
+  text-align: right;
+  font-style: italic;
+}
+
+div.slidy_toc {
+  position: absolute;
+  z-index: 300;
+  width: 60%;
+  max-width: 30em;
+  height: 30em;
+  overflow: auto;
+  top: auto;
+  right: auto;
+  left: 4em;
+  bottom: 4em;
+  padding: 1em;
+  background: rgb(240,240,240);
+  border-style: solid;
+  border-width: 2px;
+  font-size: 60%;
+}
+
+div.slidy_toc .toc_heading {
+  text-align: center;
+  width: 100%;
+  margin: 0;
+  margin-bottom: 1em;
+  border-bottom-style: solid;
+  border-bottom-color: rgb(180,180,180);
+  border-bottom-width: 1px;
+}
+
+div.slide {
+  z-index: 20;
+  margin: 0 0 0 0;
+  padding-top: 0;
+  padding-bottom: 0;
+  padding-left: 20px;
+  padding-right: 20px;
+  border-width: 0;
+  clear: both;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  line-height: 120%;
+  background-color: transparent;
+}
+
+div.background {
+  display: none;
+}
+
+div.handout {
+  margin-left: 20px;
+  margin-right: 20px;
+}
+
+div.slide.titlepage {
+  text-align: center;
+}
+
+div.slide.titlepage h1 {
+  padding-top: 10%;
+  margin-right: 0;
+}
+
+div.slide h1 {
+  padding-left: 0;
+  padding-right: 20pt;
+  padding-top: 4pt;
+  padding-bottom: 4pt;
+  margin-top: 0;
+  margin-left: 0;
+  margin-right: 60pt;
+  margin-bottom: 0.5em;
+  display: block; 
+  font-size: 160%;
+  line-height: 1.2em;
+  background: transparent;
+}
+
+ at media screen and (max-device-width: 1024px)
+{
+  div.slide { font-size: 100%; }
+}
+
+ at media screen and (max-device-width: 800px)
+{
+  div.slide { font-size: 200%; }
+  div.slidy_toc {
+    top: 1em;
+    left: 1em;
+    right: auto;
+    width: 80%;
+    font-size: 180%;
+  }
+}
+
+div.toc-heading {
+  width: 100%;
+  border-bottom: solid 1px rgb(180,180,180);
+  margin-bottom: 1em;
+  text-align: center;
+}
+
+img {
+  image-rendering: optimize-quality;
+}
+
+pre {
+ font-size: 80%;
+ font-weight: bold;
+ line-height: 120%;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+ padding-left: 1em;
+ padding-right: 1em;
+ border-style: solid;
+ border-left-width: 1em;
+ border-top-width: thin;
+ border-right-width: thin;
+ border-bottom-width: thin;
+ border-color: #95ABD0;
+ color: #00428C;
+ background-color: #E4E5E7;
+}
+
+li pre { margin-left: 0; }
+
+blockquote { font-style: italic }
+
+img { background-color: transparent }
+
+p.copyright { font-size: smaller }
+
+.center { text-align: center }
+.footnote { font-size: smaller; margin-left: 2em; }
+
+a img { border-width: 0; border-style: none }
+
+a:visited { color: navy }
+a:link { color: navy }
+a:hover { color: red; text-decoration: underline }
+a:active { color: red; text-decoration: underline }
+
+a {text-decoration: none}
+.toolbar a:link {color: blue}
+.toolbar a:visited {color: blue}
+.toolbar a:active {color: red}
+.toolbar a:hover {color: red}
+
+ul { list-style-type: square; }
+ul ul { list-style-type: disc; }
+ul ul ul { list-style-type: circle; }
+ul ul ul ul { list-style-type: disc; }
+li { margin-left: 0.5em; margin-top: 0.5em; }
+li li { font-size: 85%; font-style: italic }
+li li li { font-size: 85%; font-style: normal }
+
+div dt
+{
+  margin-left: 0;
+  margin-top: 1em;
+  margin-bottom: 0.5em;
+  font-weight: bold;
+}
+div dd
+{
+  margin-left: 2em;
+  margin-bottom: 0.5em;
+}
+
+
+p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table {
+  margin-left: 1em;
+  margin-right: 1em;
+}
+
+p.subhead { font-weight: bold; margin-top: 2em; }
+
+.smaller { font-size: smaller }
+.bigger { font-size: 130% }
+
+td,th { padding: 0.2em }
+
+ul {
+  margin: 0.5em 1.5em 0.5em 1.5em;
+  padding: 0;
+}
+
+ol {
+  margin: 0.5em 1.5em 0.5em 1.5em;
+  padding: 0;
+}
+
+ul { list-style-type: square; }
+ul ul { list-style-type: disc; }
+ul ul ul { list-style-type: circle; }
+ul ul ul ul { list-style-type: disc; }
+
+ul li { 
+  list-style: square;
+  margin: 0.1em 0em 0.6em 0;
+  padding: 0 0 0 0;
+  line-height: 140%;
+}
+
+ol li { 
+  margin: 0.1em 0em 0.6em 1.5em;
+  padding: 0 0 0 0px;
+  line-height: 140%;
+  list-style-type: decimal;
+}
+
+li ul li { 
+  font-size: 85%; 
+  font-style: italic;
+  list-style-type: disc;
+  background: transparent;
+  padding: 0 0 0 0;
+}
+li li ul li { 
+  font-size: 85%; 
+  font-style: normal;
+  list-style-type: circle;
+  background: transparent;
+  padding: 0 0 0 0;
+}
+li li li ul li {
+  list-style-type: disc;
+  background: transparent;
+  padding: 0 0 0 0;
+}
+
+li ol li {
+  list-style-type: decimal;
+}
+
+
+li li ol li {
+  list-style-type: decimal;
+}
+
+/*
+ setting class="outline on ol or ul makes it behave as an
+ ouline list where blocklevel content in li elements is
+ hidden by default and can be expanded or collapsed with
+ mouse click. Set class="expand" on li to override default
+*/
+
+ol.outline li:hover { cursor: pointer }
+ol.outline li.nofold:hover { cursor: default }
+
+ul.outline li:hover { cursor: pointer }
+ul.outline li.nofold:hover { cursor: default }
+
+ol.outline { list-style:decimal; }
+ol.outline ol { list-style-type:lower-alpha }
+
+ol.outline li.nofold {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em;
+}
+ol.outline li.unfolded {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em;
+}
+ol.outline li.folded {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em;
+}
+ol.outline li.unfolded:hover {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em;
+}
+ol.outline li.folded:hover {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em;
+}
+
+ul.outline li.nofold {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em;
+}
+ul.outline li.unfolded {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em;
+}
+ul.outline li.folded {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em;
+}
+ul.outline li.unfolded:hover {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em;
+}
+ul.outline li.folded:hover {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em;
+}
+
+/* for slides with class "title" in table of contents */
+a.titleslide { font-weight: bold; font-style: italic }
+
+/*
+ hide images for work around for save as bug
+ where browsers fail to save images used by CSS
+*/
+img.hidden { display: none; visibility: hidden }
+div.initial_prompt { display: none; visibility: hidden }
+
+  div.slide {
+     visibility: visible;
+     position: inherit;
+  }
+  div.handout {
+     border-top-style: solid;
+     border-top-width: thin;
+     border-top-color: black;
+  }
+
+ at media screen {
+  .hidden { display: none; visibility: visible }
+
+  div.slide.hidden { display: block; visibility: visible }
+  div.handout.hidden { display: block; visibility: visible }
+  div.background { display: none; visibility: hidden }
+  body.single_slide div.initial_prompt { display: block; visibility: visible }
+  body.single_slide div.background { display: block; visibility: visible }
+  body.single_slide div.background.hidden { display: none; visibility: hidden }
+  body.single_slide .invisible { visibility: hidden }
+  body.single_slide .hidden { display: none; visibility: hidden }
+  body.single_slide div.slide { position: absolute }
+  body.single_slide div.handout { display: none; visibility: hidden }
+}
+
+ at media print {
+  .hidden { display: block; visibility: visible }
+
+  div.slide pre { font-size: 60%; padding-left: 0.5em; }
+  div.toolbar { display: none; visibility: hidden; }
+  div.slidy_toc { display: none; visibility: hidden; }
+  div.background { display: none; visibility: hidden; }
+  div.slide { page-break-before: always }
+  /* :first-child isn't reliable for print media */
+  div.slide.first-slide { page-break-before: avoid }
+}
+
+/* the below rules increase compatibility with Shiny and Bootstrap */
+
+/* remove margins that misalign sliders */
+.jslider table {
+   margin-left: 0em;
+   margin-right: 0em;
+}
+
+/* don't use very large fonts in datatables */
+table.dataTable, .shiny-datatable-output div {
+   font-size: 14pt;
+}
+
+/* adjust footer element size for DT package */
+.dataTables_info, .dataTables_paginate {
+  font-size: 19px;
+}
+
+/* allow R chunks to render in a large font */
+pre.sourceCode, code.sourceCode {
+   font-size: 80%;
+}
+
+/* increase the input font size set by Bootstrap */
+label, button, input, select, textarea {
+   font-size: 14pt;
+}
+
+/* eliminate bullets in Bootstrap navigation lists */
+ul.nav, ul.nav li {
+   list-style-type: none;
+}
+
diff --git a/inst/rmd/slidy/Slidy2/styles/w3c-blue.css b/inst/rmd/slidy/Slidy2/styles/w3c-blue.css
new file mode 100644
index 0000000..6c4ff4f
--- /dev/null
+++ b/inst/rmd/slidy/Slidy2/styles/w3c-blue.css
@@ -0,0 +1,497 @@
+/* w3c-blue.css
+
+   Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+   W3C liability, trademark, document use and software licensing
+   rules apply, see:
+
+   http://www.w3.org/Consortium/Legal/copyright-documents
+   http://www.w3.org/Consortium/Legal/copyright-software
+*/
+body
+{
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  width: 100%;
+  height: 100%;
+  color: black;
+  background-color: white;
+  font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif;
+  font-size: 14pt;
+}
+
+div.slide.titlepage {
+  text-align: center;
+}
+
+div.slide.titlepage h1 {
+  padding-top: 40%;
+}
+
+div.slide {
+  z-index: 20;
+  margin: 0 0 0 0;
+  padding: 0;
+  border-width: 0;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  line-height: 120%;
+  background-color: transparent;
+}
+
+div.background {
+  z-index: 1;
+  position: absolute;
+  vertical-align: bottom;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: auto;
+  height: 4.1em;
+  padding: 0 0 0 0.2em;
+  margin: 0 0 0 0;
+  border-width: 0;
+  background-color: #728ec2;
+}
+
+div.background img {
+  height: 4em;
+}
+
+/* this rule is hidden from IE which doesn't support + selector */
+div.slide + div[class].slide { page-break-before: always;}
+
+div.slide h1 {
+  padding-left: 3em;
+  padding-right: 3em;
+  padding-top: 0.1em;
+  margin-bottom: 0.8em;
+  margin-top: -0.05em;
+  margin-left: 0;
+  margin-right: 0;
+  min-height: 2.3em;
+  color: white;
+  height: 2.2em;
+  font-size: 160%;
+  line-height: 1.1em;
+}
+
+div.slide h1 a {
+  color: white;
+  text-decoration: none;
+}
+
+div.slide h1 a:link {
+  color: white;
+  text-decoration: none;
+}
+
+div.slide h1 a:visited {
+  color: white;
+  text-decoration: none;
+}
+
+div.slide h1 a:hover {
+  color: white;
+  text-decoration: underline;
+}
+
+div.slide h1 a:active {
+  color: red;
+  text-decoration: underline;
+}
+
+#head-icon {
+  margin-top: 0.5em;
+  margin-bottom: 0;
+  margin-left: 0;
+  margin-right: 1em;
+  background:  #728ec2;
+  border-width: 0;
+  height: 3em;
+  max-width: 3em;
+  z-index: 2;
+  float: left;
+}
+
+#head-logo {
+  margin: 0;
+  margin-top: 0.25em;
+  padding-top: 0.25em;
+  padding-bottom: 0.2em;
+  padding-left: 0;
+  padding-right: 0;
+  height: 3.2em;
+  width: 4.8em;
+  float: right;
+  z-index: 2;
+  background: #728ec2;
+}
+
+#head-logo-fallback {
+  margin: 0;
+  padding: 0;
+  margin-top: -0.8em;
+  width: 4.8em;
+  float: right;
+  z-index: 2;
+}
+
+/* the next two classes support vertical and horizontal centering */
+div.vbox {
+  float: left;
+  height: 40%;
+  width: 50%;
+  margin-top: -240px;
+}
+div.hbox {
+  width:60%;
+  margin-top: 0;
+  margin-left:auto;
+  margin-right:auto;
+  height: 60%;
+  border:1px solid silver;
+  background:#F0F0F0;
+  overflow:auto;
+  text-align:left;
+  clear:both;
+}
+
+/* styling for named background */
+div.background.slanty {
+  z-index: 2;
+  bottom: 0; 
+  height: 100%;
+  background: transparent;
+}
+
+div.background.slanty img { margin-top: 4em; width: 100%; height: 80% }
+
+/* the following makes the pre background translucent */
+/* opacity is a CSS3 property but supported by Mozilla family */
+/* filter is an IE specific feature that also requires width */
+div.slide.slanty pre {
+  width: 93%;  /* needed for IE filter to work */
+  opacity: .8;
+  filter: alpha(opacity=80);
+}
+
+img.withBorder {
+  border: 2px solid #c60;
+  padding: 4px;
+}
+
+li pre { margin-left: 0; }
+
+ at media print { pre { font-size: 60% } }
+
+blockquote { font-style: italic }
+
+img { background-color: transparent }
+
+p.copyright { font-size: smaller }
+
+.center { text-align: center }
+.footnote { font-size: smaller; margin-left: 2em; }
+
+a img { border-width: 0; border-style: none }
+
+a:visited { color: navy }
+a:link { color: navy }
+a:hover { color: red; text-decoration: underline }
+a:active { color: red; text-decoration: underline }
+
+a {text-decoration: none}
+.navbar a:link {color: white}
+.navbar a:visited {color: yellow}
+.navbar a:active {color: red}
+.navbar a:hover {color: red}
+
+ul { list-style-type: square; }
+ul ul { list-style-type: disc; }
+ul ul ul { list-style-type: circle; }
+ul ul ul ul { list-style-type: disc; }
+li { margin-left: 0.5em; margin-top: 0.5em; }
+li li { font-size: 85%; font-style: italic }
+li li li { font-size: 85%; font-style: normal }
+
+div dt
+{
+  margin-left: 0;
+  margin-top: 1em;
+  margin-bottom: 0.5em;
+  font-weight: bold;
+}
+div dd
+{
+  margin-left: 2em;
+  margin-bottom: 0.5em;
+}
+
+
+p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table {
+  margin-left: 1em;
+  margin-right: 1em;
+}
+
+p.subhead { font-weight: bold; margin-top: 2em; }
+
+div.cover p.explanation {
+  font-style: italic;
+  margin-top: 3em;
+}
+
+
+.smaller { font-size: smaller }
+
+td,th { padding: 0.2em }
+
+ul {
+  margin: 0.5em 1.5em 0.5em 1.5em;
+  padding: 0;
+}
+
+ol {
+  margin: 0.5em 1.5em 0.5em 1.5em;
+  padding: 0;
+}
+
+ul { list-style-type: square; }
+ul ul { list-style-type: disc; }
+ul ul ul { list-style-type: circle; }
+ul ul ul ul { list-style-type: disc; }
+li { margin-left: 0.5em; margin-top: 0.5em; }
+li li { font-size: 85%; font-style: italic }
+li li li { font-size: 85%; font-style: normal }
+
+
+ul li { 
+  list-style: none;
+  margin: 0.1em 0em 0.6em 0;
+  padding: 0 0 0 40px;
+  background: transparent url(../graphics/bullet.png) no-repeat 5px 0.3em;
+  line-height: 140%;
+}
+
+/* workaround IE's failure to support background on li for print media */
+ at media print { ul li { list-style: disc; padding-left: 0; background: none; } }
+
+ol li { 
+  margin: 0.1em 0em 0.6em 1.5em;
+  padding: 0 0 0 0px;
+  line-height: 140%;
+}
+
+li li { 
+  font-size: 85%; 
+  font-style: italic;
+  list-style-type: disc;
+  background: transparent;
+  padding: 0 0 0 0;
+}
+li li li { 
+  font-size: 85%; 
+  font-style: normal;
+  list-style-type: circle;
+  background: transparent;
+  padding: 0 0 0 0;
+}
+li li li li {
+  list-style-type: disc;
+  background: transparent;
+  padding: 0 0 0 0;
+}
+
+/* rectangular blue bullet + unfold/nofold/fold widget */
+
+/*
+ setting class="outline on ol or ul makes it behave as an
+ ouline list where blocklevel content in li elements is
+ hidden by default and can be expanded or collapsed with
+ mouse click. Set class="expand" on li to override default
+*/
+
+ol.outline li:hover { cursor: pointer }
+ol.outline li.nofold:hover { cursor: default }
+
+ul.outline li:hover { cursor: pointer }
+ul.outline li.nofold:hover { cursor: default }
+
+ol.outline { list-style:decimal; }
+ol.outline ol { list-style-type:lower-alpha }
+
+ol.outline li.nofold {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.3em;
+}
+ol.outline li.unfolded {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.3em;
+}
+ol.outline li.folded {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.3em;
+}
+ol.outline li.unfolded:hover {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/fold.gif) no-repeat 0px 0.3em;
+}
+ol.outline li.folded:hover {
+  padding: 0 0 0 20px;
+  background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.3em;
+}
+
+ul.outline li.nofold {
+  padding: 0 0 0 52px;
+  background: transparent url(../graphics/bullet-nofold-dim.gif) no-repeat 5px 0.3em;
+}
+ul.outline li.unfolded {
+  padding: 0 0 0 52px;
+  background: transparent url(../graphics/bullet-fold-dim.gif) no-repeat 5px 0.3em;
+}
+ul.outline li.folded {
+  padding: 0 0 0 52px;
+  background: transparent url(../graphics/bullet-unfold-dim.gif) no-repeat 5px 0.3em;
+}
+ul.outline li.unfolded:hover {
+  padding: 0 0 0 52px;
+  background: transparent url(../graphics/bullet-fold.gif) no-repeat 5px 0.3em;
+}
+ul.outline li.folded:hover {
+  padding: 0 0 0 52px;
+  background: transparent url(../graphics/bullet-unfold.gif) no-repeat 5px 0.3em;
+}
+
+li ul.outline li.nofold {
+  padding: 0 0 0 21px;
+  background: transparent url(../graphics/nofold-dim.gif) no-repeat 5px 0.3em;
+}
+li ul.outline li.unfolded {
+  padding: 0 0 0 21px;
+  background: transparent url(../graphics/fold-dim.gif) no-repeat 5px 0.3em;
+}
+li ul.outline li.folded {
+  padding: 0 0 0 21px;
+  background: transparent url(../graphics/unfold-dim.gif) no-repeat 5px 0.3em;
+}
+li ul.outline li.unfolded:hover {
+  padding: 0 0 0 21px;
+  background: transparent url(../graphics/fold.gif) no-repeat 5px 0.3em;
+}
+li ul.outline li.folded:hover {
+  padding: 0 0 0 21px;
+  background: transparent url(../graphics/unfold.gif) no-repeat 5px 0.3em;
+}
+
+img {
+  image-rendering: optimize-quality;
+}
+
+img.withBorder {
+  border: 2px solid #c60;
+  padding: 4px;
+}
+
+div.header {
+  position: absolute;
+  z-index: 2;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: auto;
+  height: 2.95em;
+  width: 100%;
+  padding: 0 0 0 0;
+  margin: 0 0 0 0;
+  border-width: 0;
+  border-style: solid;
+  background-color: #005A9C;
+  border-bottom-width: thick;
+  border-bottom-color: #95ABD0;
+}
+
+div.footer {
+  position: absolute;
+  z-index: 80;
+  left: 0;
+  right: 0;
+  top: auto;
+  bottom: 0;
+  height: 3.5em;
+  margin: 0;
+  font-size: 80%;
+  font-weight: bold;
+  padding-left: 1em;
+  padding-right: 0;
+  padding-top: 0.3em;
+  padding-bottom: 0;
+  color: #003366;
+  background-color: #95ABD0;
+}
+
+/* this is a hack to hide property from IE6 and below */
+div[class="footer"] {
+  position: fixed;
+}
+
+#hidden-bullet {
+  visibility: hidden;
+  display: none;
+}
+
+div.slide.cover {
+  color: white;
+  background-color: #728ec2;
+  padding-top: 0;
+  padding-right: 0;
+  padding-left: 3em;
+  height: 100%;
+}
+
+div.slide.cover h1 {
+  margin: 0;
+  padding: 0.5em;
+  color: white;
+  height: auto;
+}
+
+div.slide.cover h2 {
+  color: white;
+}
+
+div.slide.cover a {
+  color: white;
+}
+
+div.slide.cover a:visited { color: white }
+div.slide.cover a:link { color: white }
+div.slide.cover a:hover { color: yellow; text-decoration: underline }
+div.slide.cover a:active { color: yellow; text-decoration: underline }
+
+div.slide.cover a:hover, div.slide.cover a:active {
+  color: yellow; text-decoration: underline;
+}
+
+div.slide.cover img.cover {
+   margin: 0 0 0 0;
+   float: right;
+   padding-bottom: 4em;
+   width: 50%;
+   overflow: hidden;
+}
+
+div.slide.cover a:hover, div.slide.cover a:active {
+    color: yellow; text-decoration: underline;
+}
+
+/* for Bert as an ardent user of the old W3C slidemaker tool */
+
+div.comment { display: none; visibility: hidden }
+
+ at media print {
+ div.slide h1 { background: transparent; color: black }
+ div.slide.cover { background: transparent; color: black }
+ div.slide.cover h1 { background: transparent; color: black }
+ div.comment { display: block; visibility: visible } 
+}
diff --git a/inst/rmd/slidy/default.html b/inst/rmd/slidy/default.html
new file mode 100644
index 0000000..64afd9d
--- /dev/null
+++ b/inst/rmd/slidy/default.html
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"$if(lang)$ lang="$lang$" xml:lang="$lang$"$endif$>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta http-equiv="Content-Style-Type" content="text/css" />
+  <meta name="generator" content="pandoc" />
+$for(author-meta)$
+  <meta name="author" content="$author-meta$" />
+$endfor$
+$if(date-meta)$
+  <meta name="date" content="$date-meta$" />
+$endif$
+$if(footer)$
+  <meta name="copyright" content="$footer$"/>
+$endif$
+$if(font-size-adjustment)$
+  <meta name="font-size-adjustment" content="$font-size-adjustment$"/>
+$endif$
+  <title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>
+  <style type="text/css">code{white-space: pre;}</style>
+$if(highlighting-css)$
+  <style type="text/css">
+$highlighting-css$
+  </style>
+$endif$
+$for(header-includes)$
+  $header-includes$
+$endfor$
+$for(css)$
+  <link rel="stylesheet" type="text/css" media="screen, projection, print"
+   href="$css$" />
+$endfor$
+$if(duration)$
+  <meta name="duration" content="$duration$" />
+$endif$
+</head>
+<body>
+$for(include-before)$
+$include-before$
+$endfor$
+$if(title)$
+<div class="slide titlepage">
+  <h1 class="title">$title$</h1>
+$if(subtitle)$
+  <h1 class="subtitle">$subtitle$</h1>
+$endif$
+  <p class="author">
+$for(author)$$author$$sep$<br/>$endfor$
+  </p>
+$if(date)$
+  <p class="date">$date$</p>
+$endif$
+</div>
+$endif$
+$body$
+$for(include-after)$
+$include-after$
+$endfor$
+
+$if(mathjax-url)$
+  <!-- dynamically load mathjax for compatibility with self-contained -->
+  <script>
+    (function () {
+      var script = document.createElement("script");
+      script.type = "text/javascript";
+      script.src  = "$mathjax-url$";
+      document.getElementsByTagName("head")[0].appendChild(script);
+    })();
+  </script>
+$endif$
+
+</body>
+</html>
diff --git a/man/all_output_formats.Rd b/man/all_output_formats.Rd
new file mode 100644
index 0000000..8be6a78
--- /dev/null
+++ b/man/all_output_formats.Rd
@@ -0,0 +1,26 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R
+\name{all_output_formats}
+\alias{all_output_formats}
+\title{Determine all output formats for an R Markdown document}
+\usage{
+all_output_formats(input, encoding = getOption("encoding"))
+}
+\arguments{
+\item{input}{Input file (Rmd or plain markdown)}
+
+\item{encoding}{The encoding of the input file; see \code{\link{file}}}
+}
+\value{
+A character vector with the names of all output formats.
+}
+\description{
+Read the YAML metadata (and any common _output.yml file) for the
+document and return the output formats that will be generated by
+a call to \code{\link{render}}.
+}
+\details{
+This function is useful for front-end tools that require additional
+knowledge of the output to be produced by \code{\link{render}} (e.g. to
+customize the preview experience).
+}
diff --git a/man/beamer_presentation.Rd b/man/beamer_presentation.Rd
new file mode 100644
index 0000000..4be7a88
--- /dev/null
+++ b/man/beamer_presentation.Rd
@@ -0,0 +1,125 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/beamer_presentation.R
+\name{beamer_presentation}
+\alias{beamer_presentation}
+\title{Convert to a Beamer presentation}
+\usage{
+beamer_presentation(toc = FALSE, slide_level = NULL, incremental = FALSE,
+  fig_width = 10, fig_height = 7, fig_crop = TRUE, fig_caption = TRUE,
+  dev = "pdf", df_print = "default", theme = "default",
+  colortheme = "default", fonttheme = "default", highlight = "default",
+  template = "default", keep_tex = FALSE, latex_engine = "pdflatex",
+  citation_package = c("none", "natbib", "biblatex"), self_contained = TRUE,
+  includes = NULL, md_extensions = NULL, pandoc_args = NULL)
+}
+\arguments{
+\item{toc}{\code{TRUE} to include a table of contents in the output (only
+level 1 headers will be included in the table of contents).}
+
+\item{slide_level}{The heading level which defines individual slides. By
+default this is the highest header level in the hierarchy that is followed
+immediately by content, and not another header, somewhere in the document.
+This default can be overridden by specifying an explicit
+\code{slide_level}.}
+
+\item{incremental}{\code{TRUE} to render slide bullets incrementally. Note
+that if you want to reverse the default incremental behavior for an
+individual bullet you can precede it with \code{>}. For example:
+\emph{\code{> - Bullet Text}}}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_crop}{\code{TRUE} to automatically apply the \code{pdfcrop} utility
+(if available) to pdf figures}
+
+\item{fig_caption}{\code{TRUE} to render figures with captions}
+
+\item{dev}{Graphics device to use for figure output (defaults to pdf)}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{theme}{Beamer theme (e.g. "AnnArbor").}
+
+\item{colortheme}{Beamer color theme (e.g. "dolphin").}
+
+\item{fonttheme}{Beamer font theme (e.g. "structurebold").}
+
+\item{highlight}{Syntax highlighting style. Supported styles include
+"default", "tango", "pygments", "kate", "monochrome", "espresso",
+"zenburn", and "haddock". Pass \code{NULL} to prevent syntax highlighting.}
+
+\item{template}{Pandoc template to use for rendering. Pass "default" to use
+the rmarkdown package default template; pass \code{NULL} to use pandoc's
+built-in template; pass a path to use a custom template that you've
+created.  See the documentation on
+\href{http://pandoc.org/README.html}{pandoc online documentation}
+for details on creating custom templates.}
+
+\item{keep_tex}{Keep the intermediate tex file used in the conversion to PDF}
+
+\item{latex_engine}{LaTeX engine for producing PDF output. Options are
+"pdflatex", "lualatex", and "xelatex".}
+
+\item{citation_package}{The LaTeX package to process citations, \code{natbib}
+or \code{biblatex}. Use \code{none} if neither package is to be used.}
+
+\item{self_contained}{Whether to generate a full LaTeX document (\code{TRUE})
+or just the body of a LaTeX document (\code{FALSE}). Note the LaTeX
+document is an intermediate file unless \code{keep_tex = TRUE}.}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Format for converting from R Markdown to a Beamer presentation.
+}
+\details{
+See the
+\href{http://rmarkdown.rstudio.com/beamer_presentation_format.html}{online
+documentation} for additional details on using the \code{beamer_presentation}
+format.
+
+Creating Beamer output from R Markdown requires that LaTeX be installed.
+
+R Markdown documents can have optional metadata that is used to generate a
+document header that includes the title, author, and date. For more details
+see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+
+R Markdown documents also support citations. You can find more information on
+the markdown syntax for citations in the
+\href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+and Citations} article in the online documentation.
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+# simple invocation
+render("pres.Rmd", beamer_presentation())
+
+# specify an option for incremental rendering
+render("pres.Rmd", beamer_presentation(incremental = TRUE))
+}
+
+}
diff --git a/man/compile_notebook.Rd b/man/compile_notebook.Rd
new file mode 100644
index 0000000..fa1a030
--- /dev/null
+++ b/man/compile_notebook.Rd
@@ -0,0 +1,60 @@
+\name{compile_notebook}
+\alias{compile_notebook}
+
+\title{Compiling R scripts to a notebook}
+
+\description{R Markdown can also compile R scripts to a notebook which includes commentary, source code, and script output. Notebooks can be compiled to any output format including HTML, PDF, and MS Word.
+}
+
+\section{Overview}{
+
+To compile a notebook from an R script you simply pass the script to \code{\link{render}}. For example:
+
+\preformatted{
+rmarkdown::render("analysis.R")
+rmarkdown::render("analysis.R", "pdf_document")
+}
+
+The first call to \code{\link{render}} creates an HTML document, whereas the second creates a PDF document.
+
+By default the name of the script, username, and current date and time are included in the header of the generated notebook. You can override this default behavior by including explicit metadata in a specially formatted R comment:
+
+
+\preformatted{#' ---
+#' title: "Crop Analysis Q3 2013"
+#' author: "John Smith"
+#' date: "May 3rd, 2014"
+#' ---
+}
+
+}
+
+\section{Including Markdown}{
+
+Note that the R comment used above to add a title, author, and date includes a single-quote as a special prefix character. This is a \pkg{roxygen2} style comment, and it's actually possible to include many such comments in an R script, all of which will be converted to markdown content within the generated notebook. For example:
+
+\preformatted{#' A script comment that includes **markdown** formatting.
+}
+
+Rather than displaying as an R comment in the compiled notebook any \pkg{roxygen2} style comment will be treated as markdown and rendered accordingly.
+}
+
+\section{knitr Spin}{
+
+Including markdown within R comments is possible because \code{\link{render}} calls the \code{\link[knitr:spin]{knitr spin}} function to convert the R script to an Rmd file. The \code{spin} function also enables you to add knitr chunk options with another special comment prefix (\code{#+}).
+
+Here's an example of a script that uses the various features of \code{spin}:
+
+\href{https://github.com/yihui/knitr/blob/master/inst/examples/knitr-spin.R}{https://github.com/yihui/knitr/blob/master/inst/examples/knitr-spin.R}
+
+For more details on \code{knitr::spin} see the following documentation:
+
+\href{http://yihui.name/knitr/demo/stitch/}{http://yihui.name/knitr/demo/stitch/}
+
+
+
+
+}
+
+
+
diff --git a/man/default_output_format.Rd b/man/default_output_format.Rd
new file mode 100644
index 0000000..e534c58
--- /dev/null
+++ b/man/default_output_format.Rd
@@ -0,0 +1,29 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R
+\name{default_output_format}
+\alias{default_output_format}
+\title{Determine the default output format for an R Markdown document}
+\usage{
+default_output_format(input, encoding = getOption("encoding"))
+}
+\arguments{
+\item{input}{Input file (Rmd or plain markdown)}
+
+\item{encoding}{The encoding of the input file; see \code{\link{file}}}
+}
+\value{
+A named list with a \code{name} value containing the format
+  name and an \code{options} value that is a list containing all the options
+  for the format and their values. An option's default value will be returned
+  if the option isn't set explicitly in the document.
+}
+\description{
+Read the YAML metadata (and any common _output.yml file) for the
+document and return the output format that will be generated by
+a call to \code{\link{render}}.
+}
+\details{
+This function is useful for front-end tools that require additional
+knowledge of the output to be produced by \code{\link{render}} (e.g. to
+customize the preview experience).
+}
diff --git a/man/draft.Rd b/man/draft.Rd
new file mode 100644
index 0000000..32aad70
--- /dev/null
+++ b/man/draft.Rd
@@ -0,0 +1,77 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/draft.R
+\name{draft}
+\alias{draft}
+\title{Create a new document based on a template}
+\usage{
+draft(file, template, package = NULL, create_dir = "default", edit = TRUE)
+}
+\arguments{
+\item{file}{File name for the draft}
+
+\item{template}{Template to use as the basis for the draft. This is either
+the full path to a template directory or the name of a template directory
+within the \code{rmarkdown/templates} directory of a package.}
+
+\item{package}{(Optional) Name of package where the template is located.}
+
+\item{create_dir}{\code{TRUE} to create a new directory for the document
+(the "default" setting leaves this behavior up to the creator of the
+template).}
+
+\item{edit}{\code{TRUE} to edit the template immediately}
+}
+\value{
+The file name of the new document (invisibly)
+}
+\description{
+Create (and optionally edit) a draft of an R Markdown document based on a
+template.
+}
+\details{
+The \code{draft} function creates new R Markdown documents based on
+  templates that are either located on the filesystem or within an R package.
+  The template and it's supporting files will be copied to the location
+  specified by \code{file}.
+}
+\note{
+An R Markdown template consists of a directory that contains a
+  description of the template, a skeleton Rmd file used as the basis for new
+  documents, and optionally additional supporting files that are provided
+  along with the skeleton (e.g. a logo graphic).
+
+  If the template directory is contained within a package then it should be
+  located at \code{inst/rmarkdown/templates}. For example, a package named
+  \pkg{pubtools} that wanted to provide a template named
+  \code{quarterly_report} would need to provide the following files within
+  the \code{pubtools/inst/rmarkdown/templates} directory:
+
+  \code{quarterly_report/template.yaml} \cr
+  \code{quarterly_report/skeleton/skeleton.Rmd} \cr
+
+  The \code{template.yaml} file should include a \code{name} field. If you
+  want to ensure that a new directory is always created for a given template,
+  then you can add the \code{create_dir} field to the \code{template.yaml}
+  file. For example:
+
+  \code{create_dir: true} \cr
+
+  The \code{skeleton/skeleton.Rmd} file should include the initial contents
+  you want for files created from this template. Additional files can be
+  added to the \code{skeleton} directory, for example:
+
+  \code{skeleton/logo.png} \cr
+
+  These files will automatically be copied to the directory containing the
+  new R Markdown draft.
+}
+\examples{
+\dontrun{
+
+rmarkdown::draft("Q4Report.Rmd",
+                 template="/opt/rmd/templates/quarterly_report")
+
+rmarkdown::draft("Q4Report.Rmd",
+                 template="quarterly_report", package="pubtools")
+}
+}
diff --git a/man/find_external_resources.Rd b/man/find_external_resources.Rd
new file mode 100644
index 0000000..bd1029d
--- /dev/null
+++ b/man/find_external_resources.Rd
@@ -0,0 +1,65 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_resources.R
+\name{find_external_resources}
+\alias{find_external_resources}
+\title{Find External Resource References}
+\usage{
+find_external_resources(input_file, encoding = getOption("encoding"))
+}
+\arguments{
+\item{input_file}{path to the R Markdown document or HTML file to process}
+
+\item{encoding}{the encoding of the document}
+}
+\value{
+A data frame with the following columns:
+  \describe{
+   \item{path}{The relative path from the document to the resource}
+   \item{explicit}{Whether the resource was specified explicitly
+     (\code{TRUE}) or discovered implicitly (\code{FALSE})}
+   \item{web}{Whether the resource is needed to display a Web page rendered
+     from the document}
+  }
+}
+\description{
+Given an R Markdown document or HTML file, attempt to determine the set of
+additional files needed in order to render and display the document.
+}
+\details{
+This routine applies heuristics in order to scan a document for
+  possible resource references.
+
+  In R Markdown documents, it looks for references to files implicitly
+  referenced in Markdown (e.g. \code{![alt](img.png)}), in the document's
+  YAML header, in raw HTML chunks, and as quoted strings in R code chunks
+  (e.g. \code{read.csv("data.csv")}).
+
+  Resources specified explicitly in the YAML header for R Markdown documents
+  are also returned. To specify resources in YAML, use the
+  \code{resource_files} key:
+
+  \preformatted{---
+title: My Document
+author: My Name
+resource_files:
+ - data/mydata.csv
+ - images/figure.png
+---}
+
+  Each item in the \code{resource_files} list can refer to:
+  \enumerate{
+  \item A single file, such as \code{images/figure.png}, or
+  \item A directory, such as \code{resources/data}, in which case all of the
+    directory's content will be recursively included, or
+  \item A wildcard pattern, such as \code{data/*.csv}, in which case all of
+    the files matching the pattern will be included. No recursion is done in
+    this case.
+  }
+
+  In HTML files (and raw HTML chunks in R Markdown documents), this routine
+  searches for resources specified in common tag attributes, such as
+  \code{<img src="...">}, \code{<link href="...">}, etc.
+
+  In all cases, only resources that exist on disk and are contained in the
+  document's directory (or a child thereof) are returned.
+}
diff --git a/man/github_document.Rd b/man/github_document.Rd
new file mode 100644
index 0000000..40da2c2
--- /dev/null
+++ b/man/github_document.Rd
@@ -0,0 +1,54 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/github_document.R
+\name{github_document}
+\alias{github_document}
+\title{Convert to GitHub Flavored Markdown}
+\usage{
+github_document(toc = FALSE, toc_depth = 3, fig_width = 7,
+  fig_height = 5, dev = "png", df_print = "default", includes = NULL,
+  md_extensions = NULL, hard_line_breaks = TRUE, pandoc_args = NULL,
+  html_preview = TRUE)
+}
+\arguments{
+\item{toc}{\code{TRUE} to include a table of contents in the output}
+
+\item{toc_depth}{Depth of headers to include in table of contents}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{dev}{Graphics device to use for figure output (defaults to png)}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{hard_line_breaks}{\code{TRUE} to genreate markdown that uses a simple
+newline to represent a line break (as opposed to two-spaces and a newline).}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+
+\item{html_preview}{\code{TRUE} to also generate an HTML file for the purpose of
+locally previewing what the document will look like on GitHub.}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Format for converting from R Markdown to GitHub Flavored Markdown.
+}
diff --git a/man/html-dependencies.Rd b/man/html-dependencies.Rd
new file mode 100644
index 0000000..da0973c
--- /dev/null
+++ b/man/html-dependencies.Rd
@@ -0,0 +1,42 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_dependencies.R
+\name{html-dependencies}
+\alias{html-dependencies}
+\alias{html_dependency_jquery}
+\alias{html_dependency_bootstrap}
+\alias{html_dependency_jqueryui}
+\alias{html_dependency_tocify}
+\alias{html_dependency_font_awesome}
+\alias{html_dependency_ionicons}
+\alias{html_dependency_pagedtable}
+\alias{html_dependency_highlightjs}
+\title{Provide common HTML dependencies for R Markdown formats}
+\usage{
+html_dependency_jquery()
+
+html_dependency_bootstrap(theme)
+
+html_dependency_jqueryui()
+
+html_dependency_tocify()
+
+html_dependency_font_awesome()
+
+html_dependency_ionicons()
+
+html_dependency_pagedtable()
+
+html_dependency_highlightjs(highlight)
+}
+\arguments{
+\item{theme}{Visual theme ("default", "cerulean", "journal", "flatly",
+"readable", "spacelab", "united", "cosmo", "lumen", "paper", "sandstone",
+"simplex", or "yeti"). Pass \code{NULL} for no theme (in this case you can
+use the \code{css} parameter to add your own styles).}
+
+\item{highlight}{Highligher to use}
+}
+\description{
+These functions provide common HTML dependencies (e.g. jquery, bootstrap)
+for re-use by other R Markdown formats.
+}
diff --git a/man/html_document.Rd b/man/html_document.Rd
new file mode 100644
index 0000000..0e73c32
--- /dev/null
+++ b/man/html_document.Rd
@@ -0,0 +1,245 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_document.R
+\name{html_document}
+\alias{html_document}
+\title{Convert to an HTML document}
+\usage{
+html_document(toc = FALSE, toc_depth = 3, toc_float = FALSE,
+  number_sections = FALSE, section_divs = TRUE, fig_width = 7,
+  fig_height = 5, fig_retina = 2, fig_caption = TRUE, dev = "png",
+  df_print = "default", code_folding = c("none", "show", "hide"),
+  code_download = FALSE, smart = TRUE, self_contained = TRUE,
+  theme = "default", highlight = "default", mathjax = "default",
+  template = "default", extra_dependencies = NULL, css = NULL,
+  includes = NULL, keep_md = FALSE, lib_dir = NULL,
+  md_extensions = NULL, pandoc_args = NULL, ...)
+}
+\arguments{
+\item{toc}{\code{TRUE} to include a table of contents in the output}
+
+\item{toc_depth}{Depth of headers to include in table of contents}
+
+\item{toc_float}{\code{TRUE} to float the table of contents to the left of the
+main document content. Rather than \code{TRUE} you may also pass a list of
+options that control the behavior of the floating table of contents. See the
+\emph{Floating Table of Contents} section below for details.}
+
+\item{number_sections}{\code{TRUE} to number section headings}
+
+\item{section_divs}{Wrap sections in <div> tags (or <section> tags in HTML5),
+and attach identifiers to the enclosing <div> (or <section>) rather than the
+header itself.}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_retina}{Scaling to perform for retina displays (defaults to 2, which
+currently works for all widely used retina displays). Set to \code{NULL} to
+prevent retina scaling. Note that this will always be \code{NULL} when
+\code{keep_md} is specified (this is because \code{fig_retina} relies on
+outputting HTML directly into the markdown document).}
+
+\item{fig_caption}{\code{TRUE} to render figures with captions}
+
+\item{dev}{Graphics device to use for figure output (defaults to png)}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{code_folding}{Enable document readers to toggle the display of R code
+chunks. Specify \code{"none"} to display all code chunks (assuming
+they were knit with \code{echo = TRUE}). Specify \code{"hide"} to hide all R
+code chunks by default (users can show hidden code chunks either
+individually or document-wide). Specify \code{"show"} to show all R code
+chunks by default.}
+
+\item{code_download}{Embed the Rmd source code within the document and provide
+a link that can be used by readers to download the code.}
+
+\item{smart}{Produce typographically correct output, converting straight
+quotes to curly quotes, --- to em-dashes, -- to en-dashes, and ... to
+ellipses.}
+
+\item{self_contained}{Produce a standalone HTML file with no external
+dependencies, using data: URIs to incorporate the contents of linked
+scripts, stylesheets, images, and videos. Note that even for self contained
+documents MathJax is still loaded externally (this is necessary because of
+it's size).}
+
+\item{theme}{Visual theme ("default", "cerulean", "journal", "flatly",
+"readable", "spacelab", "united", "cosmo", "lumen", "paper", "sandstone",
+"simplex", or "yeti"). Pass \code{NULL} for no theme (in this case you can
+use the \code{css} parameter to add your own styles).}
+
+\item{highlight}{Syntax highlighting style. Supported styles include
+"default", "tango", "pygments", "kate", "monochrome", "espresso", "zenburn",
+"haddock", and "textmate". Pass \code{NULL} to prevent syntax highlighting.}
+
+\item{mathjax}{Include mathjax. The "default" option uses an https URL from a
+MathJax CDN. The "local" option uses a local version of MathJax (which is
+copied into the output directory). You can pass an alternate URL or pass
+\code{NULL} to exclude MathJax entirely.}
+
+\item{template}{Pandoc template to use for rendering. Pass "default" to use
+the rmarkdown package default template; pass \code{NULL} to use pandoc's
+built-in template; pass a path to use a custom template that you've created.
+Note that if you don't use the "default" template then some features of
+\code{html_document} won't be available (see the Templates section below for
+more details).}
+
+\item{extra_dependencies, ...}{Additional function arguments to pass to the
+base R Markdown HTML output formatter \code{\link{html_document_base}}}
+
+\item{css}{One or more css files to include}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{keep_md}{Keep the markdown file generated by knitting.}
+
+\item{lib_dir}{Directory to copy dependent HTML libraries (e.g. jquery,
+bootstrap, etc.) into. By default this will be the name of the document with
+\code{_files} appended to it.}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Format for converting from R Markdown to an HTML document.
+}
+\details{
+See the \href{http://rmarkdown.rstudio.com/html_document_format.html}{online
+documentation} for additional details on using the \code{html_document}
+format.
+
+R Markdown documents can have optional metadata that is used to generate a
+document header that includes the title, author, and date. For more details
+see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+
+R Markdown documents also support citations. You can find more information on
+the markdown syntax for citations in the
+\href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+and Citations} article in the online documentation.
+}
+\section{Navigation Bars}{
+
+
+ If you have a set of html documents which you'd like to provide a common
+ global navigation bar for, you can include a "_navbar.yml" or "_navbar.html"
+ file within the same directory as your html document and it will automatically
+ be included at the top of the document.
+
+ The "_navbar.yml" file includes \code{title}, \code{type}, \code{left}, and
+ \code{right} fields (to define menu items for the left and right of the navbar
+ resspectively). Menu items include \code{title} and \code{href} fields. For example:
+
+ \preformatted{ title: "My Website"
+ type: default
+ left:
+   - text: "Home"
+     href: index.html
+   - text: "Other"
+     href: other.html
+ right:
+   - text: GitHub
+     href: https://github.com}
+ The \code{type} field is optional and can take the value "default" or "inverse" (which
+ provides a different color scheme for the navigation bar).
+
+ Alternatively, you can include a "_navbar.html" file which is a full HTML definition
+ of a bootstrap navigation bar. For a simple example of including a navigation bar see
+ \href{https://github.com/rstudio/rmarkdown-website/blob/master/_navbar.html}{https://github.com/rstudio/rmarkdown-website/blob/master/_navbar.html}.
+  For additional documentation on creating Bootstrap navigation bars see
+ \href{http://getbootstrap.com/components/#navbar}{http://getbootstrap.com/components/#navbar}.
+}
+
+\section{Floating Table of Contents}{
+
+
+ You may specify a list of options for the \code{toc_float} parameter which
+ control the behavior of the floating table of contents. Options include:
+
+ \itemize{ \item{\code{collapsed} (defaults to \code{TRUE}) controls whether
+ the table of contents appears with only the top-level (H2) headers. When
+ collapsed the table of contents is automatically expanded inline when
+ necessary.} \item{\code{smooth_scroll} (defaults to \code{TRUE}) controls
+ whether page scrolls are animated when table of contents items are navigated
+ to via mouse clicks.} \item{\code{print} (defaults to \code{TRUE}) controls
+ whether the table of contents appears when user prints out the HTML page.}}
+}
+
+\section{Tabbed Sections}{
+
+
+ You can organize content using tabs by applying the \code{.tabset} class
+ attribute to headers within a document. This will cause all sub-headers of
+ the header with the \code{.tabset} attribute to appear within tabs rather
+ than as standalone sections. For example:
+
+ \preformatted{ ## Quarterly Results {.tabset}
+
+ ### By Product
+
+ ### By Region }
+
+ You can also specify two additional attributes to control the appearance and
+ behavior of the tabs. The \code{.tabset-fade} attributes causes the tabs to
+ fade in and out when switching. The \code{.tabset-pills} attribute causes
+ the visual appearance of the tabs to be "pill" rather than traditional tabs.
+ For example:
+
+ \preformatted{ ## Quarterly Results {.tabset .tabset-fade .tabset-pills} }
+}
+
+\section{Templates}{
+
+
+ You can provide a custom HTML template to be used for rendering. The syntax
+ for templates is described in the
+ \href{http://pandoc.org/README.html}{pandoc documentation}. You can also use
+ the basic pandoc template by passing \code{template = NULL}.
+
+ Note however that if you choose not to use the "default" HTML template then
+ several aspects of HTML document rendering will behave differently:
+
+ \itemize{ \item{The \code{theme} parameter does not work (you can still
+ provide styles using the \code{css} parameter). } \item{For the
+ \code{highlight} parameter, the default highlighting style will resolve to
+ "pygments" and the "textmate" highlighting style is not available }
+ \item{The \code{toc_float} parameter will not work. } \item{The
+ \code{code_folding} parameter will not work. } \item{Tabbed sections (as
+ described above) will not work.} \item{Navigation bars (as described above)
+ will not work. }\item{MathJax will not work if \code{self_contained} is
+ \code{TRUE} (these two options can't be used together in normal pandoc
+ templates). } }
+
+ Due to the above restrictions, you might consider using the \code{includes}
+ parameter as an alternative to providing a fully custom template.
+}
+
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+render("input.Rmd", html_document())
+
+render("input.Rmd", html_document(toc = TRUE))
+}
+
+}
diff --git a/man/html_document_base.Rd b/man/html_document_base.Rd
new file mode 100644
index 0000000..9739cf0
--- /dev/null
+++ b/man/html_document_base.Rd
@@ -0,0 +1,63 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_document_base.R
+\name{html_document_base}
+\alias{html_document_base}
+\title{Base output format for HTML-based output formats}
+\usage{
+html_document_base(smart = TRUE, theme = NULL, self_contained = TRUE,
+  lib_dir = NULL, mathjax = "default", pandoc_args = NULL,
+  template = "default", dependency_resolver = NULL,
+  copy_resources = FALSE, extra_dependencies = NULL,
+  bootstrap_compatible = FALSE, ...)
+}
+\arguments{
+\item{smart}{Produce typographically correct output, converting straight
+quotes to curly quotes, --- to em-dashes, -- to en-dashes, and ... to
+ellipses.}
+
+\item{theme}{Visual theme ("default", "cerulean", "journal", "flatly",
+"readable", "spacelab", "united", "cosmo", "lumen", "paper", "sandstone",
+"simplex", or "yeti"). Pass \code{NULL} for no theme (in this case you can
+use the \code{css} parameter to add your own styles).}
+
+\item{self_contained}{Produce a standalone HTML file with no external
+dependencies, using data: URIs to incorporate the contents of linked
+scripts, stylesheets, images, and videos. Note that even for self contained
+documents MathJax is still loaded externally (this is necessary because of
+it's size).}
+
+\item{lib_dir}{Directory to copy dependent HTML libraries (e.g. jquery,
+bootstrap, etc.) into. By default this will be the name of the document with
+\code{_files} appended to it.}
+
+\item{mathjax}{Include mathjax. The "default" option uses an https URL from a
+MathJax CDN. The "local" option uses a local version of MathJax (which is
+copied into the output directory). You can pass an alternate URL or pass
+\code{NULL} to exclude MathJax entirely.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+
+\item{template}{Pandoc template to use for rendering. Pass "default" to use
+the rmarkdown package default template; pass \code{NULL} to use pandoc's
+built-in template; pass a path to use a custom template that you've created.
+Note that if you don't use the "default" template then some features of
+\code{html_document} won't be available (see the Templates section below for
+more details).}
+
+\item{dependency_resolver}{A dependency resolver}
+
+\item{copy_resources}{Copy resources}
+
+\item{extra_dependencies}{Extra dependencies}
+
+\item{bootstrap_compatible}{Bootstrap compatible}
+
+\item{...}{Ignored}
+}
+\value{
+HTML base output format.
+}
+\description{
+Creates an HTML base output format suitable for passing as the
+\code{base_format} argument of the \code{\link{output_format}} function.
+}
diff --git a/man/html_fragment.Rd b/man/html_fragment.Rd
new file mode 100644
index 0000000..9050b4b
--- /dev/null
+++ b/man/html_fragment.Rd
@@ -0,0 +1,78 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_fragment.R
+\name{html_fragment}
+\alias{html_fragment}
+\title{Convert to an HTML fragment.}
+\usage{
+html_fragment(number_sections = FALSE, section_divs = TRUE, fig_width = 7,
+  fig_height = 5, fig_retina = 2, fig_caption = TRUE, dev = "png",
+  df_print = "default", smart = TRUE, mathjax = TRUE, includes = NULL,
+  keep_md = FALSE, md_extensions = NULL, pandoc_args = NULL, ...)
+}
+\arguments{
+\item{number_sections}{\code{TRUE} to number section headings}
+
+\item{section_divs}{Wrap sections in <div> tags (or <section> tags in HTML5),
+and attach identifiers to the enclosing <div> (or <section>) rather than the
+header itself.}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_retina}{Scaling to perform for retina displays (defaults to 2, which
+currently works for all widely used retina displays). Set to \code{NULL} to
+prevent retina scaling. Note that this will always be \code{NULL} when
+\code{keep_md} is specified (this is because \code{fig_retina} relies on
+outputting HTML directly into the markdown document).}
+
+\item{fig_caption}{\code{TRUE} to render figures with captions}
+
+\item{dev}{Graphics device to use for figure output (defaults to png)}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{smart}{Produce typographically correct output, converting straight
+quotes to curly quotes, --- to em-dashes, -- to en-dashes, and ... to
+ellipses.}
+
+\item{mathjax}{\code{TRUE} to convert $ and $$ math blocks into MathJax
+compatible output. Note that you'll still need to ensure that the page
+where the fragment is included loads the required MathJax scripts.}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{keep_md}{Keep the markdown file generated by knitting.}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+
+\item{...}{Additional arguments passed to \code{\link{html_document}}}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+An html fragment is suitable for inclusion into an external html page. See
+\code{\link{html_document}} for full details - this is a minor variation that
+assumes you will include the output into an existing document (e.g. a blog
+post).
+}
+\details{
+See the \href{http://rmarkdown.rstudio.com/html_document_format.html}{online
+documentation} for additional details on using the \code{html_fragment}
+format.
+}
diff --git a/man/html_notebook.Rd b/man/html_notebook.Rd
new file mode 100644
index 0000000..437acd8
--- /dev/null
+++ b/man/html_notebook.Rd
@@ -0,0 +1,97 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_notebook.R
+\name{html_notebook}
+\alias{html_notebook}
+\title{Convert to an HTML notebook}
+\usage{
+html_notebook(toc = FALSE, toc_depth = 3, toc_float = FALSE,
+  number_sections = FALSE, fig_width = 7, fig_height = 5,
+  fig_retina = 2, fig_caption = TRUE, code_folding = "show",
+  smart = TRUE, theme = "default", highlight = "textmate",
+  mathjax = "default", extra_dependencies = NULL, css = NULL,
+  includes = NULL, md_extensions = NULL, pandoc_args = NULL,
+  output_source = NULL, self_contained = TRUE, ...)
+}
+\arguments{
+\item{toc}{\code{TRUE} to include a table of contents in the output}
+
+\item{toc_depth}{Depth of headers to include in table of contents}
+
+\item{toc_float}{\code{TRUE} to float the table of contents to the left of the
+main document content. Rather than \code{TRUE} you may also pass a list of
+options that control the behavior of the floating table of contents. See the
+\emph{Floating Table of Contents} section below for details.}
+
+\item{number_sections}{\code{TRUE} to number section headings}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_retina}{Scaling to perform for retina displays (defaults to 2, which
+currently works for all widely used retina displays). Set to \code{NULL} to
+prevent retina scaling. Note that this will always be \code{NULL} when
+\code{keep_md} is specified (this is because \code{fig_retina} relies on
+outputting HTML directly into the markdown document).}
+
+\item{fig_caption}{\code{TRUE} to render figures with captions}
+
+\item{code_folding}{Enable document readers to toggle the display of R code
+chunks. Specify \code{"none"} to display all code chunks (assuming
+they were knit with \code{echo = TRUE}). Specify \code{"hide"} to hide all R
+code chunks by default (users can show hidden code chunks either
+individually or document-wide). Specify \code{"show"} to show all R code
+chunks by default.}
+
+\item{smart}{Produce typographically correct output, converting straight
+quotes to curly quotes, --- to em-dashes, -- to en-dashes, and ... to
+ellipses.}
+
+\item{theme}{Visual theme ("default", "cerulean", "journal", "flatly",
+"readable", "spacelab", "united", "cosmo", "lumen", "paper", "sandstone",
+"simplex", or "yeti"). Pass \code{NULL} for no theme (in this case you can
+use the \code{css} parameter to add your own styles).}
+
+\item{highlight}{Syntax highlighting style. Supported styles include
+"default", "tango", "pygments", "kate", "monochrome", "espresso", "zenburn",
+"haddock", and "textmate". Pass \code{NULL} to prevent syntax highlighting.}
+
+\item{mathjax}{Include mathjax. The "default" option uses an https URL from a
+MathJax CDN. The "local" option uses a local version of MathJax (which is
+copied into the output directory). You can pass an alternate URL or pass
+\code{NULL} to exclude MathJax entirely.}
+
+\item{extra_dependencies}{Additional function arguments to pass to the
+base R Markdown HTML output formatter \code{\link{html_document_base}}}
+
+\item{css}{One or more css files to include}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+
+\item{output_source}{Define an output source for \R chunks (ie,
+outputs to use instead of those produced by evaluating the
+underlying \R code). See \code{\link{html_notebook_output}} for
+more details.}
+
+\item{self_contained}{Produce a standalone HTML file with no external
+dependencies. Defaults to \code{TRUE}. In notebooks, setting this to
+\code{FALSE} is not recommended, since the setting does not apply to
+embedded notebook output such as plots and HTML widgets.}
+
+\item{...}{Additional function arguments to pass to the
+base R Markdown HTML output formatter \code{\link{html_document_base}}}
+}
+\description{
+Format for converting from R Markdown to an HTML notebook.
+}
+\details{
+For more details on the HTML file format produced by
+ \code{html_notebook}, see \href{http://rmarkdown.rstudio.com/r_notebook_format.html}{http://rmarkdown.rstudio.com/r_notebook_format.html}.
+}
diff --git a/man/html_notebook_metadata.Rd b/man/html_notebook_metadata.Rd
new file mode 100644
index 0000000..b0bad64
--- /dev/null
+++ b/man/html_notebook_metadata.Rd
@@ -0,0 +1,16 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_notebook_output.R
+\name{html_notebook_metadata}
+\alias{html_notebook_metadata}
+\title{Generate R Notebook Metadata}
+\usage{
+html_notebook_metadata(iframe = TRUE)
+}
+\arguments{
+\item{iframe}{Boolean; should output be shown in an \code{<iframe>}?}
+}
+\description{
+A structured helper for the construction of metadata used by the
+R Notebook output functions. See \code{\link{html_notebook_output}} for
+more details.
+}
diff --git a/man/html_notebook_output.Rd b/man/html_notebook_output.Rd
new file mode 100644
index 0000000..08bbe85
--- /dev/null
+++ b/man/html_notebook_output.Rd
@@ -0,0 +1,52 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_notebook_output.R
+\name{html_notebook_output}
+\alias{html_notebook_output}
+\alias{html_notebook_output}
+\alias{html_notebook_output_html}
+\alias{html_notebook_output}
+\alias{html_notebook_output_img}
+\alias{html_notebook_output}
+\alias{html_notebook_output_png}
+\alias{html_notebook_output}
+\alias{html_notebook_output_code}
+\title{Generate R Notebook Output}
+\usage{
+html_notebook_output_html(html, meta = NULL)
+
+html_notebook_output_img(path = NULL, bytes = NULL, attributes = NULL,
+  meta = NULL, format = c("png", "jpeg"))
+
+html_notebook_output_png(path = NULL, bytes = NULL, attributes = NULL,
+  meta = NULL, format = c("png", "jpeg"))
+
+html_notebook_output_code(code, attributes = list(class = "r"), meta = NULL)
+}
+\arguments{
+\item{html}{Arbitrary HTML content to insert.}
+
+\item{meta}{An \R list of arbitrary meta-data. The data will
+be converted to JSON, base64-encoded, and injected into the header comment.}
+
+\item{path}{A path to a file. For functions accepting both \code{path}
+and \code{bytes}, if \code{bytes} is \code{NULL}, the bytewise contents
+will be obtained by reading the file.}
+
+\item{bytes}{The bytewise representation of content.}
+
+\item{attributes}{A named \R list of HTML attributes. These will be
+escaped and inserted into the generated HTML as appropriate.}
+
+\item{format}{The image format; one of \code{"png"} or \code{"jpeg"}.}
+
+\item{code}{Source code.}
+}
+\description{
+Utilities for generating output for the \code{html_notebook} format,
+through the \code{output_source} function attached to a
+\code{\link{output_format}}.
+}
+\details{
+For more details on the HTML file format produced by
+ \code{html_notebook}, see \href{http://rmarkdown.rstudio.com/r_notebook_format.html}{http://rmarkdown.rstudio.com/r_notebook_format.html}.
+}
diff --git a/man/html_vignette.Rd b/man/html_vignette.Rd
new file mode 100644
index 0000000..2e31495
--- /dev/null
+++ b/man/html_vignette.Rd
@@ -0,0 +1,64 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_vignette.R
+\name{html_vignette}
+\alias{html_vignette}
+\title{Convert to an HTML vignette.}
+\usage{
+html_vignette(fig_width = 3, fig_height = 3, dev = "png",
+  df_print = "default", css = NULL, keep_md = FALSE, readme = FALSE,
+  ...)
+}
+\arguments{
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{dev}{Graphics device to use for figure output (defaults to png)}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{css}{One or more css files to include}
+
+\item{keep_md}{Keep the markdown file generated by knitting.}
+
+\item{readme}{Use this vignette as the package README.md file (i.e. render
+it as README.md to the package root). Note that if there are image files
+within your vignette you should be sure to add README_files to .Rbuildignore}
+
+\item{...}{Additional arguments passed to \code{\link{html_document}}. Please
+note that \code{theme}, \code{fig_retina} and \code{highlight} are hard
+coded. Setting any of those will yield an error.}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+A HTML vignette is a lightweight alternative to \code{\link{html_document}}
+suitable for inclusion in packages to be released to CRAN. It reduces the
+size of a basic vignette from 100k to around 10k.
+}
+\details{
+Compared to \code{html_document}, it:
+
+\itemize{
+  \item never uses retina figures
+  \item never uses a theme
+  \item has a smaller default figure size
+  \item uses a custom css stylesheet
+  \item uses a custom highlight scheme
+ }
+
+
+
+See the \href{http://rmarkdown.rstudio.com/package_vignette_format.html}{online
+documentation} for additional details on using the \code{html_vignette} format.
+}
diff --git a/man/includes.Rd b/man/includes.Rd
new file mode 100644
index 0000000..dae5bdf
--- /dev/null
+++ b/man/includes.Rd
@@ -0,0 +1,47 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/includes.R
+\name{includes}
+\alias{includes}
+\alias{includes_to_pandoc_args}
+\title{Include content within output}
+\usage{
+includes(in_header = NULL, before_body = NULL, after_body = NULL)
+
+includes_to_pandoc_args(includes, filter = identity)
+}
+\arguments{
+\item{in_header}{One or more files with content to be included in the
+header of the document.}
+
+\item{before_body}{One or more files with content to be included before
+the document body.}
+
+\item{after_body}{One or more files with content to be included after the
+document body.}
+
+\item{includes}{Includes to convert to pandoc ars}
+
+\item{filter}{Filter to pre-process includes with}
+}
+\value{
+Includes list or pandoc args
+}
+\description{
+Specify additional content to be included within an output document.
+}
+\details{
+Non-absolute paths for resources referenced from the
+  \code{in_header}, \code{before_body}, and \code{after_body}
+  parameters are resolved relative to the directory of the input document.
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+html_document(includes = includes(before_body = "header.htm"))
+
+pdf_document(includes = includes(after_body = "footer.tex"))
+
+}
+}
diff --git a/man/ioslides_presentation.Rd b/man/ioslides_presentation.Rd
new file mode 100644
index 0000000..2b3c19f
--- /dev/null
+++ b/man/ioslides_presentation.Rd
@@ -0,0 +1,402 @@
+\name{ioslides_presentation}
+\alias{ioslides_presentation}
+\title{Convert to an ioslides Presentation}
+\description{
+  Format for converting from R Markdown to an \href{https://code.google.com/p/io-2012-slides/}{ioslides} presentation.
+}
+\usage{
+ioslides_presentation(logo = NULL,  slide_level = 2, incremental = FALSE,
+  fig_width = 7.5, fig_height = 4.5, fig_retina = 2, fig_caption = TRUE,
+  dev = "png", df_print = "default", smart = TRUE, self_contained = TRUE,
+  widescreen = FALSE, smaller = FALSE, transition = "default",
+  mathjax = "default", analytics = NULL, template = NULL, css = NULL,
+  includes = NULL, keep_md = FALSE, lib_dir = NULL, md_extensions = NULL,
+  pandoc_args = NULL, extra_dependencies = NULL, ...)
+}
+\arguments{
+  \item{logo}{Path to file that includes a logo for use in
+  the presentation (should be square and at least 128x128)}
+
+  \item{slide_level}{Header level to consider as slide separator (Defaults to header 2)}
+
+ \item{incremental}{\code{TRUE} to render slide bullets
+  incrementally. Note that if you want to reverse the
+  default incremental behavior for an individual bullet you
+  can preceded it with \code{>}. For example: \emph{\code{>
+  - Bullet Text}}}
+
+  \item{fig_width}{Default width (in inches) for figures}
+
+  \item{fig_height}{Default width (in inches) for figures}
+
+  \item{fig_retina}{Scaling to perform for retina displays
+  (defaults to 2,which currently works for all widely used
+  retina displays). Set to\code{NULL} to prevent retina
+  scaling. Note that this will always be\code{NULL} when
+  \code{keep_md} is specified (this is because
+  \code{fig_retina} relies on outputting HTML directly
+  into the markdown document).}
+
+  \item{fig_caption}{\code{TRUE} to render figures with
+  captions}
+
+  \item{dev}{Default graphics device to use for figure output}
+
+  \item{df_print}{Method to be used for printing data frames. Valid values
+  include "default", "kable", and "tibble". The "default" method uses
+  \code{print.data.frame}. The "kable" method uses the
+  \code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+  the \pkg{tibble} package to print a summary of the data frame. In addition
+  to the named methods you can also pass an arbitrary function to be used
+  for printing data frames.}
+
+  \item{smart}{Produce typographically correct output,
+  converting straight quotes to curly quotes, --- to
+  em-dashes, -- to en-dashes, and ... to ellipses.}
+
+  \item{self_contained}{Produce a standalone HTML file with
+  no external dependencies, using data: URIs to incorporate
+  the contents of linked scripts, stylesheets, images, and
+  videos. Note that even for self contained documents
+  MathJax is still loaded externally (this is necessary
+  because of it's size).}
+
+  \item{widescreen}{Display presentation with wider
+  dimensions.}
+
+  \item{smaller}{Use smaller text on all slides. You can
+  also enable this for individual slides by adding the
+  \code{.smaller} attribute to the slide header (see
+  \emph{Presentation Size} below for details).}
+
+  \item{transition}{Speed of slide transitions. This can be "default",
+  "slower", "faster", or a numeric value with a number of seconds (e.g.
+  0.5)}
+
+ \item{mathjax}{Include mathjax. The "default" option uses
+  an https URL from the official MathJax CDN. The "local"
+  option uses a local version of MathJax (which is copied
+  into the output directory). You can pass an alternate URL
+  or pass \code{NULL} to exclude MathJax entirely.}
+
+  \item{analytics}{A Google analytics property ID}
+
+  \item{template}{Path to a pandoc template to use instead of
+  the default bundled template.}
+
+  \item{css}{One or more css files to include}
+
+  \item{includes}{Named list of additional content to
+  include within the document (typically created using the
+  \code{\link{includes}} function). If a \code{before_body}
+  include is specified then it will replace the standard
+  title slide entirely.}
+
+  \item{keep_md}{Keep the markdown file generated by knitting.}
+
+  \item{lib_dir}{Directory to copy dependent HTML libraries
+  (e.g. jquery, bootstrap, etc.) into. By default this will be
+  the name of the document with \code{_files} appended to it.}
+
+  \item{md_extensions}{Markdown extensions to be added or
+  removed from the default definition or R Markdown. See the
+  \code{\link{rmarkdown_format}} for additional details.}
+
+  \item{pandoc_args}{Additional command line options to
+  pass to pandoc}
+
+  \item{extra_dependencies, ...}{Additional function arguments to pass to the
+  base R Markdown HTML output formatter \code{\link{html_document_base}}}
+
+
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+
+\details{
+See the \href{http://rmarkdown.rstudio.com/ioslides_presentation_format.html}{online
+documentation} for additional details on using the \code{ioslides_presentation} format.
+}
+
+\section{Slide Basics}{
+
+You can create a slide show broken up into sections by using the # and ##
+heading tags (you can also create a new slide without a header using a
+horizontal rule (\code{----------}). For example here's a simple slide show:
+
+\preformatted{
+---
+title: "Habits"
+author: John Doe
+date: March 22, 2005
+output: ioslides_presentation
+---
+
+# In the morning
+
+## Getting up
+
+- Turn off alarm
+- Get out of bed
+
+## Breakfast
+
+- Eat eggs
+- Drink coffee
+
+# In the evening
+
+## Dinner
+
+- Eat spaghetti
+- Drink wine
+
+----------
+
+![picture of spaghetti](images/spaghetti.jpg)
+
+## Going to sleep
+
+- Get in bed
+- Count sheep
+
+}
+
+You can add a subtitle to a slide or section by including text after the
+pipe (|) character. For example:
+
+\preformatted{
+## Getting up | What I like to do first thing
+}
+
+}
+
+
+
+\section{Display Modes}{
+
+The following single character keyboard shortcuts enable alternate
+display modes:
+
+\itemize{
+  \item{\code{'f'}      }{enable fullscreen mode}
+  \item{\code{'w'}      }{toggle widescreen mode}
+  \item{\code{'o'}      }{enable overview mode}
+  \item{\code{'h'}      }{enable code highlight mode}
+  \item{\code{'p'}      }{show presenter notes}
+}
+
+Pressing \code{Esc} exits all of these modes. See the sections below
+on \emph{Code Highlighting} and \emph{Presenter Mode} for additional
+detail on those modes.
+
+}
+
+\section{Incremental Bullets}{
+
+You can render bullets incrementally by adding the \code{incremental}
+option:
+
+\preformatted{
+---
+output:
+  ioslides_presentation:
+    incremental: true
+---
+}
+
+If you want to render bullets incrementally for some slides but not
+others you can use this syntax:
+
+\preformatted{
+> - Eat eggs
+> - Drink coffee
+}
+
+}
+
+\section{Presentation Size}{
+
+You can display the presentation using a wider form factor using the
+\code{widescreen} option. You can specify that smaller text be used with
+the \code{smaller} option. For example:
+
+\preformatted{
+---
+output:
+  ioslides_presentation:
+    widescreen: true
+    smaller: true
+---
+}
+
+You can also enable the \code{smaller} option on a slide-by-slide basis
+by adding the \code{.smaller} attibute to the slide header:
+
+\preformatted{
+## Getting up {.smaller}
+}
+
+}
+
+\section{Adding a Logo}{
+
+You can add a logo to the presentation using the \code{logo} option (the
+logo should be square and at least 128x128). For example:
+
+\preformatted{
+---
+output:
+  ioslides_presentation:
+    logo: logo.png
+---
+}
+
+A 128x128 version of the logo graphic will be added to the title slide and
+an icon version of the logo will be included in the bottom-left footer of
+each slide.
+}
+
+\section{Build Slides}{
+
+Slides can also have a \code{.build} attribute that indicate that their
+content should be displayed incrementally. For example:
+
+\preformatted{
+## Getting up {.build}
+}
+
+Slide attributes can be combined if you need to specify more than one,
+for example:
+
+\preformatted{
+## Getting up {.smaller .build}
+}
+}
+
+\section{Code Highlighting}{
+
+It's possible to select subsets of code for additional emphasis by adding a
+special "highlight" comment around the code. For example:
+
+\preformatted{
+### <b>
+x <- 10
+y <- x * 2
+### </b>
+}
+
+The highlighted region will be displayed with a bold font. When you want to
+help the audience focus exclusively on the highlighted region press the
+\code{'h'} key and the rest of the code will fade away.
+
+}
+
+
+\section{Tables}{
+
+The ioslides template has an attractive default style for tables so you
+shouldn't hestiate to add tables for presenting more complex sets of
+information. Pandoc markdown supports several syntaxes for defining
+tables which are described in the \href{http://pandoc.org/README.html}{pandoc online documentation}.
+
+}
+
+
+\section{Advanced Layout}{
+
+You can center content on a slide by adding the \code{.flexbox}
+and \code{.vcenter} attributes to the slide title. For example:
+
+\preformatted{
+## Dinner {.flexbox .vcenter}
+}
+
+You can horizontally center content by enclosing it in a \code{div} tag
+with class \code{centered}. For example:
+
+\preformatted{
+<div class="centered">
+This text is centered.
+</div>
+}
+
+You can do a two-column layout using the \code{columns-2} class.
+For example:
+
+\preformatted{
+<div class="columns-2">
+  ![Image](image.png)
+
+  - Bullet 1
+  - Bullet 2
+  - Bullet 3
+</div>
+}
+
+Note that content will flow accross the columns so if you want to
+have an image on one side and text on the other you should make
+sure that the image has sufficient height to force the text to
+the other side of the slide.
+
+}
+
+\section{Text Color}{
+You can color content using base color classes red, blue, green, yellow,
+and gray (or variations of them e.g. red2, red3, blue2, blue3, etc.).
+For example:
+
+\preformatted{
+<div class="red2">
+This text is red
+</div>
+}
+}
+
+\section{Presenter Mode}{
+
+A separate presenter window can also be opened (ideal for when you are
+presenting on one screen but have another screen that's private to you).
+The window stays in sync with the main presentation window and also
+shows presenter notes and a thumbnail of the next slide. To enable
+presenter mode add \code{?presentme=true} to the URL of the presentation,
+for example:
+
+\preformatted{
+mypresentation.html?presentme=true
+}
+
+The presenter mode window will open and will always re-open with the
+presentation until it's disabled with:
+
+\preformatted{
+mypresentation.html?presentme=false
+}
+
+To add presenter notes to a slide you include it within a "notes"
+\code{div}. For example:
+
+\preformatted{
+<div class="notes">
+This is my *note*.
+
+- It can contain markdown
+- like this list
+
+</div>
+}
+
+}
+
+\section{Printing and PDF Output}{
+
+You can print an ioslides presentation from within browsers that have
+good support for print CSS (i.e. as of this writing Google Chrome
+has the best support). Printing maintains most of the visual styles
+of the HTML version of the presentation.
+
+To create a PDF version of a presentation you can use Print to PDF
+from Google Chrome.
+
+}
diff --git a/man/knit_params_ask.Rd b/man/knit_params_ask.Rd
new file mode 100644
index 0000000..ea99e72
--- /dev/null
+++ b/man/knit_params_ask.Rd
@@ -0,0 +1,29 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/params.R
+\name{knit_params_ask}
+\alias{knit_params_ask}
+\title{Run a shiny application asking for parameter configuration for the given document.}
+\usage{
+knit_params_ask(file = NULL, input_lines = NULL, params = NULL,
+  shiny_args = NULL, save_caption = "Save",
+  encoding = getOption("encoding"))
+}
+\arguments{
+\item{file}{Path to the R Markdown document with configurable parameters.}
+
+\item{input_lines}{Content of the R Markdown document. If \code{NULL}, the contents of \code{file} will be read.}
+
+\item{params}{A named list of optional parameter overrides used in place of the document defaults.}
+
+\item{shiny_args}{Additional arguments to \code{\link[shiny:runApp]{runApp}}.}
+
+\item{save_caption}{Caption to use use for button that saves/confirms parameters.}
+
+\item{encoding}{The encoding of the input file; see \code{\link{file}}.}
+}
+\value{
+named list with overridden parameter names and value.
+}
+\description{
+Run a shiny application asking for parameter configuration for the given document.
+}
diff --git a/man/knitr_options.Rd b/man/knitr_options.Rd
new file mode 100644
index 0000000..9183549
--- /dev/null
+++ b/man/knitr_options.Rd
@@ -0,0 +1,35 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R
+\name{knitr_options}
+\alias{knitr_options}
+\title{Knitr options for an output format}
+\usage{
+knitr_options(opts_knit = NULL, opts_chunk = NULL, knit_hooks = NULL,
+  opts_hooks = NULL, opts_template = NULL)
+}
+\arguments{
+\item{opts_knit}{List of package level knitr options (see
+\code{\link[knitr:opts_knit]{opts_knit}})}
+
+\item{opts_chunk}{List of chunk level knitr options (see
+\code{\link[knitr:opts_chunk]{opts_chunk}})}
+
+\item{knit_hooks}{List of hooks for R code chunks, inline R code, and output
+(see \code{\link[knitr:knit_hooks]{knit_hooks}})}
+
+\item{opts_hooks}{List of hooks for code chunk options
+(see \code{\link[knitr:opts_hooks]{opts_hooks}})}
+
+\item{opts_template}{List of templates for chunk level knitr options (see
+\code{\link[knitr:opts_template]{opts_template}})}
+}
+\value{
+An list that can be passed as the \code{knitr} argument of the
+  \code{\link{output_format}} function.
+}
+\description{
+Define the knitr options for an R Markdown output format.
+}
+\seealso{
+\link{output_format}
+}
diff --git a/man/knitr_options_html.Rd b/man/knitr_options_html.Rd
new file mode 100644
index 0000000..0d30847
--- /dev/null
+++ b/man/knitr_options_html.Rd
@@ -0,0 +1,34 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_document.R
+\name{knitr_options_html}
+\alias{knitr_options_html}
+\title{Knitr options for an HTML output format}
+\usage{
+knitr_options_html(fig_width, fig_height, fig_retina, keep_md, dev = "png")
+}
+\arguments{
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_retina}{Scaling to perform for retina displays (defaults to 2, which
+currently works for all widely used retina displays). Set to \code{NULL} to
+prevent retina scaling. Note that this will always be \code{NULL} when
+\code{keep_md} is specified (this is because \code{fig_retina} relies on
+outputting HTML directly into the markdown document).}
+
+\item{keep_md}{Keep the markdown file generated by knitting.}
+
+\item{dev}{Graphics device to use for figure output (defaults to png)}
+}
+\value{
+An list that can be passed as the \code{knitr} argument of the
+  \code{\link{output_format}} function.
+}
+\description{
+Define knitr options for an R Markdown output format that creates
+HTML output.
+}
+\seealso{
+\link{knitr_options}, \link{output_format}
+}
diff --git a/man/knitr_options_pdf.Rd b/man/knitr_options_pdf.Rd
new file mode 100644
index 0000000..f0b992d
--- /dev/null
+++ b/man/knitr_options_pdf.Rd
@@ -0,0 +1,28 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R
+\name{knitr_options_pdf}
+\alias{knitr_options_pdf}
+\title{Knitr options for a PDF output format}
+\usage{
+knitr_options_pdf(fig_width, fig_height, fig_crop, dev = "pdf")
+}
+\arguments{
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_crop}{\code{TRUE} to automatically apply the \code{pdfcrop} utility
+(if available) to pdf figures}
+
+\item{dev}{Graphics device to use for figure output (defaults to png)}
+}
+\value{
+An list that can be passed as the \code{knitr} argument of the
+  \code{\link{output_format}} function.
+}
+\description{
+Define knitr options for an R Markdown output format that creates PDF output.
+}
+\seealso{
+\link{knitr_options}, \link{output_format}
+}
diff --git a/man/latex_dependency.Rd b/man/latex_dependency.Rd
new file mode 100644
index 0000000..e21ff21
--- /dev/null
+++ b/man/latex_dependency.Rd
@@ -0,0 +1,16 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/latex_dependencies.R
+\name{latex_dependency}
+\alias{latex_dependency}
+\title{Define a LaTeX package dependency}
+\usage{
+latex_dependency(name, options = NULL)
+}
+\arguments{
+\item{name}{The LaTeX package name}
+
+\item{options}{The LaTeX options for the package}
+}
+\description{
+Define a LaTeX package dependency
+}
diff --git a/man/md_document.Rd b/man/md_document.Rd
new file mode 100644
index 0000000..e1fa958
--- /dev/null
+++ b/man/md_document.Rd
@@ -0,0 +1,88 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/md_document.R
+\name{md_document}
+\alias{md_document}
+\title{Convert to a markdown document}
+\usage{
+md_document(variant = "markdown_strict", preserve_yaml = FALSE,
+  toc = FALSE, toc_depth = 3, fig_width = 7, fig_height = 5,
+  fig_retina = NULL, dev = "png", df_print = "default", includes = NULL,
+  md_extensions = NULL, pandoc_args = NULL)
+}
+\arguments{
+\item{variant}{Markdown variant to produce (defaults to "markdown_strict").
+Other valid values are "markdown_github", "markdown_mmd",
+markdown_phpextra", or even "markdown" (which produces pandoc markdown).
+You can also compose custom markdown variants, see the
+\href{http://pandoc.org/README.html}{pandoc online documentation}
+for details.}
+
+\item{preserve_yaml}{Preserve YAML front matter in final document.}
+
+\item{toc}{\code{TRUE} to include a table of contents in the output}
+
+\item{toc_depth}{Depth of headers to include in table of contents}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_retina}{Scaling to perform for retina displays. Defaults to
+\code{NULL} which performs no scaling. A setting of 2 will work for all
+widely used retina displays, but will also result in the output of
+\code{<img>} tags rather than markdown images due to the need to set the
+width of the image explicitly.}
+
+\item{dev}{Graphics device to use for figure output (defaults to png)}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Format for converting from R Markdown to another variant of markdown (e.g.
+strict markdown or github flavored markdown)
+}
+\details{
+See the \href{http://rmarkdown.rstudio.com/markdown_document_format.html}{online
+documentation} for additional details on using the \code{md_document} format.
+
+R Markdown documents can have optional metadata that is used to generate a
+document header that includes the title, author, and date. For more details
+see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+
+R Markdown documents also support citations. You can find more information on
+the markdown syntax for citations in the
+\href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+and Citations} article in the online documentation.
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+render("input.Rmd", md_document())
+
+render("input.Rmd", md_document(variant = "markdown_github"))
+}
+
+}
diff --git a/man/metadata.Rd b/man/metadata.Rd
new file mode 100644
index 0000000..fb42147
--- /dev/null
+++ b/man/metadata.Rd
@@ -0,0 +1,18 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/render.R
+\docType{data}
+\name{metadata}
+\alias{metadata}
+\title{The YAML metadata of the current R Markdown document}
+\format{An object of class \code{list} of length 0.}
+\description{
+The object \code{metadata} stores the YAML metadata of the current R Markdown
+document as a list, which you may use in the R code chunks, e.g.
+\code{rmarkdown::metadata$title} (the title of the document),
+\code{rmarkdown::metadata$author}, and \code{rmarkdown::metadata$foo} (if you
+have a YAML field named \code{foo}), etc.
+}
+\examples{
+rmarkdown::metadata
+}
+\keyword{datasets}
diff --git a/man/navbar_html.Rd b/man/navbar_html.Rd
new file mode 100644
index 0000000..36e3d84
--- /dev/null
+++ b/man/navbar_html.Rd
@@ -0,0 +1,24 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_document.R
+\name{navbar_html}
+\alias{navbar_html}
+\alias{navbar_html}
+\alias{navbar_links_html}
+\title{Create a navbar HTML file from a navbar definition}
+\usage{
+navbar_html(navbar)
+
+navbar_links_html(links)
+}
+\arguments{
+\item{navbar}{Navbar definition}
+
+\item{links}{List of navbar links}
+}
+\value{
+Path to temporary file with navbar definition
+}
+\description{
+Create a navbar HTML file from a navbar definition
+}
+\keyword{internal}
diff --git a/man/odt_document.Rd b/man/odt_document.Rd
new file mode 100644
index 0000000..4a4096d
--- /dev/null
+++ b/man/odt_document.Rd
@@ -0,0 +1,72 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/odt_document.R
+\name{odt_document}
+\alias{odt_document}
+\title{Convert to an OpenDocument Text (ODT) document}
+\usage{
+odt_document(fig_width = 5, fig_height = 4, fig_caption = TRUE,
+  template = "default", reference_odt = "default", includes = NULL,
+  keep_md = FALSE, md_extensions = NULL, pandoc_args = NULL)
+}
+\arguments{
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_caption}{\code{TRUE} to render figures with captions}
+
+\item{template}{Pandoc template to use for rendering. Pass "default" to use
+the rmarkdown package default template; pass \code{NULL} to use pandoc's
+built-in template; pass a path to use a custom template that you've
+created.  See the documentation on
+\href{http://pandoc.org/README.html}{pandoc online documentation}
+for details on creating custom templates.}
+
+\item{reference_odt}{Use the specified file as a style reference in
+producing an odt file. For best results, the reference odt should be a
+modified version of an odt file produced using pandoc. Pass "default"
+to use the rmarkdown default styles.}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{keep_md}{Keep the markdown file generated by knitting.}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Format for converting from R Markdown to an ODT document.
+}
+\details{
+See the \href{http://rmarkdown.rstudio.com/odt_document_format.html}{online
+documentation} for additional details on using the \code{odt_document} format.
+
+R Markdown documents can have optional metadata that is used to generate a
+document header that includes the title, author, and date. For more details
+see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+
+R Markdown documents also support citations. You can find more information on
+the markdown syntax for citations in the
+\href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+and Citations} article in the online documentation.
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+# simple invocation
+render("input.Rmd", odt_document())
+
+# specify an option for syntax highlighting
+render("input.Rmd", odt_document(highlight = "zenburn"))
+}
+
+}
diff --git a/man/output_format.Rd b/man/output_format.Rd
new file mode 100644
index 0000000..168fd3e
--- /dev/null
+++ b/man/output_format.Rd
@@ -0,0 +1,87 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R
+\name{output_format}
+\alias{output_format}
+\title{Define an R Markdown output format}
+\usage{
+output_format(knitr, pandoc, keep_md = FALSE, clean_supporting = TRUE,
+  df_print = NULL, pre_knit = NULL, post_knit = NULL,
+  pre_processor = NULL, intermediates_generator = NULL,
+  post_processor = NULL, on_exit = NULL, base_format = NULL)
+}
+\arguments{
+\item{knitr}{Knitr options for an output format (see
+\code{\link{knitr_options}})}
+
+\item{pandoc}{Pandoc options for an output format (see
+\code{\link{pandoc_options}})}
+
+\item{keep_md}{Keep the markdown file generated by knitting. Note that
+if this is \code{TRUE} then \code{clean_supporting} will always be
+\code{FALSE}.}
+
+\item{clean_supporting}{Cleanup any supporting files after conversion see
+\code{\link{render_supporting_files}}}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{pre_knit}{An optional function that runs before kniting which
+receives the \code{input} (input filename passed to \code{render}) and
+\code{...} (for future expansion) arguments.}
+
+\item{post_knit}{An optional function that runs after kniting which
+receives the \code{metadata}, \code{input_file}, \code{runtime}, and \code{...}
+(for future expansion) arguments. This function can return additional
+arguments to pass to pandoc and can call \code{knitr::knit_meta_add}
+to add additional dependencies based on the contents of the input_file or on other
+assets side by side with it that may be used to produce html with dependencies
+during subsequent processing.}
+
+\item{pre_processor}{An optional pre-processor function that receives the
+\code{metadata}, \code{input_file}, \code{runtime}, \code{knit_meta},
+\code{files_dir}, and \code{output_dir} and can return additional arguments
+to pass to pandoc.}
+
+\item{intermediates_generator}{An optional function that receives the
+original \code{input_file}, its \code{encoding}, and the intermediates
+directory (i.e. the \code{intermediates_dir} argument to
+\code{\link{render}}). The function should generate and return the names of
+any intermediate files required to render the \code{input_file}.}
+
+\item{post_processor}{An optional post-processor function that receives the
+\code{metadata}, \code{input_file}, \code{output_file}, \code{clean},
+and \code{verbose} parameters, and can return an alternative
+\code{output_file}.}
+
+\item{on_exit}{A function to call when \code{rmarkdown::render()} finishes
+execution (as registered with a \code{\link{on.exit}} handler).}
+
+\item{base_format}{An optional format to extend.}
+}
+\value{
+An R Markdown output format definition that can be passed to
+  \code{\link{render}}.
+}
+\description{
+Define an R Markdown output format based on a combination of knitr and pandoc
+options.
+}
+\examples{
+\dontrun{
+output_format(knitr = knitr_options(opts_chunk = list(dev = 'png')),
+              pandoc = pandoc_options(to = "html"))
+}
+
+}
+\seealso{
+\link{render}, \link{knitr_options}, \link{pandoc_options}
+}
diff --git a/man/paged_table.Rd b/man/paged_table.Rd
new file mode 100644
index 0000000..ad2d406
--- /dev/null
+++ b/man/paged_table.Rd
@@ -0,0 +1,14 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_paged.R
+\name{paged_table}
+\alias{paged_table}
+\title{Create a table in HTML with support for paging rows and columns}
+\usage{
+paged_table(x)
+}
+\arguments{
+\item{x}{a data frame to be rendered as a paged table.}
+}
+\description{
+Create a table in HTML with support for paging rows and columns
+}
diff --git a/man/pandoc_args.Rd b/man/pandoc_args.Rd
new file mode 100644
index 0000000..a87c79c
--- /dev/null
+++ b/man/pandoc_args.Rd
@@ -0,0 +1,77 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/pandoc.R
+\name{pandoc_args}
+\alias{pandoc_args}
+\alias{pandoc_variable_arg}
+\alias{pandoc_include_args}
+\alias{pandoc_highlight_args}
+\alias{pandoc_latex_engine_args}
+\alias{pandoc_toc_args}
+\title{Functions for generating pandoc command line arguments}
+\usage{
+pandoc_variable_arg(name, value)
+
+pandoc_include_args(in_header = NULL, before_body = NULL,
+  after_body = NULL)
+
+pandoc_highlight_args(highlight, default = "tango")
+
+pandoc_latex_engine_args(latex_engine)
+
+pandoc_toc_args(toc, toc_depth = 3)
+}
+\arguments{
+\item{name}{Name of template variable to set.}
+
+\item{value}{Value of template variable (defaults to \code{true} if missing).}
+
+\item{in_header}{One or more files with content to be included in the
+header of the document.}
+
+\item{before_body}{One or more files with content to be included before
+the document body.}
+
+\item{after_body}{One or more files with content to be included after the
+document body.}
+
+\item{highlight}{The name of a pandoc syntax highlighting theme.}
+
+\item{default}{The highlighting theme to use if "default"
+is specified.}
+
+\item{latex_engine}{LaTeX engine for producing PDF output. Options are
+"pdflatex", "lualatex", and "xelatex".}
+
+\item{toc}{\code{TRUE} to include a table of contents in the output.}
+
+\item{toc_depth}{Depth of headers to include in table of contents.}
+}
+\value{
+A character vector with pandoc command line arguments
+}
+\description{
+Functions that assist in creating various types of pandoc command line
+arguments (e.g. for templates, table of contents, highlighting, and content
+includes)
+}
+\details{
+Non-absolute paths for resources referenced from the
+  \code{in_header}, \code{before_body}, and \code{after_body}
+  parameters are resolved relative to the directory of the input document.
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+pandoc_include_args(before_body = "header.htm")
+pandoc_include_args(before_body = "header.tex")
+
+pancoc_highlight_args("kate")
+
+pandoc_latex_engine_args("pdflatex")
+
+pandoc_toc_args(toc = TRUE, toc_depth = 2)
+
+}
+}
diff --git a/man/pandoc_available.Rd b/man/pandoc_available.Rd
new file mode 100644
index 0000000..1afc99a
--- /dev/null
+++ b/man/pandoc_available.Rd
@@ -0,0 +1,46 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/pandoc.R
+\name{pandoc_available}
+\alias{pandoc_available}
+\alias{pandoc_version}
+\title{Check pandoc availabilty and version}
+\usage{
+pandoc_available(version = NULL, error = FALSE)
+
+pandoc_version()
+}
+\arguments{
+\item{version}{Required version of pandoc}
+
+\item{error}{Whether to signal an error if pandoc with the required version
+is not found}
+}
+\value{
+\code{pandoc_available} returns a logical indicating whether the
+  required version of pandoc is available. \code{pandoc_version} returns a
+  \code{\link[base]{numeric_version}} with the version of pandoc found.
+}
+\description{
+Determine whether pandoc is currently available on the system (optionally
+checking for a specific version or greater). Determine the specific version
+of pandoc available.
+}
+\details{
+The system environment variable \samp{PATH} as well as the version of pandoc
+shipped with RStudio (its location is set via the environment variable
+\samp{RSTUDIO_PANDOC} by RStudio products like the RStudio IDE, RStudio
+Server, Shiny Server, and RStudio Connect, etc) are scanned for pandoc and
+the highest version available is used. Please do not modify the environment
+varaible \samp{RSTUDIO_PANDOC} unless you know what it means.
+}
+\examples{
+\dontrun{
+library(rmarkdown)
+
+if (pandoc_available())
+  cat("pandoc", as.character(pandoc_version()), "is available!\\n")
+
+if (pandoc_available("1.12.3"))
+  cat("requried version of pandoc is available!\\n")
+}
+}
diff --git a/man/pandoc_convert.Rd b/man/pandoc_convert.Rd
new file mode 100644
index 0000000..e10eee9
--- /dev/null
+++ b/man/pandoc_convert.Rd
@@ -0,0 +1,59 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/pandoc.R
+\name{pandoc_convert}
+\alias{pandoc_convert}
+\title{Convert a document with pandoc}
+\usage{
+pandoc_convert(input, to = NULL, from = NULL, output = NULL,
+  citeproc = FALSE, options = NULL, verbose = FALSE, wd = NULL)
+}
+\arguments{
+\item{input}{Character vector containing paths to input files
+(files must be UTF-8 encoded)}
+
+\item{to}{Format to convert to (if not specified, you must specify
+\code{output})}
+
+\item{from}{Format to convert from (if not specified then the format is
+determined based on the file extension of \code{input}).}
+
+\item{output}{Output file (if not specified then determined based on format
+being converted to)}
+
+\item{citeproc}{\code{TRUE} to run the pandoc-citeproc filter (for processing
+citations) as part of the conversion}
+
+\item{options}{Character vector of command line options to pass to pandoc.}
+
+\item{verbose}{\code{TRUE} to show the pandoc command line which was executed}
+
+\item{wd}{Working directory in which code will be executed. If not
+supplied, defaults to the common base directory of \code{input}}
+}
+\description{
+Convert documents to and from various formats using the pandoc utility.
+}
+\details{
+Supported input and output formats are described in the
+  \href{http://johnmacfarlane.net/pandoc/README.html}{pandoc user guide}.
+
+  The system path as well as the version of pandoc shipped with RStudio (if
+  running under RStudio) are scanned for pandoc and the highest version
+  available is used.
+}
+\examples{
+\dontrun{
+library(rmarkdown)
+
+# convert markdown to various formats
+pandoc_convert("input.md", to = "html")
+pandoc_convert("input.md", to = "pdf")
+
+# process citations
+pandoc_convert("input.md", to = "html", citeproc = TRUE)
+
+# add some pandoc options
+pandoc_convert("input.md", to="pdf", options = c("--listings"))
+}
+
+}
diff --git a/man/pandoc_options.Rd b/man/pandoc_options.Rd
new file mode 100644
index 0000000..ccbb4d9
--- /dev/null
+++ b/man/pandoc_options.Rd
@@ -0,0 +1,43 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R
+\name{pandoc_options}
+\alias{pandoc_options}
+\title{Pandoc options for an output format}
+\usage{
+pandoc_options(to, from = rmarkdown_format(), args = NULL,
+  keep_tex = FALSE, latex_engine = c("pdflatex", "lualatex", "xelatex"),
+  ext = NULL)
+}
+\arguments{
+\item{to}{Pandoc format to convert to}
+
+\item{from}{Pandoc format to convert from}
+
+\item{args}{Character vector of command line arguments to pass to pandoc}
+
+\item{keep_tex}{Keep the intermediate tex file used in the conversion to PDF
+(applies only to 'latex' and 'beamer' target formats)}
+
+\item{latex_engine}{LaTeX engine to producing PDF output (applies only to
+'latex' and 'beamer' target formats)}
+
+\item{ext}{File extension (e.g. ".tex") for output file (if \code{NULL}
+chooses default based on \code{to}). This is typically used to force
+the final output of a latex or beamer converstion to be \code{.tex}
+rather than \code{.pdf}.}
+}
+\value{
+An list that can be passed as the \code{pandoc} argument of the
+  \code{\link{output_format}} function.
+}
+\description{
+Define the pandoc options for an R Markdown output format.
+}
+\details{
+The \code{from} argument should be used very cautiously as it's
+  important for users to be able to rely on a stable definition of supported
+  markdown extensions.
+}
+\seealso{
+\link{output_format}, \link{rmarkdown_format}
+}
diff --git a/man/pandoc_path_arg.Rd b/man/pandoc_path_arg.Rd
new file mode 100644
index 0000000..7e714f9
--- /dev/null
+++ b/man/pandoc_path_arg.Rd
@@ -0,0 +1,24 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/pandoc.R
+\name{pandoc_path_arg}
+\alias{pandoc_path_arg}
+\title{Transform path for passing to pandoc}
+\usage{
+pandoc_path_arg(path, backslash = TRUE)
+}
+\arguments{
+\item{path}{Path to transform}
+
+\item{backslash}{Whether to replace forward slashes in \code{path} with
+backslashes on Windows}
+}
+\value{
+Transformed path that can be passed to pandoc on the command line
+}
+\description{
+Transform a path for passing to pandoc on the command line. Calls
+\code{\link[base:path.expand]{path.expand}} on all platforms. On Windows,
+transform it to a short path name if it contains spaces, and then convert
+forward slashes to back slashes (as required by pandoc for some path
+references)
+}
diff --git a/man/pandoc_self_contained_html.Rd b/man/pandoc_self_contained_html.Rd
new file mode 100644
index 0000000..55c18ee
--- /dev/null
+++ b/man/pandoc_self_contained_html.Rd
@@ -0,0 +1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/pandoc.R
+\name{pandoc_self_contained_html}
+\alias{pandoc_self_contained_html}
+\title{Create a self-contained HTML document using pandoc.}
+\usage{
+pandoc_self_contained_html(input, output)
+}
+\arguments{
+\item{input}{Input html file to create self-contained version of.}
+
+\item{output}{Path to save output.}
+}
+\value{
+(Invisibly) The path of the generated file.
+}
+\description{
+Create a self-contained HTML document by base64 encoding images,
+scripts, and stylesheets referended by the input document.
+}
diff --git a/man/pandoc_template.Rd b/man/pandoc_template.Rd
new file mode 100644
index 0000000..c6628b2
--- /dev/null
+++ b/man/pandoc_template.Rd
@@ -0,0 +1,25 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/pandoc.R
+\name{pandoc_template}
+\alias{pandoc_template}
+\title{Render a pandoc template.}
+\usage{
+pandoc_template(metadata, template, output, verbose = FALSE)
+}
+\arguments{
+\item{metadata}{A named list containing metadata to pass to template.}
+
+\item{template}{Path to a pandoc template.}
+
+\item{output}{Path to save output.}
+
+\item{verbose}{\code{TRUE} to show the pandoc command line which was
+executed.}
+}
+\value{
+(Invisibly) The path of the generated file.
+}
+\description{
+Use the pandoc templating engine to render a text file. Substitutions are
+done using the \code{metadata} list passed to the function.
+}
diff --git a/man/parse_html_notebook.Rd b/man/parse_html_notebook.Rd
new file mode 100644
index 0000000..260dbbe
--- /dev/null
+++ b/man/parse_html_notebook.Rd
@@ -0,0 +1,22 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/html_notebook.R
+\name{parse_html_notebook}
+\alias{parse_html_notebook}
+\title{Parse an HTML Notebook}
+\usage{
+parse_html_notebook(path, encoding = "UTF-8")
+}
+\arguments{
+\item{path}{The path to an R Notebook file (with extension \code{.nb.html}).}
+
+\item{encoding}{The document's encoding (assumend \code{"UTF-8"} by default).}
+}
+\description{
+Parse an HTML notebook, retrieving annotation information
+related to generated outputs in the document, as well as the
+original R Markdown source document.
+}
+\details{
+For more details on the HTML file format produced by
+ \code{html_notebook}, see \href{http://rmarkdown.rstudio.com/r_notebook_format.html}{http://rmarkdown.rstudio.com/r_notebook_format.html}.
+}
diff --git a/man/pdf_document.Rd b/man/pdf_document.Rd
new file mode 100644
index 0000000..20d4cf3
--- /dev/null
+++ b/man/pdf_document.Rd
@@ -0,0 +1,147 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/pdf_document.R
+\name{pdf_document}
+\alias{pdf_document}
+\alias{latex_document}
+\alias{latex_fragment}
+\title{Convert to a PDF/LaTeX document}
+\usage{
+pdf_document(toc = FALSE, toc_depth = 2, number_sections = FALSE,
+  fig_width = 6.5, fig_height = 4.5, fig_crop = TRUE,
+  fig_caption = TRUE, dev = "pdf", df_print = "default",
+  highlight = "default", template = "default", keep_tex = FALSE,
+  latex_engine = "pdflatex", citation_package = c("none", "natbib",
+  "biblatex"), includes = NULL, md_extensions = NULL, pandoc_args = NULL,
+  extra_dependencies = NULL)
+
+latex_document(...)
+
+latex_fragment(...)
+}
+\arguments{
+\item{toc}{\code{TRUE} to include a table of contents in the output}
+
+\item{toc_depth}{Depth of headers to include in table of contents}
+
+\item{number_sections}{\code{TRUE} to number section headings}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_crop}{\code{TRUE} to automatically apply the \code{pdfcrop} utility
+(if available) to pdf figures}
+
+\item{fig_caption}{\code{TRUE} to render figures with captions}
+
+\item{dev}{Graphics device to use for figure output (defaults to pdf)}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{highlight}{Syntax highlighting style. Supported styles include
+"default", "tango", "pygments", "kate", "monochrome", "espresso",
+"zenburn", and "haddock". Pass \code{NULL} to prevent syntax highlighting.}
+
+\item{template}{Pandoc template to use for rendering. Pass "default" to use
+the rmarkdown package default template; pass \code{NULL} to use pandoc's
+built-in template; pass a path to use a custom template that you've
+created.  See the documentation on
+\href{http://pandoc.org/README.html}{pandoc online documentation}
+for details on creating custom templates.}
+
+\item{keep_tex}{Keep the intermediate tex file used in the conversion to PDF}
+
+\item{latex_engine}{LaTeX engine for producing PDF output. Options are
+"pdflatex", "lualatex", and "xelatex".}
+
+\item{citation_package}{The LaTeX package to process citations, \code{natbib}
+or \code{biblatex}. Use \code{none} if neither package is to be used.}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+
+\item{extra_dependencies}{A LaTeX dependency \code{latex_dependency()}, a
+list of LaTeX dependencies, a character vector of LaTeX package names (e.g.
+\code{c("framed", "hyperref")}), or a named list of LaTeX package options
+with the names being package names (e.g. \code{list(hypreref =
+c("unicode=true", "breaklinks=true"), lmodern = NULL)}). It can be used to
+add custom LaTeX packages to the .tex header.}
+
+\item{...}{Arguments passed to \code{pdf_document()}.}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Formats for converting from R Markdown to a PDF or LaTeX document.
+}
+\details{
+See the \href{http://rmarkdown.rstudio.com/pdf_document_format.html}{online
+documentation} for additional details on using the \code{pdf_document} format.
+
+Creating PDF output from R Markdown requires that LaTeX be installed.
+
+R Markdown documents can have optional metadata that is used to generate a
+document header that includes the title, author, and date. For more details
+see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+
+R Markdown documents also support citations. You can find more information on
+the markdown syntax for citations in the
+\href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+and Citations} article in the online documentation.
+
+Many aspects of the LaTeX template used to create PDF documents can be
+customized using metadata. For example:
+
+\tabular{l}{
+\code{---} \cr
+\code{title: "Crop Analysis Q3 2013"} \cr
+\code{fontsize: 11pt} \cr
+\code{geometry: margin=1in} \cr
+\code{---}
+}
+
+Available metadata variables include:
+
+\describe{
+   \item{\code{lang}}{Document language code (e.g. "es", "fr", "pt-BR")}
+   \item{\code{fontsize}}{Font size (e.g. 10pt, 11pt, 12pt)}
+   \item{\code{documentclass}}{LaTeX document class (e.g. article)}
+   \item{\code{classoption}}{Option for \code{documentclass} (e.g. oneside); may be repeated}
+   \item{\code{geometry}}{Options for geometry class (e.g. margin=1in); may be repeated}
+   \item{\code{mainfont, sansfont, monofont, mathfont}}{Document fonts (works only with xelatex and lualatex, see the \code{latex_engine} option)}
+   \item{\code{linkcolor, urlcolor, citecolor}}{Color for internal, external, and citation links (red, green, magenta, cyan, blue, black)}
+   \item{\code{linestretch}}{Options for line spacing (e.g. 1, 1.5, 3)}
+}
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+# simple invocation
+render("input.Rmd", pdf_document())
+
+# specify an option for latex engine
+render("input.Rmd", pdf_document(latex_engine = "lualatex"))
+
+# add a table of contents and pass an option to pandoc
+render("input.Rmd", pdf_document(toc = TRUE, "--listings"))
+}
+
+}
diff --git a/man/relative_to.Rd b/man/relative_to.Rd
new file mode 100644
index 0000000..d7f82cf
--- /dev/null
+++ b/man/relative_to.Rd
@@ -0,0 +1,22 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/relative_to.R
+\name{relative_to}
+\alias{relative_to}
+\title{Relative path utility function}
+\usage{
+relative_to(dir, file)
+}
+\arguments{
+\item{dir}{Directory}
+
+\item{file}{File}
+}
+\value{
+Relative path from the directory to the file (or the unmodified file
+  path if the file does not appear to be in the directory).
+}
+\description{
+Given a directory and a file, return a relative path from the directory to
+the file, or the unmodified file path if the file does not appear to be in
+the directory.
+}
diff --git a/man/render.Rd b/man/render.Rd
new file mode 100644
index 0000000..4024325
--- /dev/null
+++ b/man/render.Rd
@@ -0,0 +1,165 @@
+\name{render}
+\alias{render}
+\title{Render R Markdown}
+\usage{
+render(input, output_format = NULL, output_file = NULL, output_dir = NULL,
+       output_options = NULL, intermediates_dir = NULL,
+       knit_root_dir = NULL,
+       runtime = c("auto", "static", "shiny", "shiny_prerendered"),
+       clean = TRUE, params = NULL, knit_meta = NULL, envir = parent.frame(),
+       run_pandoc = TRUE, quiet = FALSE, encoding = getOption("encoding"))
+}
+\arguments{
+  \item{input}{Input file (R script, Rmd, or plain markdown).}
+
+  \item{output_format}{R Markdown output format to convert to. Pass
+  \code{"all"} to render all formats defined within the file. Pass
+  the name of a format (e.g. \code{"html_document"}) to render a single
+  format or pass a vector of format names to render multiple formats.
+  Alternatively you can pass an output format object;
+  e.g. \code{html_document()}. If \code{NULL} is passed then the
+  output format is the first one defined in the YAML metadata of the
+  input file (defaulting to HTML if none is specified).}
+
+  \item{output_options}{List of output options that can override the options
+  specified in metadata (e.g. could be used to force \code{self_contained} or
+  \code{mathjax = "local"}). Note that this is only valid when the output
+  format is read from metadata (i.e. not a custom format object passed to
+  \code{output_format}).}
+
+  \item{output_file}{Output file. If \code{NULL} then a default based on
+  the name of the input file is chosen.}
+
+  \item{output_dir}{Output directory. An alternate directory to write
+  the output file to (defaults to the directory of the input file).}
+
+  \item{intermediates_dir}{Intermediate files directory. If \code{NULL},
+  intermediate files are written to the same directory as the input file;
+  otherwise.}
+
+  \item{knit_root_dir}{The working directory in which to knit the document; uses
+  knitr's \code{root.dir} knit option. \code{NULL} means to follow the knitr
+  default, which is to use the parent directory of the document.}
+
+  \item{runtime}{The runtime target for rendering. \code{static} produces output
+  intended for static files; \code{shiny} produces output suitable for use in a
+  Shiny document (see \code{\link{run}}). The default, \code{auto},
+  allows the \code{runtime} target specified in the YAML metadata to take
+  precedence, and renders for a \code{static} runtime target otherwise.}
+
+  \item{clean}{\code{TRUE} to clean intermediate files created
+  during rendering.}
+
+  \item{params}{List of named parameters that override custom params
+  specified within the YAML front-matter (e.g. specifying a dataset to
+  read or a date range to confine output to). Pass \code{"ask"} to start
+  an application that helps guide parameter configuration.}
+
+  \item{knit_meta}{(For expert use) Meta data generated by \pkg{knitr}.}
+
+  \item{envir}{The environment in which the code chunks are
+  to be evaluated during knitting (can use
+  \code{\link{new.env}()} to guarantee an empty new
+  environment).}
+
+  \item{run_pandoc}{Whether to run Pandoc to convert Markdown output.}
+
+  \item{quiet}{\code{TRUE} to supress printing of the
+  pandoc command line.}
+
+  \item{encoding}{The encoding of the input file; see
+  \code{\link{file}}.}
+}
+\value{
+When \code{run_pandoc = TRUE}, the compiled document is written into the output
+file, and the path of the output file is returned.
+
+When \code{run_pandoc = FALSE}, the path of the Markdown output file, with
+attributes \code{knit_meta} (the \pkg{knitr} meta data collected from code
+chunks) and \code{intermediates} (the intermediate files/directories generated
+by \code{render()}).
+}
+\description{
+Render the input file to the specified output format using
+pandoc. If the input requires knitting then
+\code{\link[knitr:knit]{knit}} is called prior to pandoc.
+}
+\details{
+
+Note that the \pkg{knitr} \code{error} option is set to \code{FALSE}
+during rendering (which is different from the \pkg{knitr} default
+value of \code{TRUE}).
+
+For additional details on rendering R scripts see
+\link[=compile_notebook]{Compiling R scripts to a notebook}.
+
+If no \code{output_format} parameter is specified then the output
+format is read from the YAML front-matter of the input
+file. For example, the following YAML would yield a PDF
+document:
+
+\preformatted{
+output: pdf_document
+}
+
+Additional format options can also be specified in metadata. For example:
+
+\preformatted{
+output:
+  pdf_document:
+    toc: true
+    highlight: zenburn
+}
+
+Multiple formats can be specified in metadata. If no \code{output_format}
+is passed to \code{render} then the first one defined will be used:
+
+\preformatted{
+output:
+  pdf_document:
+    toc: true
+    highlight: zenburn
+  html_document:
+    toc: true
+    theme: united
+}
+
+Formats specified in metadata can be any one of the built in formats
+(e.g. \code{\link{html_document}},
+\code{\link{pdf_document}}) or a format defined in another
+package (e.g. \code{pkg::custom_format}).
+
+If there is no format defined in the YAML then
+\code{\link{html_document}} will be used.
+}
+\section{R Markdown}{
+  R Markdown supports all of the base pandoc markdown
+  features as well as some optional features for
+  compatibility with GitHub Flavored Markdown (which
+  previous versions of R Markdown were based on). See
+  \code{\link{rmarkdown_format}} for details.
+
+}
+\seealso{
+\link[knitr:knit]{knit}, \link{output_format},
+\href{http://johnmacfarlane.net/pandoc}{pandoc}
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+# render the default (first) format defined in the file
+render("input.Rmd")
+
+# render all formats defined in the file
+render("input.Rmd", "all")
+
+# render a single format
+render("input.Rmd", "html_document")
+
+# render multiple formats
+render("input.Rmd", c("html_document", "pdf_document"))
+}
+}
+
diff --git a/man/render_delayed.Rd b/man/render_delayed.Rd
new file mode 100644
index 0000000..6fb5898
--- /dev/null
+++ b/man/render_delayed.Rd
@@ -0,0 +1,51 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/shiny.R
+\name{render_delayed}
+\alias{render_delayed}
+\title{Delay Rendering for an Expression}
+\usage{
+render_delayed(expr)
+}
+\arguments{
+\item{expr}{The expression to evaluate.}
+}
+\value{
+An object representing the expression.
+}
+\description{
+In a Shiny document, evaluate the given expression after the document has
+finished rendering, instead of during render.
+}
+\details{
+This function is useful inside Shiny documents. It delays the
+  evaluation of its argument until the document has finished its initial
+  render, so that the document can be viewed before the calculation is
+  finished.
+
+  Any expression that returns HTML can be wrapped in \code{render_delayed}.
+}
+\note{
+\code{expr} is evaluated in a \strong{copy} of the environment in which
+  the \code{render_delayed} call appears. Consequently, no side effects
+  created by \code{expr} are visible in succeeding expressions, nor are
+  changes to the environment after the call to \code{render_delayed} visible
+  to \code{expr}.
+
+  \code{expr} must be an expression that produces HTML.
+}
+\examples{
+\dontrun{
+
+# Add the following code to an R Markdown document
+
+div(Sys.time())
+
+render_delayed({
+ Sys.sleep(3)      # simulate an expensive computation
+ div(Sys.time())
+})
+
+div(Sys.time())
+}
+
+}
diff --git a/man/render_site.Rd b/man/render_site.Rd
new file mode 100644
index 0000000..a33fc5d
--- /dev/null
+++ b/man/render_site.Rd
@@ -0,0 +1,139 @@
+\name{render_site}
+\alias{default_site}
+\alias{clean_site}
+\alias{render_site}
+\alias{site_config}
+\alias{site_generator}
+\title{Render multiple documents as a website}
+\usage{
+render_site(input = ".", output_format = "all", envir = parent.frame(),
+  quiet = FALSE, encoding = getOption("encoding"))
+
+clean_site(input = ".", preview = FALSE, quiet = FALSE,
+  encoding = getOption("encoding"))
+
+site_generator(input = ".", output_format = NULL,
+  encoding = getOption("encoding"))
+}
+\arguments{
+\item{input}{Website directory (or the name of a file within the directory)}
+
+\item{output_format}{R Markdown format to convert to (defaults to "all").}
+
+\item{envir}{The environment in which the code chunks are to be evaluated
+during knitting (can use \code{\link{new.env}} to guarantee an empty new
+environment).}
+
+\item{preview}{Whether to list the files to be removed rather than actually removing them.}
+
+\item{quiet}{\code{TRUE} to suppress messages and other output.}
+
+\item{encoding}{The encoding of the input file; see \code{\link{file}}.}
+
+\item{...}{Currently unused}
+}
+\value{
+\code{render_site} returns the name of the site output file (relative to the input directory).
+\code{clean_site} returns the names of the generated files removed during cleaning.
+}
+\description{
+Render all of the R Markdown documents within a directory as a website.
+}
+\details{
+The \code{render_site} function enables you to render a collection of markdown documents within a directory as a website. There are two requirements for a directory to be rendered as a website:
+
+\enumerate{
+\item{It must contain either an "index.Rmd" or "index.md" file.}
+\item{It must contain a site configuration file ("_site.yml").}
+}
+
+The most minimal valid website is an empty "index.Rmd" and an empty "_site.yml". With this configuration a single empty webpage would be generated via a call to \code{render_site}. If you add additional markdown documents to the directory they will also be rendered. By default a site is rendered in the following fashion:
+
+\enumerate{
+
+\item{R Markdown (.Rmd) and plain markdown (.md) files in the root directory are rendered. Note however that markdown files beginning with "_" are not rendered (this is a convention to designate files that are included by top level documents).}
+
+\item{All output and supporting files are copied to a "_site" subdirectory of the website directory (this is configurable, see discussion below).}
+
+\item{The following files are \bold{not} copied to the "_site" sub-directory:
+\itemize{
+\item{Files beginning with "." (hidden files).}
+\item{Files beginning with "_"}
+\item{Files known to contain R source code (e.g. ".R", ".s", ".Rmd"), R data (e.g. ".RData", ".rds"), or configuration data (e.g. ".Rproj", "rsconnect")).}
+}
+
+Note that you can override which files are included or excluded via settings in "_site.yml" (described below)
+}
+\item{Normally R Markdown renders documents as self-contained HTML. However, \code{render_site} ensures that dependencies (e.g. CSS, JavaScript, images, etc.) remain in external files. CSS/JavaScript libraries are copied to a "site_libs" sub-directory and plots/images are copied to "_files" sub-directories.}
+}
+
+You can remove the files generated by \code{render_site} using the \code{clean_site} function.
+
+}
+
+\section{Configuration}{
+A "_site.yml" file can be used to configure the behavior of site generation. Here is an example configuration file:
+
+\preformatted{name: my-website
+output_dir: _site
+include: ["demo.R"]
+exclude: ["docs.txt", "*.csv"]
+navbar:
+  title: "My Website"
+  left:
+    - text: "Home"
+      href: index.html
+    - text: "About"
+      href: about.html
+output:
+  html_document:
+    toc: true
+    highlight: textmate
+}
+
+The \code{name} field provides a suggested URL path for your website when it is published (by default this is just the name of the directory containing the site). The \code{output_dir} indicates which directory to copy site content into ("_site" is the default if none is specified). Note that this can be "." to keep all content within the root website directory alongside the source code.
+
+The \code{include} and \code{exclude} fields enable you to override the default behavior visa-vi what files are copied into the "_site" directory (wildcards can be used as in the above example).
+
+The \code{navbar} field can be used to define a navigation bar for websites based on the \code{\link{html_document}} format.
+
+Finally, the \code{output} field enables you to specify output options that are common to all documents within the website (you can also still provide local options within each document that override any common options).
+}
+
+\section{Custom Site Generation}{
+
+The behavior of the default site generation function (\code{rmarkdown::default_site}) is described above. It is also possible to define a custom site generator that has alternate behavior. A site generator is an R function that is bound to by including it in the "site:" field of the "index.Rmd" or "index.md" file. For example:
+
+\preformatted{title: "My Book"
+output: bookdown::gitbook
+site: bookdown::bookdown_site
+}
+
+A site generation function should return a list with the following elements:
+
+\itemize{
+  \item{\code{name}} {The name for the website (e.g. the parent directory name).}
+  \item{\code{output_dir} {The directory where the website output is written to.
+  This path should be relative to the site directory (e.g. "." or "_site")}}
+  \item{\code{render}} {An R function that can be called to generate the site.
+  The function should accept the \code{input_file}, \code{output_format},
+  \code{envir}, \code{quiet}, and \code{encoding} arguments.}
+  \item{\code{clean}} {An R function that returns relative paths to the files
+  generated by \code{render_site} (these files are the ones which will be removed
+  by the \code{clean_site} function.}
+}
+
+Note that the \code{input_file} argument will be \code{NULL} when the entire site is being generated. It will be set to a specific file name if a front-end tool is attempting to preview it (e.g. RStudio IDE via the Knit button).
+
+When \code{quiet = FALSE} the \code{render} function should also print a line of output using the \code{\link{message}} function indicating which output file should be previewed, for example:
+
+\preformatted{if (!quiet)
+  message("\nOutput created: ", output)
+}
+
+Emitting this line enables front-ends like RStudio to determine which file they should open to preview the website.
+
+See the source code of the \code{rmarkdown::default_site} function for a
+example of a site generation function.
+}
+
diff --git a/man/render_supporting_files.Rd b/man/render_supporting_files.Rd
new file mode 100644
index 0000000..78a720b
--- /dev/null
+++ b/man/render_supporting_files.Rd
@@ -0,0 +1,23 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/render.R
+\name{render_supporting_files}
+\alias{render_supporting_files}
+\title{Render supporting files for an input document}
+\usage{
+render_supporting_files(from, files_dir, rename_to = NULL)
+}
+\arguments{
+\item{from}{Directory to copy from}
+
+\item{files_dir}{Directory to copy files into}
+
+\item{rename_to}{Optional rename of source directory after it is copied}
+}
+\value{
+The relative path to the supporting files. This path is suitable
+for inclusion in HTML\code{href} and \code{src} attributes.
+}
+\description{
+Render (copy) required supporting files for an input document to the _files
+directory associated with the document.
+}
diff --git a/man/resolve_output_format.Rd b/man/resolve_output_format.Rd
new file mode 100644
index 0000000..7caa5a2
--- /dev/null
+++ b/man/resolve_output_format.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R
+\name{resolve_output_format}
+\alias{resolve_output_format}
+\title{Resolve the output format for an R Markdown document}
+\usage{
+resolve_output_format(input, output_format = NULL, output_options = NULL,
+  encoding = getOption("encoding"))
+}
+\arguments{
+\item{input}{Input file (Rmd or plain markdown)}
+
+\item{output_format}{Name of output format (or \code{NULL} to use
+the default format for the input file).}
+
+\item{output_options}{List of output options that should override the
+options specified in metadata.}
+
+\item{encoding}{The encoding of the input file; see \code{\link{file}}}
+}
+\value{
+An R Markdown output format definition that can be passed to
+  \code{\link{render}}.
+}
+\description{
+Read the YAML metadata (and any common _output.yml file) for the
+document and return an output format object that can be
+passed to the \code{\link{render}} function.
+}
+\details{
+This function is useful for front-end tools that need to modify
+the default behavior of an output format.
+}
diff --git a/man/rmarkdown-package.Rd b/man/rmarkdown-package.Rd
new file mode 100644
index 0000000..eb70cac
--- /dev/null
+++ b/man/rmarkdown-package.Rd
@@ -0,0 +1,43 @@
+\docType{package}
+\name{rmarkdown-package}
+\alias{rmarkdown}
+\alias{rmarkdown-package}
+\title{R Markdown Document Conversion}
+\description{
+ Convert R Markdown documents into a variety of formats
+ including HTML, MS Word, PDF, and Beamer.
+}
+
+\details{
+
+The \pkg{rmarkdown} package includes high level functions for converting to a variety of formats. For example:
+
+\preformatted{
+render("input.Rmd", html_document())
+render("input.Rmd", pdf_document())
+}
+
+You can also specify a plain markdown file in which case knitting will be bypassed:
+
+\preformatted{render("input.md", html_document())
+}
+
+Additional options can be specified along with the output format:
+
+\preformatted{render("input.Rmd", html_document(toc = TRUE))
+render("input.Rmd", pdf_document(latex_engine = "lualatex"))
+render("input.Rmd", beamer_presentation(incremental = TRUE))
+}
+
+You can also include arbitrary pandoc command line arguments along with the other options:
+
+\preformatted{render("input.Rmd", pdf_document(toc = TRUE, pandoc_args = "--listings"))
+}
+
+}
+
+\seealso{
+\link{render}, \link{html_document}, \link{pdf_document}, \link{word_document}, \link{beamer_presentation}
+}
+
+
diff --git a/man/rmarkdown_format.Rd b/man/rmarkdown_format.Rd
new file mode 100644
index 0000000..0e11c4a
--- /dev/null
+++ b/man/rmarkdown_format.Rd
@@ -0,0 +1,47 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R, R/util.R
+\name{rmarkdown_format}
+\alias{rmarkdown_format}
+\alias{from_rmarkdown}
+\title{R Markdown input format definition}
+\usage{
+rmarkdown_format(extensions = NULL)
+
+from_rmarkdown(implicit_figures = TRUE, extensions = NULL)
+}
+\arguments{
+\item{extensions}{Markdown extensions to be added or removed from the
+default definition of R Markdown.}
+
+\item{implicit_figures}{Automatically make figures from images (defaults to \code{TRUE}).}
+}
+\value{
+Pandoc markdown format specification
+}
+\description{
+Compose a pandoc markdown input definition for R Markdown that can be
+passed as the \code{from} argument of \link{pandoc_options}.
+}
+\details{
+By default R Markdown is defined as all pandoc markdown extensions with
+the following tweaks for backward compatibility with the markdown package
+(+ features are added, - features are removed):
+
+\tabular{l}{
+\code{+autolink_bare_uris} \cr
+\code{+ascii_identifier} \cr
+\code{+tex_math_single_backslash} \cr
+}
+
+
+For more on pandoc markdown see the \href{http://pandoc.org/README.html}{pandoc online documentation}.
+}
+\examples{
+\dontrun{
+rmarkdown_format("-implicit_figures")
+}
+
+}
+\seealso{
+\link{output_format}, \link{pandoc_options}
+}
diff --git a/man/rmd_metadata.Rd b/man/rmd_metadata.Rd
new file mode 100644
index 0000000..4971d2b
--- /dev/null
+++ b/man/rmd_metadata.Rd
@@ -0,0 +1,32 @@
+\name{rmd_metadata}
+\alias{rmd_metadata}
+
+\title{R Markdown Metadata}
+
+\description{
+
+Rmd files include a metadata section (typically located at the top of the file) that can specify (among other things) the title, author, and date of the document. Metadata adheres to the \href{http://www.yaml.org/}{YAML} format and is delimited by lines containing three dashes (\code{---}). Here is an example metadata section:
+
+\preformatted{---
+title: "Crop Analysis Q3 2013"
+author: Martha Smith
+date: October 23rd, 2013
+---
+}
+
+Note that the \code{title} field is quoted. This is because titles often contained embedded colons (\code{:}) and colons followed by a space need to be quoted in YAML.
+}
+
+\details{
+When title, author, and date metadata is provided it's used to automatically create a title section within output documents. If you don't want this section included in your document then you should remove the corresponding metadata fields.
+
+When generating PDF and Beamer output there are also a number of other metadata fields that can be included to customize the appearance and theme of PDF output. For more details see the documentation for \code{\link{pdf_document}} and \code{\link{beamer_presentation}}.
+
+}
+
+
+
+
+
+
+
diff --git a/man/rtf_document.Rd b/man/rtf_document.Rd
new file mode 100644
index 0000000..c99443c
--- /dev/null
+++ b/man/rtf_document.Rd
@@ -0,0 +1,58 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/rtf_document.R
+\name{rtf_document}
+\alias{rtf_document}
+\title{Convert to an RTF document}
+\usage{
+rtf_document(toc = FALSE, toc_depth = 3, fig_width = 5, fig_height = 4,
+  keep_md = FALSE, md_extensions = NULL, pandoc_args = NULL)
+}
+\arguments{
+\item{toc}{\code{TRUE} to include a table of contents in the output}
+
+\item{toc_depth}{Depth of headers to include in table of contents}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{keep_md}{Keep the markdown file generated by knitting.}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Format for converting from R Markdown to an RTF document.
+}
+\details{
+See the \href{http://rmarkdown.rstudio.com/rtf_document_format.html}{online
+documentation} for additional details on using the \code{rtf_document} format.
+
+R Markdown documents can have optional metadata that is used to generate a
+document header that includes the title, author, and date. For more details
+see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+
+R Markdown documents also support citations. You can find more information on
+the markdown syntax for citations in the
+\href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+and Citations} article in the online documentation.
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+# simple invocation
+render("input.Rmd", rtf_document())
+
+# specify table of contents option
+render("input.Rmd", rtf_document(toc = TRUE))
+}
+
+}
diff --git a/man/run.Rd b/man/run.Rd
new file mode 100644
index 0000000..66665dc
--- /dev/null
+++ b/man/run.Rd
@@ -0,0 +1,87 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/shiny.R
+\name{run}
+\alias{run}
+\title{Run a Shiny document}
+\usage{
+run(file = "index.Rmd", dir = dirname(file), default_file = NULL,
+  auto_reload = TRUE, shiny_args = NULL, render_args = NULL)
+}
+\arguments{
+\item{file}{Path to the R Markdown document to launch in a web browser.
+Defaults to \code{index.Rmd} in the current working directory, but may be
+\code{NULL} to skip launching a browser.}
+
+\item{dir}{The directory from which to to read input documents. Defaults to
+the parent directory of \code{file}.}
+
+\item{default_file}{The file to serve at the Shiny server's root URL. If
+\code{NULL} (the default), a sensible default is chosen (see Details)}
+
+\item{auto_reload}{If \code{TRUE} (the default), automatically reload the
+Shiny application when the file currently being viewed is changed on disk.}
+
+\item{shiny_args}{Additional arguments to \code{\link[shiny:runApp]{runApp}}.}
+
+\item{render_args}{Additional arguments to \code{\link{render}}.}
+}
+\value{
+Invisible NULL.
+}
+\description{
+Start a Shiny server for the given document, and render it for display.
+}
+\details{
+The \code{run} function runs a Shiny document by starting a Shiny
+  server associated with the document. The \code{shiny_args} parameter can be
+  used to configure the server; see the \code{\link[shiny:runApp]{runApp}}
+  documentation for details.
+
+  Once the server is started, the document will be rendered using
+  \code{\link{render}}. The server will initiate a render of the document
+  whenever necessary, so it is not necessary to call \code{run} every time
+  the document changes: if \code{auto_reload} is \code{TRUE}, saving the
+  document will trigger a render. You can also manually trigger a render by
+  reloading the document in a Web browser.
+
+  The server will render any R Markdown (\code{.Rmd}) document in \code{dir};
+  the \code{file} argument specifies only the initial document to be
+  rendered and viewed. You can therefore link to other documents in the
+  directory using standard Markdown syntax, e.g.
+  \code{[Analysis Page 2](page2.Rmd)}.
+
+  If \code{default_file} is not specified, nor is a file specified on the
+  URL, then the default document to serve at \code{/} is chosen from (in
+  order of preference):
+  \itemize{
+    \item{If \code{dir} contains only one \code{Rmd}, that \code{Rmd}.}
+    \item{The file \code{index.Rmd}, if it exists in \code{dir}}
+    \item{The file \code{index.html}, if it exists in \code{dir}}
+  }
+
+  If you wish to share R code between your documents, place it in a file
+  named \code{global.R} in \code{dir}; it will be sourced into the global
+  environment.
+}
+\note{
+Unlike \code{\link{render}}, \code{run} does not render the document to
+  a file on disk. In most cases a Web browser will be started automatically
+  to view the document; see \code{launch.browser} in the
+  \code{\link[shiny:runApp]{runApp}} documentation for details.
+
+  When using an external web browser with the server, specify the name of the
+  R Markdown file to view in the URL (e.g.
+  \code{http://127.0.0.1:1234/foo.Rmd}). A URL without a filename will show
+  the \code{default_file} as described above.
+}
+\examples{
+\dontrun{
+
+# Run the Shiny document "index.Rmd" in the current directory
+rmarkdown::run()
+
+# Run the Shiny document "shiny_doc.Rmd" on port 8241
+rmarkdown::run("shiny_doc.Rmd", shiny_args = list(port = 8241))
+
+}
+}
diff --git a/man/shiny_prerendered_chunk.Rd b/man/shiny_prerendered_chunk.Rd
new file mode 100644
index 0000000..f8e5a07
--- /dev/null
+++ b/man/shiny_prerendered_chunk.Rd
@@ -0,0 +1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/shiny_prerendered.R
+\name{shiny_prerendered_chunk}
+\alias{shiny_prerendered_chunk}
+\title{Add code to a shiny_prerendered context}
+\usage{
+shiny_prerendered_chunk(context, code, singleton = FALSE)
+}
+\arguments{
+\item{context}{Context name (e.g. "server", "server-start")}
+
+\item{code}{Character vector with code}
+
+\item{singleton}{Collapse multiple identical versions of this
+chunk into a single chunk.}
+}
+\description{
+Programmatic equivalent to including a code chunk with a
+context in a runtime: shiny_prerendered document.
+}
diff --git a/man/shiny_prerendered_clean.Rd b/man/shiny_prerendered_clean.Rd
new file mode 100644
index 0000000..f8f82cc
--- /dev/null
+++ b/man/shiny_prerendered_clean.Rd
@@ -0,0 +1,15 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/shiny_prerendered.R
+\name{shiny_prerendered_clean}
+\alias{shiny_prerendered_clean}
+\title{Clean prerendered content for the specified Rmd input file}
+\usage{
+shiny_prerendered_clean(input)
+}
+\arguments{
+\item{input}{Rmd input file to clean content for}
+}
+\description{
+Remove the associated html file and supporting _files directory
+for a shiny_prerendered documet.
+}
diff --git a/man/shiny_prerendered_server_start_code.Rd b/man/shiny_prerendered_server_start_code.Rd
new file mode 100644
index 0000000..63c8818
--- /dev/null
+++ b/man/shiny_prerendered_server_start_code.Rd
@@ -0,0 +1,15 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/shiny_prerendered.R
+\name{shiny_prerendered_server_start_code}
+\alias{shiny_prerendered_server_start_code}
+\title{Get the server startup code for a shiny_prerendered server instance}
+\usage{
+shiny_prerendered_server_start_code(server_envir)
+}
+\arguments{
+\item{server_envir}{Shiny server environment to get code for}
+}
+\description{
+Get the server startup code for a shiny_prerendered server instance
+}
+\keyword{internal}
diff --git a/man/slidy_presentation.Rd b/man/slidy_presentation.Rd
new file mode 100644
index 0000000..13cdc1a
--- /dev/null
+++ b/man/slidy_presentation.Rd
@@ -0,0 +1,135 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/slidy_presentation.R
+\name{slidy_presentation}
+\alias{slidy_presentation}
+\title{Convert to a slidy presentation}
+\usage{
+slidy_presentation(incremental = FALSE, duration = NULL, footer = NULL,
+  font_adjustment = 0, fig_width = 8, fig_height = 6, fig_retina = 2,
+  fig_caption = TRUE, dev = "png", df_print = "default", smart = TRUE,
+  self_contained = TRUE, highlight = "default", mathjax = "default",
+  template = "default", css = NULL, includes = NULL, keep_md = FALSE,
+  lib_dir = NULL, md_extensions = NULL, pandoc_args = NULL,
+  extra_dependencies = NULL, ...)
+}
+\arguments{
+\item{incremental}{\code{TRUE} to render slide bullets incrementally. Note
+that if you want to reverse the default incremental behavior for an
+individual bullet you can precede it with \code{>}. For example:
+\emph{\code{> - Bullet Text}}}
+
+\item{duration}{Duration (in minutes) of the slide deck. This value is used
+to add a countdown timer to the slide footer.}
+
+\item{footer}{Footer text (e.g. organization name and/or copyright)}
+
+\item{font_adjustment}{Increase or decrease the default font size (e.g. -1 or
++1). You can also manually adjust the font size during the presentation
+using the 'S' (smaller) and 'B' (bigger) keys.}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_retina}{Scaling to perform for retina displays (defaults to 2, which
+currently works for all widely used retina displays). Set to \code{NULL} to
+prevent retina scaling. Note that this will always be \code{NULL} when
+\code{keep_md} is specified (this is because \code{fig_retina} relies on
+outputting HTML directly into the markdown document).}
+
+\item{fig_caption}{\code{TRUE} to render figures with captions}
+
+\item{dev}{Graphics device to use for figure output (defaults to pdf)}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{smart}{Produce typographically correct output, converting straight
+quotes to curly quotes, --- to em-dashes, -- to en-dashes, and ... to
+ellipses.}
+
+\item{self_contained}{Produce a standalone HTML file with no external
+dependencies, using data: URIs to incorporate the contents of linked
+scripts, stylesheets, images, and videos. Note that even for self contained
+documents MathJax is still loaded externally (this is necessary because of
+it's size).}
+
+\item{highlight}{Syntax highlighting style. Supported styles include
+"default", "tango", "pygments", "kate", "monochrome", "espresso",
+"zenburn", and "haddock". Pass \code{NULL} to prevent syntax highlighting.}
+
+\item{mathjax}{Include mathjax. The "default" option uses an https URL from a
+MathJax CDN. The "local" option uses a local version of MathJax (which is
+copied into the output directory). You can pass an alternate URL or pass
+\code{NULL} to exclude MathJax entirely.}
+
+\item{template}{Pandoc template to use for rendering. Pass "default" to use
+the rmarkdown package default template; pass \code{NULL} to use pandoc's
+built-in template; pass a path to use a custom template that you've
+created.  See the documentation on
+\href{http://pandoc.org/README.html}{pandoc online documentation}
+for details on creating custom templates.}
+
+\item{css}{One or more css files to include}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{keep_md}{Keep the markdown file generated by knitting.}
+
+\item{lib_dir}{Directory to copy dependent HTML libraries (e.g. jquery,
+bootstrap, etc.) into. By default this will be the name of the document with
+\code{_files} appended to it.}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+
+\item{extra_dependencies}{A LaTeX dependency \code{latex_dependency()}, a
+list of LaTeX dependencies, a character vector of LaTeX package names (e.g.
+\code{c("framed", "hyperref")}), or a named list of LaTeX package options
+with the names being package names (e.g. \code{list(hypreref =
+c("unicode=true", "breaklinks=true"), lmodern = NULL)}). It can be used to
+add custom LaTeX packages to the .tex header.}
+
+\item{...}{Additional function arguments to pass to the base R Markdown HTML
+output formatter \code{\link{html_document_base}}}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Format for converting from R Markdown to a slidy presentation.
+}
+\details{
+See the
+\href{http://rmarkdown.rstudio.com/slidy_presentation_format.html}{online
+documentation} for additional details on using the \code{slidy_presentation}
+format.
+
+For more information on markdown syntax for presentations see the
+\href{http://pandoc.org/README.html}{pandoc online documentation}.
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+# simple invocation
+render("pres.Rmd", slidy_presentation())
+
+# specify an option for incremental rendering
+render("pres.Rmd", slidy_presentation(incremental = TRUE))
+}
+
+}
diff --git a/man/tufte_handout.Rd b/man/tufte_handout.Rd
new file mode 100644
index 0000000..4c66e43
--- /dev/null
+++ b/man/tufte_handout.Rd
@@ -0,0 +1,43 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/tufte_handout.R
+\name{tufte_handout}
+\alias{tufte_handout}
+\title{Tufte handout format (PDF)}
+\usage{
+tufte_handout(fig_width = 4, fig_height = 2.5, fig_crop = TRUE,
+  dev = "pdf", highlight = "default", keep_tex = FALSE,
+  citation_package = c("none", "natbib", "biblatex"), includes = NULL,
+  md_extensions = NULL, pandoc_args = NULL)
+}
+\arguments{
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_crop}{\code{TRUE} to automatically apply the \code{pdfcrop} utility
+(if available) to pdf figures}
+
+\item{dev}{Graphics device to use for figure output (defaults to pdf)}
+
+\item{highlight}{Syntax highlighting style. Supported styles include
+"default", "tango", "pygments", "kate", "monochrome", "espresso",
+"zenburn", and "haddock". Pass \code{NULL} to prevent syntax highlighting.}
+
+\item{keep_tex}{Keep the intermediate tex file used in the conversion to PDF}
+
+\item{citation_package}{The LaTeX package to process citations, \code{natbib}
+or \code{biblatex}. Use \code{none} if neither package is to be used.}
+
+\item{includes}{Named list of additional content to include within the
+document (typically created using the \code{\link{includes}} function).}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+}
+\description{
+Template for creating a handout according to the style of
+Edward R. Tufte and Richard Feynman.
+}
diff --git a/man/word_document.Rd b/man/word_document.Rd
new file mode 100644
index 0000000..d41e93e
--- /dev/null
+++ b/man/word_document.Rd
@@ -0,0 +1,86 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/word_document.R
+\name{word_document}
+\alias{word_document}
+\title{Convert to an MS Word document}
+\usage{
+word_document(toc = FALSE, toc_depth = 3, fig_width = 5, fig_height = 4,
+  fig_caption = TRUE, df_print = "default", smart = TRUE,
+  highlight = "default", reference_docx = "default", keep_md = FALSE,
+  md_extensions = NULL, pandoc_args = NULL)
+}
+\arguments{
+\item{toc}{\code{TRUE} to include a table of contents in the output}
+
+\item{toc_depth}{Depth of headers to include in table of contents}
+
+\item{fig_width}{Default width (in inches) for figures}
+
+\item{fig_height}{Default width (in inches) for figures}
+
+\item{fig_caption}{\code{TRUE} to render figures with captions}
+
+\item{df_print}{Method to be used for printing data frames. Valid values
+include "default", "kable", "tibble", and "paged". The "default" method uses
+\code{print.data.frame}. The "kable" method uses the
+\code{\link[knitr:kable]{knitr::kable}} function. The "tibble" method uses
+the \pkg{tibble} package to print a summary of the data frame. The "paged"
+method creates a paginated HTML table (note that this method is only valid
+for formats that produce HTML). In addition
+to the named methods you can also pass an arbitrary function to be used
+for printing data frames. You can disable the df_print behavior entirely
+by setting the option \code{rmarkdown.df_print} to \code{FALSE}.}
+
+\item{smart}{Produce typographically correct output, converting straight
+quotes to curly quotes, --- to em-dashes, -- to en-dashes, and ... to
+ellipses.}
+
+\item{highlight}{Syntax highlighting style. Supported styles include
+"default", "tango", "pygments", "kate", "monochrome", "espresso",
+"zenburn", and "haddock". Pass \code{NULL} to prevent syntax highlighting.}
+
+\item{reference_docx}{Use the specified file as a style reference in
+producing a docx file. For best results, the reference docx should be a
+modified version of a docx file produced using pandoc. Pass "default"
+to use the rmarkdown default styles.}
+
+\item{keep_md}{Keep the markdown file generated by knitting.}
+
+\item{md_extensions}{Markdown extensions to be added or removed from the
+default definition or R Markdown. See the \code{\link{rmarkdown_format}} for
+additional details.}
+
+\item{pandoc_args}{Additional command line options to pass to pandoc}
+}
+\value{
+R Markdown output format to pass to \code{\link{render}}
+}
+\description{
+Format for converting from R Markdown to an MS Word document.
+}
+\details{
+See the \href{http://rmarkdown.rstudio.com/word_document_format.html}{online
+documentation} for additional details on using the \code{word_document} format.
+
+R Markdown documents can have optional metadata that is used to generate a
+document header that includes the title, author, and date. For more details
+see the documentation on R Markdown \link[=rmd_metadata]{metadata}.
+
+R Markdown documents also support citations. You can find more information on
+the markdown syntax for citations in the
+\href{http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html}{Bibliographies
+and Citations} article in the online documentation.
+}
+\examples{
+\dontrun{
+
+library(rmarkdown)
+
+# simple invocation
+render("input.Rmd", word_document())
+
+# specify an option for syntax highlighting
+render("input.Rmd", word_document(highlight = "zenburn"))
+}
+
+}
diff --git a/man/yaml_front_matter.Rd b/man/yaml_front_matter.Rd
new file mode 100644
index 0000000..686249d
--- /dev/null
+++ b/man/yaml_front_matter.Rd
@@ -0,0 +1,17 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/output_format.R
+\name{yaml_front_matter}
+\alias{yaml_front_matter}
+\title{Parse the YAML front matter from a file}
+\usage{
+yaml_front_matter(input, encoding = getOption("encoding"))
+}
+\arguments{
+\item{input}{Input file (Rmd or plain markdown)}
+
+\item{encoding}{The encoding of the input file; see \code{\link{file}}}
+}
+\description{
+Parse the YAML front matter from a file
+}
+\keyword{internal}
diff --git a/tests/shiny/01-basic-input.Rmd b/tests/shiny/01-basic-input.Rmd
new file mode 100644
index 0000000..b825e76
--- /dev/null
+++ b/tests/shiny/01-basic-input.Rmd
@@ -0,0 +1,17 @@
+---
+title: "Make sure input works"
+output: html_document
+runtime: shiny
+---
+
+```{r}
+textInput("days", "Days", 100)
+```
+
+In rmarkdown 1.7, the chunk below renders an error `object 'input' not found` instead of the expected `100`:
+
+```{r}
+renderPrint(input$days)
+```
+
+It was fixed via https://github.com/rstudio/rmarkdown/commit/67eaa7aa6.
diff --git a/tests/shiny/02-data-table.Rmd b/tests/shiny/02-data-table.Rmd
new file mode 100644
index 0000000..2b2b1bb
--- /dev/null
+++ b/tests/shiny/02-data-table.Rmd
@@ -0,0 +1,30 @@
+---
+output: html_document
+runtime: shiny
+---
+
+```{r}
+library(data.table)
+mydata <- data.table(A=c("a", "a", "b", "c", "c"), val=c(1:5))
+
+renderPlot({
+  # Works - see console for output
+  print(eval(quote( mydata[A %in% c("a", "c")] )))
+
+  # Error - see console for message
+  print(evalq( mydata[A %in% c("a", "c")] ))
+
+  # Error - see console for message
+  print( mydata[A %in% c("a", "c")] )
+
+  plot(1:3, 1:3) # Just an arbitrary plot
+})
+
+
+# All forms work fine in renderPrint
+renderPrint({
+  print(eval(quote( mydata[A %in% c("a", "c")] ))) # Works
+  print(evalq( mydata[A %in% c("a", "c")] ))       # Works
+  print( mydata[A %in% c("a", "c")] )              # Works
+})
+```
diff --git a/tests/shiny/03-rm-all.Rmd b/tests/shiny/03-rm-all.Rmd
new file mode 100644
index 0000000..84c4f42
--- /dev/null
+++ b/tests/shiny/03-rm-all.Rmd
@@ -0,0 +1,28 @@
+---
+title: 'rm(list = ls())'
+output: html_document
+runtime: shiny
+---
+
+Before rmarkdown 0.9.2, an error would occur:
+
+> Error in dir.exists: object 'resource_folder' not found
+
+To repro:
+
+```r
+devtools::install_version('rmarkdown', '0.9.2')
+```
+
+And run this document.
+
+```{r}
+rm(list = ls())
+shinyApp(
+  ui = basicPage('Hello world'), 
+  server = function(input, output) {
+  }
+)
+```
+
+This issue was fixed in https://github.com/rstudio/rmarkdown/pull/624, and again in https://github.com/rstudio/rmarkdown/commit/67eaa7aa6a.
diff --git a/tests/shiny/04-prerendered-envir.Rmd b/tests/shiny/04-prerendered-envir.Rmd
new file mode 100644
index 0000000..15a1a7f
--- /dev/null
+++ b/tests/shiny/04-prerendered-envir.Rmd
@@ -0,0 +1,14 @@
+---
+title: "Untitled"
+output: html_document
+runtime: shiny_prerendered
+---
+
+`args` should return `base::args` instead of `list(input, envir, ...)`; and `output_file` should not exist.
+
+```{r error=TRUE}
+args
+output_file
+```
+
+Originally reported at https://github.com/rstudio/rmarkdown/issues/1124.
diff --git a/tests/testthat.R b/tests/testthat.R
new file mode 100644
index 0000000..6bb1c10
--- /dev/null
+++ b/tests/testthat.R
@@ -0,0 +1,3 @@
+library(testthat)
+test_check("rmarkdown")
+
diff --git a/tests/testthat/resources/csvs/csv1.csv b/tests/testthat/resources/csvs/csv1.csv
new file mode 100644
index 0000000..e69de29
diff --git a/tests/testthat/resources/csvs/csv2.csv b/tests/testthat/resources/csvs/csv2.csv
new file mode 100644
index 0000000..e69de29
diff --git a/tests/testthat/resources/csvs/other/csv3.csv b/tests/testthat/resources/csvs/other/csv3.csv
new file mode 100644
index 0000000..e69de29
diff --git a/tests/testthat/resources/directory-refs.Rmd b/tests/testthat/resources/directory-refs.Rmd
new file mode 100644
index 0000000..c4f76a8
--- /dev/null
+++ b/tests/testthat/resources/directory-refs.Rmd
@@ -0,0 +1,13 @@
+---
+title: "Untitled"
+author: "RStudio"
+output: html_document
+resource_files:
+- nonempty
+---
+
+```{r, echo=FALSE}
+# reference empty directory
+print("./empty")
+```
+
diff --git a/tests/testthat/resources/empty.Rmd b/tests/testthat/resources/empty.Rmd
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/tests/testthat/resources/empty.Rmd
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/testthat/resources/empty.bib b/tests/testthat/resources/empty.bib
new file mode 100644
index 0000000..e69de29
diff --git a/tests/testthat/resources/empty.csl b/tests/testthat/resources/empty.csl
new file mode 100644
index 0000000..b79cae9
--- /dev/null
+++ b/tests/testthat/resources/empty.csl
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<style xmlns="http://purl.org/net/xbiblio/csl" class="note" version="1.0">
+  <info>
+  </info>
+  <citation>
+    <layout>
+    </layout>
+  </citation>
+</style>
diff --git a/tests/testthat/resources/empty.css b/tests/testthat/resources/empty.css
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/tests/testthat/resources/empty.css
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/testthat/resources/empty.csv b/tests/testthat/resources/empty.csv
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/tests/testthat/resources/empty.csv
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/testthat/resources/empty.html b/tests/testthat/resources/empty.html
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/tests/testthat/resources/empty.html
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/testthat/resources/empty.jpg b/tests/testthat/resources/empty.jpg
new file mode 100644
index 0000000..70739f9
Binary files /dev/null and b/tests/testthat/resources/empty.jpg differ
diff --git a/tests/testthat/resources/empty.js b/tests/testthat/resources/empty.js
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/tests/testthat/resources/empty.js
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/testthat/resources/empty.md b/tests/testthat/resources/empty.md
new file mode 100644
index 0000000..c0f53d7
--- /dev/null
+++ b/tests/testthat/resources/empty.md
@@ -0,0 +1,3 @@
+
+ 
+
diff --git a/tests/testthat/resources/empty.png b/tests/testthat/resources/empty.png
new file mode 100644
index 0000000..acfb57b
Binary files /dev/null and b/tests/testthat/resources/empty.png differ
diff --git a/tests/testthat/resources/empty.tsv b/tests/testthat/resources/empty.tsv
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/tests/testthat/resources/empty.tsv
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/testthat/resources/empty/empty.csv b/tests/testthat/resources/empty/empty.csv
new file mode 100644
index 0000000..e69de29
diff --git a/tests/testthat/resources/file-exists.Rmd b/tests/testthat/resources/file-exists.Rmd
new file mode 100644
index 0000000..c64497a
--- /dev/null
+++ b/tests/testthat/resources/file-exists.Rmd
@@ -0,0 +1,6 @@
+
+```{r}
+if (!file.exists("empty.csv"))
+   stop("empty.csv expected in ", getwd())
+```
+
diff --git a/tests/testthat/resources/has-css.Rmd b/tests/testthat/resources/has-css.Rmd
new file mode 100644
index 0000000..a33a33e
--- /dev/null
+++ b/tests/testthat/resources/has-css.Rmd
@@ -0,0 +1,7 @@
+---
+output: 
+  html_document:
+    css: has-image.css
+---
+
+# Hello, world.
diff --git a/tests/testthat/resources/has-image.css b/tests/testthat/resources/has-image.css
new file mode 100644
index 0000000..c9520a7
--- /dev/null
+++ b/tests/testthat/resources/has-image.css
@@ -0,0 +1,6 @@
+/* this css file refers to an image */
+body 
+{
+    background-image: url(empty.png)
+}
+
diff --git a/tests/testthat/resources/html.html b/tests/testthat/resources/html.html
new file mode 100644
index 0000000..293a376
--- /dev/null
+++ b/tests/testthat/resources/html.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+    <script src="empty.js" />
+    <link rel="stylesheet" href="empty.css" />
+</head>
+<body>
+    <p>This document tests HTML resource discovery for some simple cases.</p>
+    <img title="my picture" src="empty.png" />
+</body>
+</html>
diff --git a/tests/testthat/resources/markdown.md b/tests/testthat/resources/markdown.md
new file mode 100644
index 0000000..915c1b5
--- /dev/null
+++ b/tests/testthat/resources/markdown.md
@@ -0,0 +1,17 @@
+
+# Markdown tests
+
+This should be discovered. 
+
+![My picture](empty.png)
+
+This should, doo.
+
+<img src="empty.jpg">
+
+But not this, since this file is plain Markdown.
+
+```{r, echo=FALSE}
+read.csv(file = "empty.csv")
+```
+
diff --git a/tests/testthat/resources/nonempty/empty.csv b/tests/testthat/resources/nonempty/empty.csv
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/tests/testthat/resources/nonempty/empty.csv
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/testthat/resources/nonempty/empty.jpg b/tests/testthat/resources/nonempty/empty.jpg
new file mode 100644
index 0000000..70739f9
Binary files /dev/null and b/tests/testthat/resources/nonempty/empty.jpg differ
diff --git a/tests/testthat/resources/pdf.Rmd b/tests/testthat/resources/pdf.Rmd
new file mode 100644
index 0000000..d93f058
--- /dev/null
+++ b/tests/testthat/resources/pdf.Rmd
@@ -0,0 +1,8 @@
+---
+output: pdf_document
+bibliography: empty.bib
+csl: empty.csl
+---
+
+![empty](empty.png)
+
diff --git a/tests/testthat/resources/period.Rmd b/tests/testthat/resources/period.Rmd
new file mode 100644
index 0000000..f73579b
--- /dev/null
+++ b/tests/testthat/resources/period.Rmd
@@ -0,0 +1,10 @@
+---
+output: html_document
+---
+
+<a href=".">this dir</a>
+
+```{r}
+'.', '..'
+```
+
diff --git a/tests/testthat/resources/quotes.Rmd b/tests/testthat/resources/quotes.Rmd
new file mode 100644
index 0000000..4cc11b3
--- /dev/null
+++ b/tests/testthat/resources/quotes.Rmd
@@ -0,0 +1,14 @@
+
+Here is a filename outside an .R chunk: "empty.bib". It shouldn't be discovered.
+
+```{r}
+# this R code has a lot of strings that aren't filenames
+paste("Covariances should be a ", n, " by ", n, " matrix")
+syms <- paste("x", 1:n, sep = "")
+as.numeric(attr(eval(deriv(form, syms), envir = envir), "gradient"))
+
+# this R code has strings that are filenames
+read.csv("./empty.csv")
+read.csv('./empty.tsv')
+```
+
diff --git a/tests/testthat/resources/r-notebook.Rmd b/tests/testthat/resources/r-notebook.Rmd
new file mode 100644
index 0000000..c17db1f
--- /dev/null
+++ b/tests/testthat/resources/r-notebook.Rmd
@@ -0,0 +1,36 @@
+---
+title: "R Notebook"
+output: html_notebook
+---
+
+This is an R Markdown Notebook.
+
+```{r chunk-one}
+summary(cars)
+```
+
+This is a plot.
+
+```{r chunk-two}
+plot(cars)
+```
+
+This plot is static.
+
+![plot](tinyplot.png)
+
+This is an HTML widget.
+
+```{r chunk-three}
+if (requireNamespace("dygraphs", quietly = TRUE)) {
+  dygraphs::dygraph(nhtemp, main = "New Haven Temperatures") %>% 
+    dygraphs::dyRangeSelector(dateWindow = c("1920-01-01", "1960-01-01"))
+}
+```
+
+```{r chunk-four}
+# The R code in here is ignored; we're
+# just going to inject some arbitrary HTML.
+```
+
+For more details on using R Markdown see <http://rmarkdown.rstudio.com>.
diff --git a/tests/testthat/resources/readcsv-source.R b/tests/testthat/resources/readcsv-source.R
new file mode 100644
index 0000000..19a4951
--- /dev/null
+++ b/tests/testthat/resources/readcsv-source.R
@@ -0,0 +1,2 @@
+
+source("readcsv.R")
diff --git a/tests/testthat/resources/readcsv.R b/tests/testthat/resources/readcsv.R
new file mode 100644
index 0000000..5022c29
--- /dev/null
+++ b/tests/testthat/resources/readcsv.R
@@ -0,0 +1,2 @@
+
+read.csv("empty.csv")
diff --git a/tests/testthat/resources/readcsv.Rmd b/tests/testthat/resources/readcsv.Rmd
new file mode 100644
index 0000000..d2de810
--- /dev/null
+++ b/tests/testthat/resources/readcsv.Rmd
@@ -0,0 +1,5 @@
+
+```{r}
+source("readcsv-source.R")
+```
+
diff --git a/tests/testthat/resources/resource-files.Rmd b/tests/testthat/resources/resource-files.Rmd
new file mode 100644
index 0000000..eb6ff81
--- /dev/null
+++ b/tests/testthat/resources/resource-files.Rmd
@@ -0,0 +1,12 @@
+---
+title: "Untitled"
+author: "RStudio"
+output: html_document
+resource_files:
+- nonempty/*.csv
+- csvs
+- empty.bib
+---
+
+# Hello, world.
+
diff --git a/tests/testthat/resources/rmarkdown.Rmd b/tests/testthat/resources/rmarkdown.Rmd
new file mode 100644
index 0000000..efac1ca
--- /dev/null
+++ b/tests/testthat/resources/rmarkdown.Rmd
@@ -0,0 +1,37 @@
+---
+title: "Untitled"
+author: "RStudio"
+output: 
+  html_document:
+    css: empty.css
+    includes:
+      before_body: empty.md
+    pandoc_args: [
+      "--title-prefix", "empty.png"
+    ]
+resource_files:
+- empty.tsv
+---
+
+This document tests R Markdown resource discovery for the following content
+types:
+
+- Body includes
+- Pandoc arguments
+- Rendered/raw HTML
+- knitr child documents
+- Markdown file references
+- Manually specified resources
+
+![One pixel](empty.jpg)
+
+<iframe src="empty.html" />
+
+
+```{r, child = "empty.Rmd"}
+```
+
+```{r, echo=FALSE}
+read.csv(file = "empty.csv")
+```
+
diff --git a/tests/testthat/resources/tinyplot.png b/tests/testthat/resources/tinyplot.png
new file mode 100644
index 0000000..60b018b
Binary files /dev/null and b/tests/testthat/resources/tinyplot.png differ
diff --git a/tests/testthat/site/PageA.Rmd b/tests/testthat/site/PageA.Rmd
new file mode 100644
index 0000000..40b33a5
--- /dev/null
+++ b/tests/testthat/site/PageA.Rmd
@@ -0,0 +1,27 @@
+---
+title: "Page A"
+output: html_document
+---
+
+```{r setup, include=FALSE}
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+## Section 1
+
+```{r}
+plot(cars)
+```
+
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sapien nisl, egestas ut erat eu, egestas porttitor tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed pellentesque volutpat justo, et cursus lorem pulvinar luctus. Curabitur porta, diam a pretium egestas, dui dolor tempus sem, non facilisis turpis tortor a lectus. Morbi nec enim aliquam, eleifend libero eget, efficitur quam. Fusce dapibus elit vitae tellus hendrerit tri [...]
+
+## Section 2
+
+Nullam ullamcorper ac nunc sed tempus. Suspendisse sagittis tortor auctor magna aliquam, eu porta libero pretium. Vestibulum placerat feugiat mattis. Nulla ornare luctus quam vel iaculis. Nulla ornare justo venenatis viverra mollis. Aliquam pretium dui sed sem accumsan blandit. Integer aliquam posuere odio, ac interdum lorem egestas in. Vivamus sed est dolor. Nulla cursus blandit elit nec porta. Etiam dictum libero vel magna pulvinar convallis. Proin lacinia elementum ligula a malesuada. [...]
+
+## Section 3
+
+Sed leo tortor, sagittis sit amet lacus eu, tincidunt ornare lacus. Integer lorem lacus, facilisis nec turpis et, fermentum scelerisque felis. Pellentesque ultrices nibh lacus, ut tincidunt metus finibus quis. Nunc tincidunt eget urna a lacinia. Sed auctor lorem eu ultrices interdum. Aliquam vehicula ornare massa, ut placerat mi imperdiet et. Sed facilisis eleifend tortor, id semper nisl congue eu. Donec malesuada dolor eget ex rutrum, nec consequat erat ultrices. Maecenas iaculis leo id [...]
+
+
diff --git a/tests/testthat/site/PageB.rmd b/tests/testthat/site/PageB.rmd
new file mode 100644
index 0000000..352202b
--- /dev/null
+++ b/tests/testthat/site/PageB.rmd
@@ -0,0 +1,21 @@
+---
+title: "Page B"
+output: html_document
+---
+
+```{r setup, include=FALSE}
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+## Section 1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sapien nisl, egestas ut erat eu, egestas porttitor tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed pellentesque volutpat justo, et cursus lorem pulvinar luctus. Curabitur porta, diam a pretium egestas, dui dolor tempus sem, non facilisis turpis tortor a lectus. Morbi nec enim aliquam, eleifend libero eget, efficitur quam. Fusce dapibus elit vitae tellus hendrerit tri [...]
+
+## Section 2
+
+Nullam ullamcorper ac nunc sed tempus. Suspendisse sagittis tortor auctor magna aliquam, eu porta libero pretium. Vestibulum placerat feugiat mattis. Nulla ornare luctus quam vel iaculis. Nulla ornare justo venenatis viverra mollis. Aliquam pretium dui sed sem accumsan blandit. Integer aliquam posuere odio, ac interdum lorem egestas in. Vivamus sed est dolor. Nulla cursus blandit elit nec porta. Etiam dictum libero vel magna pulvinar convallis. Proin lacinia elementum ligula a malesuada. [...]
+
+## Section 3
+
+Sed leo tortor, sagittis sit amet lacus eu, tincidunt ornare lacus. Integer lorem lacus, facilisis nec turpis et, fermentum scelerisque felis. Pellentesque ultrices nibh lacus, ut tincidunt metus finibus quis. Nunc tincidunt eget urna a lacinia. Sed auctor lorem eu ultrices interdum. Aliquam vehicula ornare massa, ut placerat mi imperdiet et. Sed facilisis eleifend tortor, id semper nisl congue eu. Donec malesuada dolor eget ex rutrum, nec consequat erat ultrices. Maecenas iaculis leo id [...]
+
diff --git a/tests/testthat/site/PageC.md b/tests/testthat/site/PageC.md
new file mode 100644
index 0000000..5bc29e2
--- /dev/null
+++ b/tests/testthat/site/PageC.md
@@ -0,0 +1,17 @@
+---
+title: "Page C"
+output: html_document
+---
+
+## Section 1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sapien nisl, egestas ut erat eu, egestas porttitor tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed pellentesque volutpat justo, et cursus lorem pulvinar luctus. Curabitur porta, diam a pretium egestas, dui dolor tempus sem, non facilisis turpis tortor a lectus. Morbi nec enim aliquam, eleifend libero eget, efficitur quam. Fusce dapibus elit vitae tellus hendrerit tri [...]
+
+## Section 2
+
+Nullam ullamcorper ac nunc sed tempus. Suspendisse sagittis tortor auctor magna aliquam, eu porta libero pretium. Vestibulum placerat feugiat mattis. Nulla ornare luctus quam vel iaculis. Nulla ornare justo venenatis viverra mollis. Aliquam pretium dui sed sem accumsan blandit. Integer aliquam posuere odio, ac interdum lorem egestas in. Vivamus sed est dolor. Nulla cursus blandit elit nec porta. Etiam dictum libero vel magna pulvinar convallis. Proin lacinia elementum ligula a malesuada. [...]
+
+## Section 3
+
+Sed leo tortor, sagittis sit amet lacus eu, tincidunt ornare lacus. Integer lorem lacus, facilisis nec turpis et, fermentum scelerisque felis. Pellentesque ultrices nibh lacus, ut tincidunt metus finibus quis. Nunc tincidunt eget urna a lacinia. Sed auctor lorem eu ultrices interdum. Aliquam vehicula ornare massa, ut placerat mi imperdiet et. Sed facilisis eleifend tortor, id semper nisl congue eu. Donec malesuada dolor eget ex rutrum, nec consequat erat ultrices. Maecenas iaculis leo id [...]
+
diff --git a/tests/testthat/site/_site.yml b/tests/testthat/site/_site.yml
new file mode 100644
index 0000000..2d6d10d
--- /dev/null
+++ b/tests/testthat/site/_site.yml
@@ -0,0 +1,23 @@
+name: "mysite"
+output_dir: "_site"
+include: script.R
+exclude: docs.txt
+navbar:
+  title: "Navigation Bar"
+  type: default
+  left:
+    - { text: "Home", href: index.html }
+    - { text: "Page A", href: PageA.html }
+    - text: "More"
+      menu:
+        - { text: "Page B", href: PageB.html }
+        - { text: "-----------------" }
+        - { text: "Header" }
+        - { text: "Page C", href: PageC.html }
+  right:
+    - text: "GitHub"
+      href: https://github.com
+output:
+  html_document:
+    css: styles.css
+    theme: united
diff --git a/tests/testthat/site/docs.txt b/tests/testthat/site/docs.txt
new file mode 100644
index 0000000..e69de29
diff --git a/tests/testthat/site/index.Rmd b/tests/testthat/site/index.Rmd
new file mode 100644
index 0000000..ab8c608
--- /dev/null
+++ b/tests/testthat/site/index.Rmd
@@ -0,0 +1,21 @@
+---
+title: "R Markdown Website"
+output: html_document
+---
+
+```{r setup, include=FALSE}
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+## Section 1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sapien nisl, egestas ut erat eu, egestas porttitor tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed pellentesque volutpat justo, et cursus lorem pulvinar luctus. Curabitur porta, diam a pretium egestas, dui dolor tempus sem, non facilisis turpis tortor a lectus. Morbi nec enim aliquam, eleifend libero eget, efficitur quam. Fusce dapibus elit vitae tellus hendrerit tri [...]
+
+## Section 2
+
+Nullam ullamcorper ac nunc sed tempus. Suspendisse sagittis tortor auctor magna aliquam, eu porta libero pretium. Vestibulum placerat feugiat mattis. Nulla ornare luctus quam vel iaculis. Nulla ornare justo venenatis viverra mollis. Aliquam pretium dui sed sem accumsan blandit. Integer aliquam posuere odio, ac interdum lorem egestas in. Vivamus sed est dolor. Nulla cursus blandit elit nec porta. Etiam dictum libero vel magna pulvinar convallis. Proin lacinia elementum ligula a malesuada. [...]
+
+## Section 3
+
+Sed leo tortor, sagittis sit amet lacus eu, tincidunt ornare lacus. Integer lorem lacus, facilisis nec turpis et, fermentum scelerisque felis. Pellentesque ultrices nibh lacus, ut tincidunt metus finibus quis. Nunc tincidunt eget urna a lacinia. Sed auctor lorem eu ultrices interdum. Aliquam vehicula ornare massa, ut placerat mi imperdiet et. Sed facilisis eleifend tortor, id semper nisl congue eu. Donec malesuada dolor eget ex rutrum, nec consequat erat ultrices. Maecenas iaculis leo id [...]
+
diff --git a/tests/testthat/site/script.R b/tests/testthat/site/script.R
new file mode 100644
index 0000000..e69de29
diff --git a/tests/testthat/site/styles.css b/tests/testthat/site/styles.css
new file mode 100644
index 0000000..fbc765f
--- /dev/null
+++ b/tests/testthat/site/styles.css
@@ -0,0 +1,4 @@
+
+p {
+  color: red;
+}
diff --git a/tests/testthat/test-dependencies.R b/tests/testthat/test-dependencies.R
new file mode 100644
index 0000000..21c916f
--- /dev/null
+++ b/tests/testthat/test-dependencies.R
@@ -0,0 +1,157 @@
+context("dependencies")
+
+test_that("dependency merge is correct", {
+  # normalize lists for comparison by removing names and NULL elements
+  prepare_list <- function(lst) {
+    names(lst) <- NULL
+    lapply(lst, function(item) {
+      item[!sapply(item, is.null)]
+    })
+  }
+
+  # tests a dependency merge
+  test_dep_merge <- function(input, output, doeswarn = FALSE) {
+    deps <- flatten_html_dependencies(input)
+    expect_warning(
+      result <- html_dependency_resolver(deps),
+      if (doeswarn) NULL else NA
+    )
+    result <- prepare_list(result)
+    output <- prepare_list(output)
+    expect_identical(result, output)
+  }
+
+  # identity
+  test_dep_merge(
+    # input
+    list(
+      htmlDependency(
+        name = "foo",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js")),
+    # output
+    list(
+      htmlDependency(
+        name = "foo",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js")))
+
+  # don't replace a higher version with a lower one
+  test_dep_merge(
+    # input
+    list(
+      htmlDependency(
+        name = "foo",
+        version = "1.2.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js"),
+      htmlDependency(
+        name = "foo",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js")),
+    # output
+    list(
+      htmlDependency(
+        name = "foo",
+        version = "1.2.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js")))
+
+  # preserve dependency order on replacement
+  test_dep_merge(
+    # input
+    list(
+      htmlDependency(
+        name = "foo",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js"),
+      htmlDependency(
+        name = "bar",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js"),
+      htmlDependency(
+        name = "baz",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "baz.js"),
+      htmlDependency(
+        name = "bar",
+        version = "1.2.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js")),
+    # output
+    list(
+    htmlDependency(
+      name = "foo",
+      version = "1.1.0",
+      src = rmarkdown_system_file("rmd/h"),
+      script = "foo.js"),
+    htmlDependency(
+      name = "bar",
+      version = "1.2.0",
+      src = rmarkdown_system_file("rmd/h"),
+      script = "foo.js"),
+    htmlDependency(
+      name = "baz",
+      version = "1.1.0",
+      src = rmarkdown_system_file("rmd/h"),
+      script = "baz.js")))
+
+  # support nested dependency lists
+  test_dep_merge(
+    # input
+    list(
+      htmlDependency(
+        name = "bar",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js"),
+      list(
+        htmlDependency(
+          name = "baz",
+          version = "1.1.0",
+          src = rmarkdown_system_file("rmd/h"),
+          script = "baz.js"),
+        htmlDependency(
+          name = "bar",
+          version = "1.2.0",
+          src = rmarkdown_system_file("rmd/h"),
+          script = "foo.js"))),
+    # output
+    list(
+      htmlDependency(
+        name = "bar",
+        version = "1.2.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "foo.js"),
+      htmlDependency(
+        name = "baz",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "baz.js")))
+
+  # ignore knit_meta information other than html_dependency
+  test_dep_merge(
+    # input
+    list(
+      structure(list(foo = "irrelevant"), class = "irrelevant"),
+      list(
+        htmlDependency(
+          name = "baz",
+          version = "1.1.0",
+          src = rmarkdown_system_file("rmd/h"),
+          script = "baz.js"))),
+    # output
+    list(
+      htmlDependency(
+        name = "baz",
+        version = "1.1.0",
+        src = rmarkdown_system_file("rmd/h"),
+        script = "baz.js")))
+
+  })
diff --git a/tests/testthat/test-encode-decode.R b/tests/testthat/test-encode-decode.R
new file mode 100644
index 0000000..f13c7c2
--- /dev/null
+++ b/tests/testthat/test-encode-decode.R
@@ -0,0 +1,8 @@
+context("encoding")
+
+test_that("R objects can be encoded, decoded", {
+  data <- list(a = 1L, b = 2L, c = "3")
+  encoded <- base64_encode_object(data)
+  decoded <- base64_decode_object(encoded)
+  expect_equal(data, decoded)
+})
diff --git a/tests/testthat/test-formats.R b/tests/testthat/test-formats.R
new file mode 100644
index 0000000..cff8398
--- /dev/null
+++ b/tests/testthat/test-formats.R
@@ -0,0 +1,79 @@
+context("formats")
+
+test_that("formats successfully produce a document", {
+
+  skip_on_cran()
+
+  testFormat <- function(output_format, df_print = NULL) {
+    output_file <- tempfile()
+    render("test-formats.Rmd",
+           output_format = output_format,
+           output_file = output_file,
+          # output_options = ifelse(is.null(df_print), NULL, list(df_print = df_print)),
+           quiet = TRUE)
+    expect_true(file.exists(output_file))
+    output_file
+  }
+
+  testFormat(html_document(), df_print = "kable")
+  testFormat(html_notebook())
+  testFormat(html_fragment(), df_print = "tibble")
+  testFormat(html_vignette(), df_print = "tibble")
+  testFormat(ioslides_presentation(), df_print = "kable")
+  testFormat(slidy_presentation(), df_print = "kable")
+  testFormat(md_document(), df_print = "kable")
+  testFormat(pdf_document(), df_print = "kable")
+  testFormat(beamer_presentation(), df_print = "kable")
+  testFormat(word_document(), df_print = "kable")
+  testFormat(html_vignette())
+
+  if (requireNamespace("tufte", quietly = TRUE))
+    testFormat(tufte_handout())
+})
+
+test_that("documents with spaces in names can be rendered", {
+
+  skip_on_cran()
+
+  # get path to notebook
+  rmd_path <- "resources/empty.Rmd"
+
+  # attempt to write to directory with spaces
+  output_file <- "directory with spaces/r output.nb.html"
+  dir.create(dirname(output_file))
+  on.exit(unlink("directory with spaces", recursive = TRUE), add = TRUE)
+
+  # generate copy with space in name
+  with_spaces <- "directory with spaces/no content.Rmd"
+  file.copy(rmd_path, with_spaces)
+
+  output <- rmarkdown::render(with_spaces,
+                              output_format = "html_notebook",
+                              output_file = output_file,
+                              quiet = TRUE)
+
+  expect_true(file.exists(output))
+
+})
+
+test_that(
+  "setting theme, highlight or fig_retina yields an error on html_vignette",
+  {
+
+  skip_on_cran()
+
+  testFormat <- function(output_format) {
+    output_file <- tempfile()
+    expect_error(
+      render("test-formats.Rmd",
+           output_format = output_format,
+           output_file = output_file,
+           quiet = TRUE)
+    )
+  }
+
+  testFormat(html_vignette(theme = "z"))
+  testFormat(html_vignette(highlight = "z"))
+  testFormat(html_vignette(fig_retina = 2))
+
+})
diff --git a/tests/testthat/test-formats.Rmd b/tests/testthat/test-formats.Rmd
new file mode 100644
index 0000000..9d4bed0
--- /dev/null
+++ b/tests/testthat/test-formats.Rmd
@@ -0,0 +1,32 @@
+---
+title: "Untitled"
+output: 
+  html_document:
+    md_extensions: -autolink_bare_uris
+---
+
+## Section One
+
+```{r}
+summary(cars)
+```
+
+## Section Two
+
+You can also embed plots, for example:
+
+```{r, echo=FALSE}
+plot(cars)
+```
+
+Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.
+
+## Section Three
+
+You can also print data frames
+
+```{r}
+mtcars
+```
+
+
diff --git a/tests/testthat/test-htmlparse.R b/tests/testthat/test-htmlparse.R
new file mode 100644
index 0000000..fcc2874
--- /dev/null
+++ b/tests/testthat/test-htmlparse.R
@@ -0,0 +1,78 @@
+context("HTML parsing")
+
+accumulated <- data.frame(tag = c(), attribute = c(), value = c())
+
+reset_accumulator <- function() {
+  accumulated <<- data.frame(tag = c(), attribute = c(), value = c())
+}
+
+html_accumulator <- function(tag, att, val, idx) {
+  accumulated <<- rbind(accumulated, data.frame(
+    tag = tag,
+    attribute = att,
+    value = val,
+    stringsAsFactors = FALSE))
+}
+
+test_that("different attribute quoting styles are supported", {
+  call_resource_attrs(paste(
+    "<img src='123'/>",
+    "<img src=\"456\"/>"), html_accumulator)
+  expect_equal(accumulated, data.frame(
+    tag = c("img", "img"),
+    attribute = c("src", "src"),
+    value = c("123", "456"),
+    stringsAsFactors = FALSE))
+  reset_accumulator()
+})
+
+test_that("irrelevant white space is ignored", {
+  call_resource_attrs(paste(
+    "<  img src =   \n",
+    "        \t '123'\n",
+    "        \t value ='abc'  />",
+    "<link href=    '456'>"), html_accumulator)
+  expect_equal(accumulated, data.frame(
+    tag = c("img", "link"),
+    attribute = c("src", "href"),
+    value = c("123", "456"),
+    stringsAsFactors = FALSE))
+  reset_accumulator()
+})
+
+test_that("common resource types are found in a simple document", {
+  call_resource_attrs(paste(
+    "<!DOCTYPE html>\n",
+    "<HTML>\n",
+    "<HEAD>\n",
+    "  <SCRIPT SRC=\"foo.js\"></SCRIPT>\n",
+    "  <LINK REL=\"stylesheet\" HREF=\"bar.css\"/>\n",
+    "</HEAD>\n",
+    "<BODY>\n",
+    "  <IMG SRC=\"baz.png\"/>\n",
+    "  <IFRAME SRC=\"quux.html\"/>\n",
+    "</BODY>\n",
+    "</HTML>\n"), html_accumulator)
+  expect_equal(accumulated, data.frame(
+    tag = c("script", "link", "img", "iframe"),
+    attribute = c("src", "href", "src", "src"),
+    value = c("foo.js", "bar.css", "baz.png", "quux.html"),
+    stringsAsFactors = FALSE))
+  reset_accumulator()
+})
+
+test_that("resources referenced in CSS files are discovered", {
+  call_css_resource_attrs(paste(
+    "body {\n",
+    "  background-image: url('foo.png');\n",
+    "}\n",
+    "p {\n",
+    "  background-image: url(bar.png), url(\"baz.png\");\n",
+    "}\n)"), html_accumulator)
+  expect_equal(accumulated, data.frame(
+    tag = c("css", "css", "css"),
+    attribute = c("url", "url", "url"),
+    value = c("foo.png", "bar.png", "baz.png"),
+    stringsAsFactors = FALSE))
+  reset_accumulator()
+})
diff --git a/tests/testthat/test-ioslides.R b/tests/testthat/test-ioslides.R
new file mode 100644
index 0000000..df759b1
--- /dev/null
+++ b/tests/testthat/test-ioslides.R
@@ -0,0 +1,185 @@
+
+context("ioslides")
+
+.generate_markdown_for_test <- function() {
+
+  c("# Header1\n",
+    "## Header2\n",
+    "### Header3\n",
+    "\nTEXT HERE\n",
+    "## Header2 again\n",
+    "### Header3 again\n",
+    "\nTEXT HERE\n"
+  )
+
+
+}
+
+mock_markdown <- function(mdtext = NULL,  outputdir = NULL, ... ) {
+  # create input file
+  mdfile <- tempfile(pattern = "mock_XXXXX",
+                     tmpdir = outputdir,
+                     fileext = ".Rmd")
+  cat(mdtext, file = mdfile, sep = "\n", append = FALSE)
+
+  # output file name
+  outfile <- basename(
+    tempfile(pattern = "mock_XXXXX",
+             tmpdir = outputdir,
+             fileext = ".html"
+    )
+  )
+  # convert
+  output <- capture.output(
+    render(mdfile,
+           output_dir = outputdir,
+           output_file = outfile,
+           ioslides_presentation(...)
+    )
+  )
+
+  # read in output
+  html_file <- readLines(file.path(outputdir, outfile))
+
+  # return structure for testing properties of
+  invisible(structure(
+    list(
+      output = output,
+      html_file = html_file
+      ),
+    class = "mocked")
+    )
+}
+
+test_ioslides_presentation <- function() {
+
+  skip_on_cran()
+
+  outputdir <- tempfile()
+  dir.create(outputdir)
+  on.exit(unlink(outputdir), add = TRUE)
+
+  # Generate mock md file
+  mdtext <- .generate_markdown_for_test()
+  mock2 <- mock_markdown(mdtext = mdtext, outputdir = outputdir)
+
+  # test argument passing to pandoc
+  expect_true(any(grepl("--slide-level 2", paste(mock2$output), fixed = TRUE)))
+
+  # test status of headers in resulting file
+  # Header3 should not be a slide header
+  html_file <- mock2$html_file
+  header_lines <- c(
+    any(grepl("<h2>Header1</h2>", html_file, fixed = TRUE)),
+    any(grepl("<h2>Header2</h2>", html_file, fixed = TRUE)),
+    any(grepl("<h3>Header3</h3>", html_file, fixed = TRUE)),
+    any(grepl("<h2>Header2 again</h2>", html_file, fixed = TRUE)),
+    any(grepl("<h3>Header3 again</h3>", html_file, fixed = TRUE))
+  )
+  expect_true(all(header_lines))
+
+  # test status of css slide class
+  # Only header 1 have slide class with a level
+  header_classes <- c(
+    any(grepl("level1.*Header1", html_file))
+  )
+  expect_true(header_classes)
+  # but not level 2 and 3
+  header_classes <- c(
+    any(grepl("level2.*Header2", html_file)),
+    any(grepl("level3.*Header3", html_file))
+  )
+  expect_false(any(header_classes))
+
+  mock3 <- mock_markdown(mdtext = mdtext, outputdir = outputdir, slide_level = 3)
+  # Place the header 3 as title slide
+  rout3 <- mock3$output
+
+  # test argument passing to pandoc
+  expect_true(any(grepl("--slide-level 3", paste(rout3), fixed = TRUE)))
+
+  # test status of headers in resulting file
+  # Header3 should be a slide header
+  html_file <- mock3$html_file
+  header_lines <- c(
+    any(grepl("<h2>Header1</h2>", html_file, fixed = TRUE)),
+    any(grepl("<h2>Header2</h2>", html_file, fixed = TRUE)),
+    any(grepl("<h2>Header3</h2>", html_file, fixed = TRUE)),
+    any(grepl("<h2>Header2 again</h2>", html_file, fixed = TRUE)),
+    any(grepl("<h2>Header3 again</h2>", html_file, fixed = TRUE))
+  )
+  expect_true(all(header_lines))
+
+  # test status of css slide class
+  # Header 1 and header 2 have slide class with a level
+  header_classes <- c(
+    any(grepl("level1.*Header1", html_file)),
+    any(grepl("level2.*Header2", html_file))
+  )
+  expect_true(all(header_classes))
+  # but not level 3
+  header_classes <- c(
+    any(grepl("level3.*Header3", html_file))
+  )
+  expect_false(header_classes)
+
+}
+
+test_that("test_ioslides_presentation", test_ioslides_presentation())
+
+test_ioslides_presentation_css <- function() {
+
+  skip_on_cran()
+
+  outputdir <- tempfile()
+  dir.create(outputdir)
+  on.exit(unlink(outputdir), add = TRUE)
+
+  # Generate mock md file for data-background
+  mdtext <- c("# Slide One\n",
+              "## Slide Two {data-background=#CCC}\n",
+              "## Slide Three {data-background=img/test.png}\n",
+              "# Slide Four {data-background=#ABCDEF}\n"
+              )
+  mock <- mock_markdown(mdtext = mdtext, outputdir = outputdir, self_contained = FALSE)
+  html <- mock$html_file
+
+  slide_lines <-
+    c(any(grepl('<slide[^>]*class="[^"]*\\bsegue\\b[^"]*".*<h2>Slide One</h2>', html, perl = TRUE))
+    ## separated to be order agnostic
+    , any(grepl('<slide[^>]*class="[^"]*\\bnobackground\\b[^"]*".*<h2>Slide Two</h2>', html, perl = TRUE))
+    , any(grepl('<slide[^>]*class="[^"]*\\bfill\\b[^"]*".*<h2>Slide Two</h2>', html, perl = TRUE))
+    , any(grepl('<slide[^>]*style="background-color: #CCC;".*<h2>Slide Two</h2>', html, perl = TRUE))
+
+    ## separated to be order agnostic - within values of attributes also (hence [^"]*)
+    , any(grepl('<slide[^>]*class="[^"]*\\bnobackground\\b[^"]*".*<h2>Slide Two</h2>', html, perl = TRUE))
+    , any(grepl('<slide[^>]*class="[^"]*\\bfill\\b[^"]*".*<h2>Slide Two</h2>', html, perl = TRUE))
+    , any(grepl('<slide[^>]*style="[^"]*background-image: url\\(img/test.png\\);[^"]*".*<h2>Slide Three</h2>', html))
+    , any(grepl('<slide[^>]*style="[^"]*background-size: contain;[^"]*".*<h2>Slide Three</h2>', html))
+
+    ## separated to be order agnostic
+    , any(grepl('<slide[^>]*class="[^"]*\\bsegue\\b[^"]*".*<h2>Slide Four</h2>', html, perl = TRUE))
+    , any(grepl('<slide[^>]*class="[^"]*\\bnobackground\\b[^"]*".*<h2>Slide Four</h2>', html, perl = TRUE))
+    , any(grepl('<slide[^>]*class="[^"]*\\bfill\\b[^"]*".*<h2>Slide Four</h2>', html, perl = TRUE))
+    , any(grepl('<slide[^>]*class="[^"]*\\blevel1\\b[^"]*".*<h2>Slide Four</h2>', html, perl = TRUE))
+    , any(grepl('<slide[^>]*style="background-color: #ABCDEF;".*<h2>Slide Four</h2>', html, perl = TRUE))
+
+  )
+  expect_true(all(slide_lines), info = "slide lines - style attribute")
+
+  # Generate mock md file for data-background
+  plot <- file.path(getwd(), 'resources', 'tinyplot.png')
+  mdtext <- c(paste0("## BG Slide {data-background=", plot, "}\n"))
+  mock <- mock_markdown(mdtext = mdtext, outputdir = outputdir, self_contained = TRUE)
+  html <- mock$html_file
+
+  slide_lines <-
+    c(any(grepl('<slide[^>]*style="[^"]*background-image: url\\(data:image/png;base64,[^\\)]*);[^"]*".*<h2>BG Slide</h2>', html))
+      ## still separate
+    , any(grepl('<slide[^>]*style="[^"]*background-size: contain;[^"]*".*<h2>BG Slide</h2>', html))
+    )
+  expect_true(all(slide_lines), info = "slide lines - self contained image")
+}
+
+
+test_that("ioslides presentation is styled", test_ioslides_presentation_css())
diff --git a/tests/testthat/test-notebook.R b/tests/testthat/test-notebook.R
new file mode 100644
index 0000000..15ea9c2
--- /dev/null
+++ b/tests/testthat/test-notebook.R
@@ -0,0 +1,109 @@
+context("notebook")
+
+# expect that the default evaluate hook points to the evaluate package
+expect_default_evaluate_hook <- function() {
+  evaluate <- knitr::knit_hooks$get("evaluate")
+  expect_identical(environment(evaluate), asNamespace("evaluate"))
+}
+
+test_that("an example R Notebook document can be rendered and parsed", {
+  skip_on_cran()
+
+  # check initial status of hook
+  expect_default_evaluate_hook()
+
+  # generate the file
+  path <- test_path("resources/r-notebook.Rmd")
+  file <- tempfile(fileext = ".nb.html")
+  on.exit(unlink(file), add = TRUE)
+  rmarkdown::render(path, output_file = file, quiet = TRUE)
+
+  # confirm the evaluate hook has been restored post-render
+  expect_default_evaluate_hook()
+
+  # if running interactively, try running the following code to open the
+  # generated document -- in RStudio, you should see the source .Rmd opened,
+  # with outputs populated in the editor view
+  #
+  #     file.edit(file)
+
+  # try parsing and validating the parse format
+  parsed <- parse_html_notebook(file)
+  expect_identical(parsed$rmd, read_lines_utf8(path, encoding = "UTF-8"))
+})
+
+test_that("a custom output_source can be used on render", {
+  skip_on_cran()
+
+  # set up output_source hook
+  png_path <- normalizePath(testthat::test_path("resources/tinyplot.png"), winslash = "/")
+  output_options <- list(output_source = function(code, context, ...) {
+
+    label <- context$label
+
+    if (label == "chunk-one") {
+      expect_true(context$chunk.index == 1)
+      output <- summary(cars)
+      return(list(
+        html_notebook_output_code("summary(cars)"),
+        output
+      ))
+    }
+
+    if (label == "chunk-two") {
+      expect_true(context$chunk.index == 2)
+      return(html_notebook_output_img(png_path))
+    }
+
+    if (label == "chunk-three") {
+      expect_true(context$chunk.index == 3)
+      if (requireNamespace("dygraphs", quietly = TRUE)) {
+
+        library(dygraphs)
+        widget <- dygraph(nhtemp, main = "New Haven Temperatures") %>%
+          dyRangeSelector(dateWindow = c("1920-01-01", "1960-01-01"))
+
+        return(list(
+          html_notebook_output_code("# This is a fake comment!"),
+          widget
+        ))
+      }
+
+      return(html_notebook_output_html("<!-- dygraphs not installed -->"))
+    }
+
+    if (label == "chunk-four") {
+      expect_true(context$chunk.index == 4)
+      styles <- list(
+        "background-color" = "#4AF",
+        "width" = "100px",
+        "height" = "100px",
+        "border" = "1px solid black",
+        "box-shadow" = "0 0 10px #ACE"
+      )
+
+      pasted <- paste(names(styles), styles, sep = ": ", collapse = "; ")
+      format <- '<div style="%s"><pre style="margin-top: 30px; text-align: center;">Box!</pre></div>'
+      rendered <- sprintf(format, pasted)
+      return(html_notebook_output_html(rendered))
+    }
+
+  })
+
+  input_file <- testthat::test_path("resources/r-notebook.Rmd")
+  # output_file <- "~/Desktop/output.nb.html"
+  output_file <- tempfile(fileext = ".nb.html")
+  on.exit(unlink(output_file), add = TRUE)
+
+  # check initial status of hook
+  expect_default_evaluate_hook()
+
+  render(input_file, output_options = output_options, output_file = output_file, quiet = TRUE)
+
+  # confirm the evaluate hook has been restored post-render
+  expect_default_evaluate_hook()
+
+  # parse notebook
+  parsed <- parse_html_notebook(output_file)
+
+})
diff --git a/tests/testthat/test-params.R b/tests/testthat/test-params.R
new file mode 100644
index 0000000..16a14b7
--- /dev/null
+++ b/tests/testthat/test-params.R
@@ -0,0 +1,90 @@
+context("params")
+
+test_that("setting of params works", {
+
+  skip_on_cran()
+
+  params_sample <- '---\ntitle: "test"\noutput: html_document\nparams:\n  field1:\n    value: "defaulthere"\n  field2: null\n  field3: \n  field4: NULL\n---'
+
+  # No overrides
+  params <- knit_params_get(params_sample, NULL)
+  expect_equal(params$field1, "defaulthere")
+  expect_null(params$field2)
+  expect_null(params$field3)
+  expect_null(params$field4)
+
+  # With overrides
+  params <- knit_params_get(params_sample, list(field1 = "new value"))
+  expect_equal(params$field1, "new value")
+
+  # With overrides for NULL/null/empty params
+  params <- knit_params_get(params_sample, list(field2 = NULL,field4 = "value"))
+  expect_null(params$field2)
+  expect_equal(params$field4, "value")
+
+  # Invalid
+  expect_error(knit_params_get(params_sample, "new value"))
+
+  # Params not declared in YAML
+  expect_error(knit_params_get(params_sample, list(field5 = "a",field6 = "b",field7 = NULL)), regexp = "field5, field6, field7$")
+})
+
+test_that("params render their UI", {
+
+  skip_on_cran()
+
+  # file input is always NULL
+  ui <- params_value_to_ui(shiny::fileInput, "anything", TRUE)
+  expect_null(ui)
+
+  # text input is a pass-through
+  ui <- params_value_to_ui(shiny::textInput, "some char", TRUE)
+  expect_equal(ui, "some char")
+
+  # Date gets converted to char
+  dat <- Sys.time()
+  ui <- params_value_to_ui(shiny::textInput, dat, TRUE)
+  expect_equal(ui, as.character(dat))
+
+  # NULLs get massaged for numeric/slider
+  ui <- params_value_to_ui(shiny::numericInput, NULL, TRUE)
+  expect_equal(ui, 0)
+  ui <- params_value_to_ui(shiny::sliderInput, NULL, TRUE)
+  expect_equal(ui, 0)
+
+  # Everything else is a passthrough
+  myobj <- list(a = 123, b = NULL, c = "huh")
+  ui <- params_value_to_ui(NULL, myobj, TRUE)
+  expect_equal(ui, myobj)
+})
+
+test_that("params hidden w/o show_default", {
+
+  skip_on_cran()
+
+  # file input is always NULL
+  ui <- params_value_to_ui(shiny::fileInput, "anything", FALSE)
+  expect_null(ui)
+
+  # text input suppressed
+  ui <- params_value_to_ui(shiny::textInput, "some char", FALSE)
+  expect_equal(ui, NULL)
+
+  # Date gets scrubbed
+  ui <- params_value_to_ui(shiny::textInput, dat, FALSE)
+  expect_equal(ui, NULL)
+
+  # Numeric -> 0
+  ui <- params_value_to_ui(shiny::numericInput, 13, FALSE)
+  expect_equal(ui, 0)
+
+  # Slider -> 0
+  # TODO: should this be MIN?
+  ui <- params_value_to_ui(shiny::sliderInput, 13, FALSE)
+  expect_equal(ui, 0)
+
+  # Everything else is scrubbed
+  myobj <- list(a = 123, b = NULL, c = "huh")
+  ui <- params_value_to_ui(function(){}, myobj, FALSE)
+  expect_equal(ui, NULL)
+})
diff --git a/tests/testthat/test-resources.R b/tests/testthat/test-resources.R
new file mode 100644
index 0000000..0faea0c
--- /dev/null
+++ b/tests/testthat/test-resources.R
@@ -0,0 +1,214 @@
+context("resource discovery")
+
+test_that("R Markdown resource discovery finds expected resources", {
+
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/rmarkdown.Rmd")
+  expected <- data.frame(
+    path = c("empty.md", "empty.png", "empty.tsv", "empty.Rmd", "empty.css",
+             "empty.jpg", "empty.html", "empty.csv"),
+    explicit = c(FALSE, FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE),
+    web      = c(FALSE, FALSE, FALSE, FALSE, TRUE,  TRUE,  TRUE,  FALSE),
+    stringsAsFactors = FALSE)
+
+  # sort by filename to avoid errors arising from file ordering -- we don't
+  # really care what order these come back in
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+
+  expect_equal(resources, expected)
+})
+
+
+test_that("HTML resource discovery finds expected resources", {
+
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/html.html")
+  expected <- data.frame(
+    path = c("empty.js", "empty.css", "empty.png"),
+    explicit = c(FALSE, FALSE, FALSE),
+    web      = c(TRUE,  TRUE,  TRUE),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+test_that("Vanilla Markdown resource discovery finds expected resources", {
+
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/markdown.md")
+  expected <- data.frame(
+    path = c("empty.png", "empty.jpg"),
+    explicit = c(FALSE, FALSE),
+    web      = c(TRUE,  TRUE ),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+
+test_that("PDF-specific resources are discovered", {
+
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/pdf.Rmd")
+  expected <- data.frame(
+    path = c("empty.bib", "empty.csl", "empty.png"),
+    explicit = c(FALSE, FALSE, FALSE),
+    web      = c(FALSE, FALSE, TRUE ),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+
+test_that("bare relative directory references are ignored", {
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/period.Rmd")
+  expect_equal(nrow(resources), 0)
+})
+
+
+test_that("dependencies in .R files are recursively discovered", {
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/readcsv.Rmd")
+  expected <- data.frame(
+    path = c("empty.csv", "readcsv.R", "readcsv-source.R"),
+    explicit = c(FALSE, FALSE, FALSE),
+    web      = c(FALSE, FALSE, FALSE),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+test_that("implicitly discovered directories are ignored", {
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/directory-refs.Rmd")
+  expected <- data.frame(
+    path = c("nonempty/empty.csv", "nonempty/empty.jpg"),
+    explicit = c(TRUE, TRUE),
+    web      = c(FALSE, TRUE),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+test_that("resource_files use cases all work", {
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/resource-files.Rmd")
+  expected <- data.frame(
+    path = c("nonempty/empty.csv", "csvs/csv1.csv", "csvs/csv2.csv", "csvs/other/csv3.csv", "empty.bib"),
+    explicit = c(TRUE, TRUE, TRUE, TRUE, TRUE),
+    web      = c(FALSE, FALSE, FALSE, FALSE, FALSE),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+test_that("dependencies can be discovered on .R files directly", {
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/readcsv-source.R")
+  expected <- data.frame(
+    path = c("empty.csv", "readcsv.R"),
+    explicit = c(FALSE, FALSE),
+    web      = c(FALSE, FALSE),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+test_that("filenames with shell characters can use relative resource paths", {
+  skip_on_cran()
+
+  # save current working directory
+  oldwd <- getwd()
+  on.exit(setwd(oldwd), add = TRUE)
+
+  file.rename("resources/file-exists.Rmd", "resources/file exists.Rmd")
+  on.exit(file.rename("resources/file exists.Rmd", "resources/file-exists.Rmd"), add = TRUE)
+
+  # render the file (contains an expression that stops if its resource is not
+  # present)
+  capture.output(output_file <- render("resources/file exists.Rmd"))
+  on.exit(unlink(output_file), add = TRUE)
+})
+
+test_that("resources not deleted when filenames contain shell characters", {
+  skip_on_cran()
+
+  # save current working directory
+  oldwd <- setwd("resources")
+  on.exit(setwd(oldwd), add = TRUE)
+
+  file.rename("file-exists.Rmd", "file exists.Rmd")
+  capture.output(unlink(render("file exists.Rmd")))
+  file.rename("file exists.Rmd", "file-exists.Rmd")
+  expect_true(file.exists("empty.csv"))
+})
+
+test_that("empty quoted strings don't confuse resource discovery", {
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/quotes.Rmd")
+  expected <- data.frame(
+    path = c("empty.csv", "empty.tsv"),
+    explicit = c(FALSE, FALSE),
+    web      = c(FALSE, FALSE),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+test_that("resources are discovered in CSS files", {
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/has-css.Rmd")
+  expected <- data.frame(
+    path = c("empty.png", "has-image.css"),
+    explicit = c(FALSE, FALSE),
+    web      = c(TRUE, TRUE),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
+
+test_that("resources are discovered in notebook files", {
+  skip_on_cran()
+
+  resources <- find_external_resources("resources/r-notebook.Rmd")
+  expected <- data.frame(
+    path = c("tinyplot.png"),
+    explicit = c(FALSE),
+    web      = c(TRUE),
+    stringsAsFactors = FALSE)
+
+  resources <- as.data.frame(resources[order(resources[[1]]), , drop = FALSE])
+  expected <- as.data.frame(expected[order(expected[[1]]), , drop = FALSE])
+  expect_equal(resources, expected)
+})
diff --git a/tests/testthat/test-site.R b/tests/testthat/test-site.R
new file mode 100644
index 0000000..b497c47
--- /dev/null
+++ b/tests/testthat/test-site.R
@@ -0,0 +1,35 @@
+context("site")
+
+test_that("render_site", {
+
+  skip_on_cran()
+
+  # copy our demo site to a tempdir
+  site_dir <- tempfile()
+  dir.create(site_dir)
+  files <- c("_site.yml", "index.Rmd", "PageA.Rmd",
+             "PageB.rmd", "PageC.md", "styles.css",
+             "script.R", "docs.txt")
+  file.copy(file.path("site", files), site_dir, recursive = TRUE)
+
+  # render it
+  capture.output(render_site(site_dir))
+
+  # did the html files get rendered and the css get copied?
+  html_files <- c("index.html", "PageA.html", "PageB.html", "PageC.html")
+  html_files <- file.path(site_dir, "_site", html_files)
+  expect_true(all(file.exists(html_files)))
+
+  # moved directories
+  moved <- c("site_libs", "PageA_files")
+  expect_true(all(!file.exists(file.path(site_dir, moved))))
+  expect_true(all(file.exists(file.path(site_dir, "_site", moved))))
+
+  # respected includes
+  included <- "script.R"
+  expect_true(all(file.exists(file.path(site_dir, "_site", included))))
+
+  # respected excluded
+  excluded <- "docs.txt"
+  expect_true(all(!file.exists(file.path(site_dir, "_site", excluded))))
+})

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/r-cran-rmarkdown.git



More information about the debian-med-commit mailing list