[r-cran-dt] 01/02: New upstream version 0.2

Andreas Tille tille at debian.org
Tue Jan 2 08:10:55 UTC 2018


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

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

commit 371cccc96621d6587a67d21c9923623f87cc509b
Author: Andreas Tille <tille at debian.org>
Date:   Tue Jan 2 09:02:48 2018 +0100

    New upstream version 0.2
---
 DESCRIPTION                                        |  42 +
 LICENSE                                            | 315 +++++++
 MD5                                                | 192 +++++
 NAMESPACE                                          |  40 +
 NEWS.md                                            | 100 +++
 R/datatables.R                                     | 584 +++++++++++++
 R/format.R                                         | 289 +++++++
 R/package.R                                        |   8 +
 R/shiny.R                                          | 524 ++++++++++++
 R/utils.R                                          |  33 +
 README.md                                          |  21 +
 build/vignette.rds                                 | Bin 0 -> 214 bytes
 inst/doc/DT.Rmd                                    |  26 +
 inst/doc/DT.html                                   | 127 +++
 inst/examples/DT-click/DESCRIPTION                 |   6 +
 inst/examples/DT-click/Readme.md                   |   5 +
 .../rsconnect/shinyapps.io/yihui/DT-click.dcf      |   9 +
 inst/examples/DT-click/server.R                    |  29 +
 inst/examples/DT-click/ui.R                        |  11 +
 inst/examples/DT-filter/DESCRIPTION                |   6 +
 inst/examples/DT-filter/Readme.md                  |   1 +
 .../rsconnect/shinyapps.io/yihui/DT-filter.dcf     |   9 +
 inst/examples/DT-filter/server.R                   |  17 +
 inst/examples/DT-filter/ui.R                       |   8 +
 inst/examples/DT-info/DESCRIPTION                  |   6 +
 inst/examples/DT-info/Readme.md                    |   5 +
 .../rsconnect/shinyapps.io/yihui/DT-info.dcf       |   9 +
 inst/examples/DT-info/server.R                     |  61 ++
 inst/examples/DT-info/ui.R                         |  19 +
 inst/examples/DT-proxy/DESCRIPTION                 |   6 +
 inst/examples/DT-proxy/Readme.md                   |   4 +
 .../rsconnect/shinyapps.io/yihui/DT-proxy.dcf      |   9 +
 inst/examples/DT-proxy/server.R                    |  43 +
 inst/examples/DT-proxy/ui.R                        |  25 +
 inst/examples/DT-radio/DESCRIPTION                 |   6 +
 inst/examples/DT-radio/Readme.md                   |   3 +
 inst/examples/DT-radio/app.R                       |  36 +
 .../rsconnect/shinyapps.io/yihui/DT-radio.dcf      |   9 +
 inst/examples/DT-reload/app.R                      |  31 +
 inst/examples/DT-rows/DESCRIPTION                  |   6 +
 inst/examples/DT-rows/Readme.md                    |   9 +
 .../rsconnect/shinyapps.io/yihui/DT-rows.dcf       |   9 +
 inst/examples/DT-rows/server.R                     |  29 +
 inst/examples/DT-rows/ui.R                         |  23 +
 inst/examples/DT-scroller/DESCRIPTION              |   6 +
 inst/examples/DT-scroller/Readme.md                |   1 +
 .../rsconnect/shinyapps.io/yihui/DT-scroller.dcf   |   9 +
 inst/examples/DT-scroller/server.R                 |  25 +
 inst/examples/DT-scroller/ui.R                     |  10 +
 inst/examples/DT-scroller/www/large.txt            |   1 +
 inst/examples/DT-selection/DESCRIPTION             |   6 +
 inst/examples/DT-selection/Readme.md               |   9 +
 .../rsconnect/shinyapps.io/yihui/DT-selection.dcf  |   9 +
 inst/examples/DT-selection/server.R                | 180 ++++
 inst/examples/DT-selection/ui.R                    | 187 +++++
 inst/examples/DT-shiny/server.R                    |   7 +
 inst/examples/DT-shiny/ui.R                        |  17 +
 inst/examples/ajax-shiny.R                         |  23 +
 inst/examples/datatable.R                          |  25 +
 inst/htmlwidgets/datatables.js                     | 923 +++++++++++++++++++++
 inst/htmlwidgets/datatables.yaml                   |   5 +
 .../AutoFill/css/autoFill.bootstrap.min.css        |   1 +
 .../AutoFill/css/autoFill.bootstrap4.min.css       |   1 +
 .../AutoFill/css/autoFill.dataTables.min.css       |   1 +
 .../AutoFill/css/autoFill.foundation.min.css       |   1 +
 .../AutoFill/css/autoFill.jqueryui.min.css         |   1 +
 .../AutoFill/css/autoFill.semanticui.min.css       |   1 +
 .../AutoFill/js/autoFill.bootstrap.min.js          |   5 +
 .../AutoFill/js/autoFill.bootstrap4.min.js         |   5 +
 .../AutoFill/js/autoFill.foundation.min.js         |   5 +
 .../AutoFill/js/autoFill.jqueryui.min.js           |   6 +
 .../AutoFill/js/autoFill.semanticui.min.js         |   5 +
 .../AutoFill/js/dataTables.autoFill.min.js         |  23 +
 .../Buttons/css/buttons.bootstrap.min.css          |   1 +
 .../Buttons/css/buttons.bootstrap4.min.css         |   1 +
 .../Buttons/css/buttons.dataTables.min.css         |   1 +
 .../Buttons/css/buttons.foundation.min.css         |   1 +
 .../Buttons/css/buttons.jqueryui.min.css           |   1 +
 .../Buttons/css/buttons.semanticui.min.css         |   1 +
 .../Buttons/js/buttons.bootstrap.min.js            |   6 +
 .../Buttons/js/buttons.bootstrap4.min.js           |   6 +
 .../Buttons/js/buttons.colVis.min.js               |   5 +
 .../Buttons/js/buttons.flash.min.js                |  29 +
 .../Buttons/js/buttons.foundation.min.js           |   6 +
 .../Buttons/js/buttons.html5.min.js                |  26 +
 .../Buttons/js/buttons.jqueryui.min.js             |   6 +
 .../Buttons/js/buttons.print.min.js                |   4 +
 .../Buttons/js/buttons.semanticui.min.js           |   6 +
 .../Buttons/js/dataTables.buttons.min.js           |  35 +
 .../datatables-extensions/Buttons/js/jszip.min.js  |  14 +
 .../Buttons/js/pdfmake.min.js                      |  22 +
 .../datatables-extensions/Buttons/js/vfs_fonts.js  |   1 +
 .../Buttons/swf/flashExport.swf                    | Bin 0 -> 64573 bytes
 .../ColReorder/css/colReorder.bootstrap.min.css    |   1 +
 .../ColReorder/css/colReorder.bootstrap4.min.css   |   1 +
 .../ColReorder/css/colReorder.dataTables.min.css   |   1 +
 .../ColReorder/css/colReorder.foundation.min.css   |   1 +
 .../ColReorder/css/colReorder.jqueryui.min.css     |   1 +
 .../ColReorder/css/colReorder.semanticui.min.css   |   1 +
 .../ColReorder/js/dataTables.colReorder.min.js     |  27 +
 .../css/fixedColumns.bootstrap.min.css             |   1 +
 .../css/fixedColumns.bootstrap4.min.css            |   1 +
 .../css/fixedColumns.dataTables.min.css            |   1 +
 .../css/fixedColumns.foundation.min.css            |   1 +
 .../FixedColumns/css/fixedColumns.jqueryui.min.css |   1 +
 .../css/fixedColumns.semanticui.min.css            |   1 +
 .../FixedColumns/js/dataTables.fixedColumns.min.js |  35 +
 .../FixedHeader/css/fixedHeader.bootstrap.min.css  |   1 +
 .../FixedHeader/css/fixedHeader.bootstrap4.min.css |   1 +
 .../FixedHeader/css/fixedHeader.dataTables.min.css |   1 +
 .../FixedHeader/css/fixedHeader.foundation.min.css |   1 +
 .../FixedHeader/css/fixedHeader.jqueryui.min.css   |   1 +
 .../FixedHeader/css/fixedHeader.semanticui.min.css |   1 +
 .../FixedHeader/js/dataTables.fixedHeader.min.js   |  17 +
 .../KeyTable/css/keyTable.bootstrap.min.css        |   1 +
 .../KeyTable/css/keyTable.bootstrap4.min.css       |   1 +
 .../KeyTable/css/keyTable.dataTables.min.css       |   1 +
 .../KeyTable/css/keyTable.foundation.min.css       |   1 +
 .../KeyTable/css/keyTable.jqueryui.min.css         |   1 +
 .../KeyTable/css/keyTable.semanticui.min.css       |   1 +
 .../KeyTable/js/dataTables.keyTable.min.js         |  18 +
 .../Responsive/css/responsive.bootstrap.min.css    |   1 +
 .../Responsive/css/responsive.bootstrap4.min.css   |   1 +
 .../Responsive/css/responsive.dataTables.min.css   |   1 +
 .../Responsive/css/responsive.foundation.min.css   |   1 +
 .../Responsive/css/responsive.jqueryui.min.css     |   1 +
 .../Responsive/css/responsive.semanticui.min.css   |   1 +
 .../Responsive/js/dataTables.responsive.min.js     |  26 +
 .../Responsive/js/responsive.bootstrap.min.js      |   6 +
 .../Responsive/js/responsive.bootstrap4.min.js     |   6 +
 .../Responsive/js/responsive.foundation.min.js     |   6 +
 .../Responsive/js/responsive.jqueryui.min.js       |   6 +
 .../Responsive/js/responsive.semanticui.min.js     |   6 +
 .../RowReorder/css/rowReorder.bootstrap.min.css    |   1 +
 .../RowReorder/css/rowReorder.bootstrap4.min.css   |   1 +
 .../RowReorder/css/rowReorder.dataTables.min.css   |   1 +
 .../RowReorder/css/rowReorder.foundation.min.css   |   1 +
 .../RowReorder/css/rowReorder.jqueryui.min.css     |   1 +
 .../RowReorder/css/rowReorder.semanticui.min.css   |   1 +
 .../RowReorder/js/dataTables.rowReorder.min.js     |  16 +
 .../Scroller/css/scroller.bootstrap.min.css        |   1 +
 .../Scroller/css/scroller.bootstrap4.min.css       |   1 +
 .../Scroller/css/scroller.dataTables.min.css       |   1 +
 .../Scroller/css/scroller.foundation.min.css       |   1 +
 .../Scroller/css/scroller.jqueryui.min.css         |   1 +
 .../Scroller/css/scroller.semanticui.min.css       |   1 +
 .../Scroller/js/dataTables.scroller.min.js         |  27 +
 .../Select/css/select.bootstrap.min.css            |   1 +
 .../Select/css/select.bootstrap4.min.css           |   1 +
 .../Select/css/select.dataTables.min.css           |   1 +
 .../Select/css/select.foundation.min.css           |   1 +
 .../Select/css/select.jqueryui.min.css             |   1 +
 .../Select/css/select.semanticui.min.css           |   1 +
 .../Select/js/dataTables.select.min.js             |  26 +
 .../lib/datatables-plugins/natural/natural.js      | 114 +++
 .../searchHighlight/dataTables.searchHighlight.css |   6 +
 .../dataTables.searchHighlight.min.js              |   6 +
 .../searchHighlight/jquery.highlight.js            | 108 +++
 .../datatables/css/dataTables.bootstrap.extra.css  |  78 ++
 .../datatables/css/dataTables.bootstrap.min.css    |   1 +
 .../datatables/css/dataTables.bootstrap4.min.css   |   1 +
 .../datatables/css/dataTables.foundation.min.css   |   1 +
 .../lib/datatables/css/dataTables.jqueryui.min.css |   1 +
 .../lib/datatables/css/dataTables.material.min.css |   1 +
 .../datatables/css/dataTables.semanticui.min.css   |   1 +
 .../lib/datatables/css/dataTables.uikit.min.css    |   1 +
 .../lib/datatables/css/jquery.dataTables.extra.css |   8 +
 .../lib/datatables/css/jquery.dataTables.min.css   |   1 +
 .../lib/datatables/js/dataTables.bootstrap.min.js  |   8 +
 .../lib/datatables/js/dataTables.bootstrap4.min.js |   8 +
 .../lib/datatables/js/dataTables.foundation.min.js |   8 +
 .../lib/datatables/js/dataTables.jqueryui.min.js   |   9 +
 .../lib/datatables/js/dataTables.material.min.js   |   8 +
 .../lib/datatables/js/dataTables.semanticui.min.js |   9 +
 .../lib/datatables/js/dataTables.uikit.min.js      |   8 +
 .../lib/datatables/js/jquery.dataTables.min.js     | 166 ++++
 inst/htmlwidgets/lib/datatables/license.txt        |  20 +
 inst/htmlwidgets/lib/jquery/LICENSE.txt            |  37 +
 inst/htmlwidgets/lib/jquery/jquery.min.js          |   5 +
 .../lib/nouislider/jquery.nouislider.min.css       |   4 +
 .../lib/nouislider/jquery.nouislider.min.js        |   3 +
 .../lib/selectize/selectize.bootstrap3.css         | 401 +++++++++
 inst/htmlwidgets/lib/selectize/selectize.min.js    |   3 +
 man/DT-imports.Rd                                  |  12 +
 man/dataTableAjax.Rd                               |  71 ++
 man/dataTableOutput.Rd                             |  58 ++
 man/datatable.Rd                                   | 134 +++
 man/formatCurrency.Rd                              | 114 +++
 man/proxy.Rd                                       |  95 +++
 man/replaceData.Rd                                 |  29 +
 man/styleInterval.Rd                               |  58 ++
 man/tableHeader.Rd                                 |  33 +
 vignettes/DT.Rmd                                   |  26 +
 193 files changed, 6345 insertions(+)

diff --git a/DESCRIPTION b/DESCRIPTION
new file mode 100644
index 0000000..377ea6f
--- /dev/null
+++ b/DESCRIPTION
@@ -0,0 +1,42 @@
+Package: DT
+Type: Package
+Title: A Wrapper of the JavaScript Library 'DataTables'
+Version: 0.2
+Date: 2016-08-08
+Authors at R: c(
+    person("Yihui", "Xie", email = "xie at yihui.name", role = c("aut", "cre")),
+    person("Joe", "Cheng", role = "ctb"),
+    person("JJ", "Allaire", role = "ctb"),
+    person("jQuery contributors", role = c("ctb", "cph"), comment = "jQuery in htmlwidgets/lib"),
+    person("SpryMedia Limited", role = c("ctb", "cph"), comment = "DataTables in htmlwidgets/lib"),
+    person("Brian", "Reavis", role = c("ctb", "cph"), comment = "selectize.js in htmlwidgets/lib"),
+    person("Leon", "Gersen", role = c("ctb", "cph"), comment = "noUiSlider in htmlwidgets/lib"),
+    person("Bartek", "Szopka", role = c("ctb", "cph"), comment = "jquery.highlight.js in htmlwidgets/lib"),
+    person("RStudio Inc", role = "cph")
+    )
+Maintainer: Yihui Xie <xie at yihui.name>
+Description: Data objects in R can be rendered as HTML tables using the
+    JavaScript library 'DataTables' (typically via R Markdown or Shiny). The
+    'DataTables' library has been included in this R package. The package name
+    'DT' is an abbreviation of 'DataTables'.
+URL: http://rstudio.github.io/DT
+BugReports: https://github.com/rstudio/DT/issues
+License: GPL-3 | file LICENSE
+Imports: htmltools (>= 0.3.5), htmlwidgets (>= 0.6), magrittr
+Suggests: jsonlite (>= 0.9.16), knitr (>= 1.8), rmarkdown, shiny (>=
+        0.12.1)
+VignetteBuilder: knitr
+RoxygenNote: 5.0.1
+NeedsCompilation: no
+Packaged: 2016-08-09 04:06:45 UTC; yihui
+Author: Yihui Xie [aut, cre],
+  Joe Cheng [ctb],
+  JJ Allaire [ctb],
+  jQuery contributors [ctb, cph] (jQuery in htmlwidgets/lib),
+  SpryMedia Limited [ctb, cph] (DataTables in htmlwidgets/lib),
+  Brian Reavis [ctb, cph] (selectize.js in htmlwidgets/lib),
+  Leon Gersen [ctb, cph] (noUiSlider in htmlwidgets/lib),
+  Bartek Szopka [ctb, cph] (jquery.highlight.js in htmlwidgets/lib),
+  RStudio Inc [cph]
+Repository: CRAN
+Date/Publication: 2016-08-09 11:41:46
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..c5b73b2
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,315 @@
+The DT package as a whole is distributed under GPL-3 (GNU GENERAL PUBLIC
+LICENSE version 3).
+
+The DT 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, https://github.com/jquery/jquery
+- DataTables, https://github.com/DataTables/DataTables
+- selectize.js, https://github.com/brianreavis/selectize.js
+- noUiSlider, https://github.com/leongersen/noUiSlider/
+- jquery.highlight.js, https://github.com/bartaz/sandbox.js
+
+
+jQuery license
+----------------------------------------------------------------------
+
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+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.
+
+
+
+selectize.js 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 2013 Brian Reavis
+
+   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.
+
+
+DataTables license
+----------------------------------------------------------------------
+
+Copyright (c) 2008-2013 SpryMedia Limited
+http://datatables.net
+
+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.
+
+
+noUiSlider license
+----------------------------------------------------------------------
+
+Copyright Leon Gersen and contributors
+
+        DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+                    Version 2, December 2004
+
+ Copyright (C) 2004 Sam Hocevar <sam at hocevar.net>
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. You just DO WHAT THE FUCK YOU WANT TO.
+
+
+jquery.highlight.js license
+----------------------------------------------------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2010 Bartek Szopka
+
+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/MD5 b/MD5
new file mode 100644
index 0000000..4980059
--- /dev/null
+++ b/MD5
@@ -0,0 +1,192 @@
+6a389c964f54a6ef167aec36315b58e2 *DESCRIPTION
+4f067e6ecc298741e67bfcf099364593 *LICENSE
+39bc4f7a3a4e540ee302b8a17b1b5b93 *NAMESPACE
+aacaa7df3b2f5a176ec02e41067f019e *NEWS.md
+416fedd298c20d9afc3b3f174e8263ac *R/datatables.R
+f7c1529404d11a66b2bb169fa997dfde *R/format.R
+8c90bb75372db0bfdb4d67c7e961e6cd *R/package.R
+888137db6634da77739cff6a3bdd61be *R/shiny.R
+532a9e2ea1c73dece4f31a9c4152d7db *R/utils.R
+dd7531902587488b16497c2bc5001e83 *README.md
+63dc2a6d8bcec1cfc22811565b62ee6d *build/vignette.rds
+ccdf0e649690dc4395f5ecd79b0deb6a *inst/doc/DT.Rmd
+86ea3d3642d066b25a0a769abce6915b *inst/doc/DT.html
+71abd2a48dfda62caf5aefd1cfbc7010 *inst/examples/DT-click/DESCRIPTION
+565bad45b8c6aaf40ac55af94202b66b *inst/examples/DT-click/Readme.md
+d4800258fcd978916f24ca62ba637607 *inst/examples/DT-click/rsconnect/shinyapps.io/yihui/DT-click.dcf
+630a972d522f75bb623802dd147a134d *inst/examples/DT-click/server.R
+0a0e7deca1e76c230b07dad3e4fb2166 *inst/examples/DT-click/ui.R
+bc3b531b3c774fd638f172ecbdf9187f *inst/examples/DT-filter/DESCRIPTION
+f3526b9a6db174af24a13552072db152 *inst/examples/DT-filter/Readme.md
+dcefb9d39dd5db650c19765dc063c1f4 *inst/examples/DT-filter/rsconnect/shinyapps.io/yihui/DT-filter.dcf
+f0651d2cb2d852f51a5043b7cddae018 *inst/examples/DT-filter/server.R
+054ad6c0c1af01630c858cbe0fe203fd *inst/examples/DT-filter/ui.R
+c9710299bd7eb8704d75f550c8681399 *inst/examples/DT-info/DESCRIPTION
+5345936d84f700715590c06e1037ed0c *inst/examples/DT-info/Readme.md
+f675ee634656cb836154f3a3b942504f *inst/examples/DT-info/rsconnect/shinyapps.io/yihui/DT-info.dcf
+bc6d2307c73585af1595443d79e8f2c4 *inst/examples/DT-info/server.R
+05edf41db4adc5e312b1ebb95f25b46d *inst/examples/DT-info/ui.R
+3c7d263df5dd1695190daac9b0e1ea97 *inst/examples/DT-proxy/DESCRIPTION
+acd5186257855ab9f290e220cdbcd8ff *inst/examples/DT-proxy/Readme.md
+c7058993f68fdbe2f4a9aa2c2625cae9 *inst/examples/DT-proxy/rsconnect/shinyapps.io/yihui/DT-proxy.dcf
+4acbf0066c754cdc506e969d0a8e68aa *inst/examples/DT-proxy/server.R
+c277d8db2230e9758c564dd95eb81925 *inst/examples/DT-proxy/ui.R
+cfe4df1fb43445e2abf0a1ca36a68649 *inst/examples/DT-radio/DESCRIPTION
+d6a315d2678ee1a07e6d3310d3868cf0 *inst/examples/DT-radio/Readme.md
+819f3fcbd57c53fba2387bbd4d032bf5 *inst/examples/DT-radio/app.R
+ab23760b4c9934c327e48a7bea0096eb *inst/examples/DT-radio/rsconnect/shinyapps.io/yihui/DT-radio.dcf
+dcd2e12700b77e8c10c8f8715a36a838 *inst/examples/DT-reload/app.R
+6d372ae0656a985bdf1f5b5bd9c660d3 *inst/examples/DT-rows/DESCRIPTION
+607c9136a5507dfec7a25f0b0101fb3a *inst/examples/DT-rows/Readme.md
+43513c70f29e16866a1985e55c7344ae *inst/examples/DT-rows/rsconnect/shinyapps.io/yihui/DT-rows.dcf
+f375664ca866a07105b782d8cbed59a0 *inst/examples/DT-rows/server.R
+597ceeb207a4d05ab5eb0fae3c579434 *inst/examples/DT-rows/ui.R
+eedd9f92f16586ea8a86a0d0c6c9283b *inst/examples/DT-scroller/DESCRIPTION
+c1dd22ab51a591ab24b3edbbf16e6257 *inst/examples/DT-scroller/Readme.md
+aabc8eb30547367ae56ef49b20a2ada5 *inst/examples/DT-scroller/rsconnect/shinyapps.io/yihui/DT-scroller.dcf
+07e7adcc9d9ed2dc56549f09166c8ee4 *inst/examples/DT-scroller/server.R
+a2735279c67da5a6c86597c722c34a7a *inst/examples/DT-scroller/ui.R
+57266ab113392a1be39612d3aacc6eb9 *inst/examples/DT-scroller/www/large.txt
+b45bee37de59858ac17cb854ae8b4b93 *inst/examples/DT-selection/DESCRIPTION
+6d928afa16ae7967df0c4bc9cb539b9b *inst/examples/DT-selection/Readme.md
+29bd9f2250de876bd2614783802ecfa2 *inst/examples/DT-selection/rsconnect/shinyapps.io/yihui/DT-selection.dcf
+994c252dca8c1bde7944b768bac2eeb2 *inst/examples/DT-selection/server.R
+629973d4b3fef1f7df2f4412b61993e6 *inst/examples/DT-selection/ui.R
+1a62e7809633d5a31589ac3fa2b2a862 *inst/examples/DT-shiny/server.R
+3450a2681e8121d145603ebb0e6dee9d *inst/examples/DT-shiny/ui.R
+494610fe3e185694e51f5f1c5c30da84 *inst/examples/ajax-shiny.R
+25c4baab4bb7785952879618ee15cde5 *inst/examples/datatable.R
+1a19926fa4eab5fd79034f1add682420 *inst/htmlwidgets/datatables.js
+d5f88aab62656bb81bc8025aee67a446 *inst/htmlwidgets/datatables.yaml
+7fb384e3400528342d9c0f2e36343608 *inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.bootstrap.min.css
+e365bdd06a615171ce0c01207d5743aa *inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.bootstrap4.min.css
+9fe81eb0ac694ee91d97c5d7a8b3ad43 *inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.dataTables.min.css
+f34c916375f7d22ff8ca72e8e99f6d5a *inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.foundation.min.css
+5109cc1d25519793e9767bd830fc6587 *inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.jqueryui.min.css
+20c846a4253fab1430b2a0492c0b7fc3 *inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.semanticui.min.css
+615f0c9efa4b2a26562d6381f7133a15 *inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.bootstrap.min.js
+c3aa44c3d1fb39b46a5d27a641f7677d *inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.bootstrap4.min.js
+cd11dfc1e0b17d914e35ebfdba45a350 *inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.foundation.min.js
+8a9fbd30cbefac5d7415da678b0717e0 *inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.jqueryui.min.js
+6ddeac626322d9efcfb0a806ecfdecbb *inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.semanticui.min.js
+b01fec391eba74e7e12f2bcc3f9558b5 *inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/dataTables.autoFill.min.js
+bd7652fc1398727918564c515096ee61 *inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.bootstrap.min.css
+3b9567157ac3268f5283f148a3cb5425 *inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.bootstrap4.min.css
+80d675b43e9c4eafa7d99461bfb57eca *inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.dataTables.min.css
+fb8b0b8277abd7a6abb2ee44d714c323 *inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.foundation.min.css
+de72e0d4febe492c47fc7aa03f1701dc *inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.jqueryui.min.css
+782d01fd77464a114b95fbec6c88ddc3 *inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.semanticui.min.css
+ac22ff642b7e893d1481c3746e3a727e *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.bootstrap.min.js
+d48422474c0654bf15c078c128132d30 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.bootstrap4.min.js
+ce3122eaca7ccb19e44dee7dda4d64a2 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.colVis.min.js
+fc6a8c2af5e96d74874f6a0d3cd423cb *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.flash.min.js
+42b3f4233a86c61613600618524240b2 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.foundation.min.js
+0da44ded2aaff1f0c13606600a4cd330 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.html5.min.js
+5eb95aac299957a5ba26c5e3a5574f45 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.jqueryui.min.js
+cd927381496c412f4693bd9d9ee033f4 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.print.min.js
+8cee4ab13c1599b224a3109cc40a1404 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.semanticui.min.js
+ee4a3855817393103a592c0a1c25d8f2 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/dataTables.buttons.min.js
+88731e24340ce38647f6d595f0e464cb *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/jszip.min.js
+71b5d08a3237892f2661c1402dee48d6 *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/pdfmake.min.js
+f3770e5dd1c10449f7c17b600e3ec84c *inst/htmlwidgets/lib/datatables-extensions/Buttons/js/vfs_fonts.js
+965eb6efa1ff3f3ea546676a53cc4f7b *inst/htmlwidgets/lib/datatables-extensions/Buttons/swf/flashExport.swf
+a65ed2b82745029651afe388c3bea09e *inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.bootstrap.min.css
+4f96b4632d8295f7e868aea3fc324025 *inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.bootstrap4.min.css
+a2e75082bb806b3a302604cfc8e22540 *inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.dataTables.min.css
+a38e667f12df509bfaf12efedf488d3a *inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.foundation.min.css
+a2e75082bb806b3a302604cfc8e22540 *inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.jqueryui.min.css
+294e03be61344c23b1b417c129dc5060 *inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.semanticui.min.css
+304bd32b34a09a051cb2eb811507cd6d *inst/htmlwidgets/lib/datatables-extensions/ColReorder/js/dataTables.colReorder.min.js
+9d9741553338e2cfbe75334a9593e9aa *inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.bootstrap.min.css
+9d9741553338e2cfbe75334a9593e9aa *inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.bootstrap4.min.css
+194c3762df658fd5e90b39903c937591 *inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.dataTables.min.css
+12ade2c6e8b9cfc6e0132666ff2e2690 *inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.foundation.min.css
+14bfe593c7c77ea7bb60f9723a774245 *inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.jqueryui.min.css
+15a4f7c1d2a310269cf86e253ecc4e40 *inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.semanticui.min.css
+cb95882803e69ffc96c11bc561dfdb62 *inst/htmlwidgets/lib/datatables-extensions/FixedColumns/js/dataTables.fixedColumns.min.js
+731a4e68b76887bcf0268681779ddac3 *inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.bootstrap.min.css
+731a4e68b76887bcf0268681779ddac3 *inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.bootstrap4.min.css
+446a1fe52d8ce74449ab8199e1134f6c *inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.min.css
+731a4e68b76887bcf0268681779ddac3 *inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.foundation.min.css
+c815b27720b04006e2c5ff9deddb4131 *inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.jqueryui.min.css
+d3bf038ae876bef56b2ea070e28f9f86 *inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.semanticui.min.css
+5e921f5e451786d7c5f5c7178a8d9543 *inst/htmlwidgets/lib/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.min.js
+52e8c75cabe3c8f662e839d7af78dbb0 *inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.bootstrap.min.css
+b6a50f527f0ff56f953ea7c132328084 *inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.bootstrap4.min.css
+e82963d0bfaed314c00dfe1872a45b24 *inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.dataTables.min.css
+b993874ebf41c40c365fc637d1f37023 *inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.foundation.min.css
+e82963d0bfaed314c00dfe1872a45b24 *inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.jqueryui.min.css
+113a53a2935265ed4f2cc9b3a9308777 *inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.semanticui.min.css
+545605938707a4095da85c456027752e *inst/htmlwidgets/lib/datatables-extensions/KeyTable/js/dataTables.keyTable.min.js
+144431a3e482294c8bb783a961d6c28b *inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.bootstrap.min.css
+51ce52dcb0c0b67eafeb43fae5d486f2 *inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.bootstrap4.min.css
+a324195066e5b51700c047eaad06e7e8 *inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.dataTables.min.css
+5ba76fef77e926a3ddf8b11ead2ed86e *inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.foundation.min.css
+a324195066e5b51700c047eaad06e7e8 *inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.jqueryui.min.css
+e9755c15be00bded1cb3e7e1e3d1ce9c *inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.semanticui.min.css
+d8b262af3d6a55433cceac341aa30fcd *inst/htmlwidgets/lib/datatables-extensions/Responsive/js/dataTables.responsive.min.js
+e02a2d3a723440940ca67a16b2e49a58 *inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.bootstrap.min.js
+f98427e3934f0783740b54ee926bdc60 *inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.bootstrap4.min.js
+943047c99587f0078800a328baee3832 *inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.foundation.min.js
+4216eaba831080b1b916e76ecf4e0612 *inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.jqueryui.min.js
+d5de8e2b00fd9f870bcb7fcb6f1e7d8d *inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.semanticui.min.js
+72465228e4212e84e1700d8795dd04f5 *inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.bootstrap.min.css
+cee0131d90f76d4125831743f8459cd1 *inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.bootstrap4.min.css
+2904496643d6ad5935a8d7edafef22d2 *inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.dataTables.min.css
+72465228e4212e84e1700d8795dd04f5 *inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.foundation.min.css
+2904496643d6ad5935a8d7edafef22d2 *inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.jqueryui.min.css
+a1e98f195b9a18d71c56aa6a483ef670 *inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.semanticui.min.css
+c42cffbfe646be00af2b579d4613fb8d *inst/htmlwidgets/lib/datatables-extensions/RowReorder/js/dataTables.rowReorder.min.js
+0fbb1127958ba6507640d4a3d0e3eeec *inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.bootstrap.min.css
+0fbb1127958ba6507640d4a3d0e3eeec *inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.bootstrap4.min.css
+582c940ca1a63b7b2b782f62ecce378a *inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.dataTables.min.css
+608f7a9bb551645b5fe7380f00f2aeac *inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.foundation.min.css
+582c940ca1a63b7b2b782f62ecce378a *inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.jqueryui.min.css
+582c940ca1a63b7b2b782f62ecce378a *inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.semanticui.min.css
+708e621ef55616888ff0a00b065c9d33 *inst/htmlwidgets/lib/datatables-extensions/Scroller/js/dataTables.scroller.min.js
+b45fe4e7aa7cc00e03ba420e179c2557 *inst/htmlwidgets/lib/datatables-extensions/Select/css/select.bootstrap.min.css
+fa02ed79b1dba4dd73bb85b854afe845 *inst/htmlwidgets/lib/datatables-extensions/Select/css/select.bootstrap4.min.css
+fa68b752ad69e703d08bbbe796f25fdf *inst/htmlwidgets/lib/datatables-extensions/Select/css/select.dataTables.min.css
+772c0e6f7eccef3eccdbbd679cb9a47d *inst/htmlwidgets/lib/datatables-extensions/Select/css/select.foundation.min.css
+fa68b752ad69e703d08bbbe796f25fdf *inst/htmlwidgets/lib/datatables-extensions/Select/css/select.jqueryui.min.css
+387a3c27227061f1c255ddadd8966172 *inst/htmlwidgets/lib/datatables-extensions/Select/css/select.semanticui.min.css
+dfe1352a782465f67d37ecfcd42fab61 *inst/htmlwidgets/lib/datatables-extensions/Select/js/dataTables.select.min.js
+ea7d2ea68ba98646022082db190751fc *inst/htmlwidgets/lib/datatables-plugins/natural/natural.js
+b309ce2d25176065879ae2064c100da8 *inst/htmlwidgets/lib/datatables-plugins/searchHighlight/dataTables.searchHighlight.css
+b7583d86206d98902efd908426f180bb *inst/htmlwidgets/lib/datatables-plugins/searchHighlight/dataTables.searchHighlight.min.js
+34ad38f3a24b06eb8edf607540d01bb2 *inst/htmlwidgets/lib/datatables-plugins/searchHighlight/jquery.highlight.js
+f22a42b3356e55416967b245402d0ebb *inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap.extra.css
+90e568434967792c6b3bb9650ae6ebc8 *inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap.min.css
+152ae5e405c35d976f2e43c61654c21b *inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap4.min.css
+a57c97b74ca1492551b6fd8bc0eb0750 *inst/htmlwidgets/lib/datatables/css/dataTables.foundation.min.css
+d5861c9150c43df231327dbd5b90f30c *inst/htmlwidgets/lib/datatables/css/dataTables.jqueryui.min.css
+9adca8410e07cff6729d272bd340b9c3 *inst/htmlwidgets/lib/datatables/css/dataTables.material.min.css
+d4808d627049f9afaa03f8ab931c825c *inst/htmlwidgets/lib/datatables/css/dataTables.semanticui.min.css
+2154f891df256a4e361adbacbc894d9d *inst/htmlwidgets/lib/datatables/css/dataTables.uikit.min.css
+b41efe212c6d6d987839d62820c2a66d *inst/htmlwidgets/lib/datatables/css/jquery.dataTables.extra.css
+6a4aaba1fd5f6ee3dea47d7bbe1ff8db *inst/htmlwidgets/lib/datatables/css/jquery.dataTables.min.css
+63b062ca2b0c3f964a6441b525195161 *inst/htmlwidgets/lib/datatables/js/dataTables.bootstrap.min.js
+4e6adc2e3f06f64774e45284f2b935f3 *inst/htmlwidgets/lib/datatables/js/dataTables.bootstrap4.min.js
+42de5d413a86bc0909e7e24b7bd63c2a *inst/htmlwidgets/lib/datatables/js/dataTables.foundation.min.js
+61d20aa3ba2c35ed1fa355d243fd8d05 *inst/htmlwidgets/lib/datatables/js/dataTables.jqueryui.min.js
+0277499eb354fcc3ad2c5ef7275a6a32 *inst/htmlwidgets/lib/datatables/js/dataTables.material.min.js
+0aef7328f6c8c877038c8d36929c19b1 *inst/htmlwidgets/lib/datatables/js/dataTables.semanticui.min.js
+ff14bfb5ec3fa43dfa53336bc1a1d5df *inst/htmlwidgets/lib/datatables/js/dataTables.uikit.min.js
+68e14434ba097ba3db4f0a1b3041842e *inst/htmlwidgets/lib/datatables/js/jquery.dataTables.min.js
+a065111c8d473224e0819dcaada3dee4 *inst/htmlwidgets/lib/datatables/license.txt
+5b034a7685fb002220584f0c43cdf927 *inst/htmlwidgets/lib/jquery/LICENSE.txt
+4f252523d4af0b478c810c2547a63e19 *inst/htmlwidgets/lib/jquery/jquery.min.js
+fef14b3d913646205551f27b94dce117 *inst/htmlwidgets/lib/nouislider/jquery.nouislider.min.css
+a11083b61e4d8795588e25496cd35515 *inst/htmlwidgets/lib/nouislider/jquery.nouislider.min.js
+573633e5eb0860d61ba2e59fd6b41389 *inst/htmlwidgets/lib/selectize/selectize.bootstrap3.css
+146435eeda32f0e12bca8519f0da5ad9 *inst/htmlwidgets/lib/selectize/selectize.min.js
+e8361adcbe78a4bd42e76320a892e746 *man/DT-imports.Rd
+8a3b0ea4c4993cbda85bc584dea1fa3c *man/dataTableAjax.Rd
+ae536dfa5051c594667084370b61b5fa *man/dataTableOutput.Rd
+a902a87a505884e7c16e3afe19ba6232 *man/datatable.Rd
+8bd76dd975cb16ef467399a464308392 *man/formatCurrency.Rd
+a1f8e73884e8cc5324dc93d54c703cc8 *man/proxy.Rd
+a83c72653d9a1c930b1e5caaa081382b *man/replaceData.Rd
+e9f2ec67072a166b8376aed9e0953fc4 *man/styleInterval.Rd
+6f2ca0f1c01f71337e53e18308618acf *man/tableHeader.Rd
+ccdf0e649690dc4395f5ecd79b0deb6a *vignettes/DT.Rmd
diff --git a/NAMESPACE b/NAMESPACE
new file mode 100644
index 0000000..809ed67
--- /dev/null
+++ b/NAMESPACE
@@ -0,0 +1,40 @@
+export("%>%")
+export(JS)
+export(addRow)
+export(clearSearch)
+export(dataTableAjax)
+export(dataTableOutput)
+export(dataTableProxy)
+export(datatable)
+export(formatCurrency)
+export(formatDate)
+export(formatPercentage)
+export(formatRound)
+export(formatSignif)
+export(formatString)
+export(formatStyle)
+export(reloadData)
+export(renderDataTable)
+export(replaceData)
+export(saveWidget)
+export(selectCells)
+export(selectColumns)
+export(selectPage)
+export(selectRows)
+export(styleColorBar)
+export(styleEqual)
+export(styleInterval)
+export(tableFooter)
+export(tableHeader)
+export(updateCaption)
+export(updateSearch)
+import(stats)
+import(utils)
+importFrom(htmltools,HTML)
+importFrom(htmltools,htmlDependency)
+importFrom(htmltools,htmlEscape)
+importFrom(htmltools,tagList)
+importFrom(htmltools,tags)
+importFrom(htmlwidgets,JS)
+importFrom(htmlwidgets,saveWidget)
+importFrom(magrittr,"%>%")
diff --git a/NEWS.md b/NEWS.md
new file mode 100644
index 0000000..3fa1379
--- /dev/null
+++ b/NEWS.md
@@ -0,0 +1,100 @@
+# CHANGES IN DT VERSION 0.2
+
+## NEW FEATURES
+
+- The `selection` argument of `datatable()` can be used to specify a vector of row indices to be pre-selected (thanks, @maxmoro, #89).
+
+- Column filters may be disabled individually using the `searchable` settings of columns, e.g. http://rstudio.github.io/DT/009-searchable.html (thanks, @GitChub, #101).
+
+- `formatCurrency()` will round numbers to 2 decimal places by default, and it is configurable via the new argument `digits` (thanks, @mebaran, #100).
+
+- In Shiny, `input$tableId_cell_clicked` gives the row and column indices of the currently clicked cell as well as its value as a list of the form `list(row = row_index, col = column_index, value = cell_value)`.
+
+- Added a new argument `valueColumns` to `formatStyle()` so we can style a column based on the values of a different column (thanks, @zizaozi, #115). See http://rstudio.github.io/DT/010-style.html for examples.
+
+- You can enable column selection by `datatable(..., selection = list(target = 'column'))` now. The indices of selected columns are available to Shiny as `input$tableId_columns_selected` (thanks, @DarioS, #117).
+
+- Row and column selections can be enabled simultaneously using `datatable(..., selection = list(target = 'row+column')`. Column selection is done via clicking on the table footer.
+
+- Cell selection can be enabled via `datatable(..., selection = list(target = 'cell'))`. See http://rstudio.github.io/DT/shiny.html for more info.
+
+- It is possible to update the data of a table without regenerating the whole table widget with the new function `replaceData()` now (#168, #208).
+
+- Added a `width` argument to `datatable()` (thanks, @taiyun).
+
+- Added a `plugins` argument to `datatable()` to support **DataTables** plugins. See http://rstudio.github.io/plugins/ for more information.
+
+- Added a function `dataTableProxy()` to create a proxy object that can be used to manipulate a table instance after it has been rendered in a Shiny app. Currently supported methods include `selectRows()`, `selectColumns()` (#126), and `addRow()` (#129), etc.
+
+- Added a function `selectCells()` to select table cells.
+
+- Added a function `clearSearch()` to clear the filters.
+
+- Added a function `selectPage()` to select a page in the table (thanks, @carlganz, #314).
+
+- Added a function `updateCaption()` to update the table caption only (thanks, @johnpauls, #155).
+
+- Added a function `updateSearch()` to change the search keywords of the global search box and individual column filters (thanks, @fbreitwieser, #262).
+
+- When all values in a numeric column are missing (`NA`), the column filter will be disabled (http://stackoverflow.com/q/31323807/559676).
+
+- Added an argument `dec.mark` to `formatCurrency()` to customize the character for the decimal point (thanks, @frajuegies, #128).
+
+- Added an argument `before` to `formatCurrency()` to determine whether to place the currency symbol before or after the data values (thanks, @jrdnmdhl, #220).
+
+- Added a `target` argument to `formatStyle()` to decide whether to style the cell or the full row (thanks, @peterlomas, #108).
+
+- Added a `formatSignif()` function to format numbers to a specified number of significant digits (thanks, @shabbychef, #216).
+
+- Added a `formatString()` function to format strings; currently it has two arguments `prefix` and `suffix`, and you may add strings before/after column values (thanks, @fbreitwieser, #279)
+
+- Added the `elementId` argument to `datatable()` (#307).
+
+## MAJOR CHANGES
+
+- Upgraded the DataTables library to 1.10.12; there have been many changes from 1.10.7 to this version: http://datatables.net/blog/2015-08-13
+    - The `extensions` argument of `datatable()` should be a character vector now; previously it can be a list of initialization options for extensions due to the inconsistent ways of initializing DataTables extensions; now the initialization options for all extensions can be set in the `options` argument.
+    - The `copySWF()` function has been removed, since the `TableTools` extension has been removed.
+    - The `ColVis` extension was removed and replaced but the `colvis` button in the `Buttons` extension.
+
+- In the previous version, row names were used as row indices in the server-side processing mode, but numeric row indices were used in the client-side mode. Now we always use numeric row indices in both modes for the sake of consistency. These input values in Shiny will always be integers: `input$tableId_rows_current`, `input$tableId_rows_all`, and `input$tableId_rows_selected`.
+
+- `formatCurrency()` puts the currency symbol after the minus sign now, e.g. previously you might see `$-20` but now it is displayed as `-$20` (#220).
+
+## BUG FIXES
+
+- Row selections are not preserved when column filters are enabled and clicked (thanks, @The-Dub, #97).
+
+- Single row selection does not work for server-side tables (http://stackoverflow.com/q/30700143/559676).
+
+- Missing dates are not rendered correctly with `formatDate()` (thanks, @studerus, #112)
+
+- Missing values are mistakenly treated as 0 in `formatStyle()` (thanks, @studerus, #116)
+
+- The thousands separator (e.g. a comma) in `formatCurrency()` should not be applied to the digits after the decimal point (thanks, @johnbaums, #116).
+
+- The `class` argument does not work when a custom table `container` is used in `datatable()` (thanks, @DarioS, #138).
+
+- The column filters for numeric columns (sliders) do not work well when the columns contain very small values or values with a large number of decimal places (thanks, @DarioS, #150).
+
+- Searching for the ampersand `&` in the table does not work in Shiny.
+
+- Searching for `+` in columns does not work in Shiny (thanks, @vnijs, #214).
+
+- Fixed a bug that triggers a DataTables warning dialog box in the browser (thanks, @zross, https://github.com/WHOequity/who-heat/issues/229 and https://github.com/rstudio/shiny/issues/561)
+
+- Factors will a huge number of levels may slow down the rendering of the table significantly (thanks, @vnijs, #169).
+
+- Clicking links in table cells should not trigger row/column/cell selection (thanks, @daattali, #265).
+
+- White spaces may be trimmed unexpectedly in select inputs when `dataTableOutput()` is present in a Shiny app (thanks, @Yang-Tang, #303).
+
+- Respect column-wise `searchable` options when performing global searching (thanks, @aj2duncan, #311).
+
+- Clear buttons do not work when column filters are pre-set (thanks, @nutterb, #319).
+
+- Changes in column visibility should trigger changes in the table state, i.e. `input$tableId_state` (thanks, @MikeBadescu, #256).
+
+# CHANGES IN DT VERSION 0.1
+
+- Initial CRAN release.
diff --git a/R/datatables.R b/R/datatables.R
new file mode 100644
index 0000000..3fb1b66
--- /dev/null
+++ b/R/datatables.R
@@ -0,0 +1,584 @@
+#' Create an HTML table widget using the DataTables library
+#'
+#' This function creates an HTML widget to display rectangular data (a matrix or
+#' data frame) using the JavaScript library DataTables.
+#' @param data a data object (either a matrix or a data frame)
+#' @param options a list of initialization options (see
+#'   \url{http://datatables.net/reference/option/}); the character options
+#'   wrapped in \code{\link[htmlwidgets]{JS}()} will be treated as literal
+#'   JavaScript code instead of normal character strings; you can also set
+#'   options globally via \code{\link{options}(DT.options = list(...))}, and
+#'   global options will be merged into this \code{options} argument if set
+#' @param class the CSS class(es) of the table; see
+#'   \url{http://datatables.net/manual/styling/classes}
+#' @param callback the body of a JavaScript callback function with the argument
+#'   \code{table} to be applied to the DataTables instance (i.e. \code{table})
+#' @param rownames \code{TRUE} (show row names) or \code{FALSE} (hide row names)
+#'   or a character vector of row names; by default, the row names are displayed
+#'   in the first column of the table if exist (not \code{NULL})
+#' @param colnames if missing, the column names of the data; otherwise it can be
+#'   an unnamed character vector of names you want to show in the table header
+#'   instead of the default data column names; alternatively, you can provide a
+#'   \emph{named} numeric or character vector of the form \code{'newName1' = i1,
+#'   'newName2' = i2} or \code{c('newName1' = 'oldName1', 'newName2' =
+#'   'oldName2', ...)}, where \code{newName} is the new name you want to show in
+#'   the table, and \code{i} or \code{oldName} is the index of the current
+#'   column name
+#' @param container a sketch of the HTML table to be filled with data cells; by
+#'   default, it is generated from \code{htmltools::tags$table()} with a table
+#'   header consisting of the column names of the data
+#' @param caption the table caption; a character vector or a tag object
+#'   generated from \code{htmltools::tags$caption()}
+#' @param filter whether/where to use column filters; \code{none}: no filters;
+#'   \code{bottom/top}: put column filters at the bottom/top of the table; range
+#'   sliders are used to filter numeric/date/time columns, select lists are used
+#'   for factor columns, and text input boxes are used for character columns; if
+#'   you want more control over the styles of filters, you can provide a list to
+#'   this argument of the form \code{list(position = 'top', clear = TRUE, plain
+#'   = FALSE)}, where \code{clear} indicates whether you want the clear buttons
+#'   in the input boxes, and \code{plain} means if you want to use Bootstrap
+#'   form styles or plain text input styles for the text input boxes
+#' @param escape whether to escape HTML entities in the table: \code{TRUE} means
+#'   to escape the whole table, and \code{FALSE} means not to escape it;
+#'   alternatively, you can specify numeric column indices or column names to
+#'   indicate which columns to escape, e.g. \code{1:5} (the first 5 columns),
+#'   \code{c(1, 3, 4)}, or \code{c(-1, -3)} (all columns except the first and
+#'   third), or \code{c('Species', 'Sepal.Length')}
+#' @param style the style name (\url{http://datatables.net/manual/styling/});
+#'   currently only \code{'default'} and \code{'bootstrap'} are supported
+#' @param width,height Width/Height in pixels (optional, defaults to automatic
+#'   sizing)
+#' @param elementId An id for the widget (a random string by default).
+#' @param fillContainer \code{TRUE} to configure the table to automatically fill
+#'   it's containing element. If the table can't fit fully into it's container
+#'   then vertical and/or horizontal scrolling of the table cells will occur.
+#' @param autoHideNavigation \code{TRUE} to automatically hide navigational UI
+#'   when the number of total records is less than the page size.
+#' @param selection the row/column selection mode (single or multiple selection
+#'   or disable selection) when a table widget is rendered in a Shiny app;
+#'   alternatively, you can use a list of the form \code{list(mode = 'multiple',
+#'   selected = c(1, 3, 8), target = 'row')} to pre-select rows; the element
+#'   \code{target} in the list can be \code{'column'} to enable column
+#'   selection, or \code{'row+column'} to make it possible to select both rows
+#'   and columns (click on the footer to select columns), or \code{'cell'} to
+#'   select cells
+#' @param extensions a character vector of the names of the DataTables
+#'   extensions (\url{http://datatables.net/extensions/index})
+#' @param plugins a character vector of the names of DataTables plug-ins
+#'   (\url{http://rstudio.github.io/DT/plugins.html})
+#' @note You are recommended to escape the table content for security reasons
+#'   (e.g. XSS attacks) when using this function in Shiny or any other dynamic
+#'   web applications.
+#' @references See \url{http://rstudio.github.io/DT} for the full documentation.
+#' @importFrom htmltools tags htmlDependency
+#' @export
+#' @example inst/examples/datatable.R
+datatable = function(
+  data, options = list(), class = 'display', callback = JS('return table;'),
+  rownames, colnames, container, caption = NULL, filter = c('none', 'bottom', 'top'),
+  escape = TRUE, style = 'default', width = NULL, height = NULL, elementId = NULL,
+  fillContainer = getOption('DT.fillContainer', NULL),
+  autoHideNavigation = getOption('DT.autoHideNavigation', NULL),
+  selection = c('multiple', 'single', 'none'), extensions = list(), plugins = NULL
+) {
+
+  # yes, we all hate it
+  oop = base::options(stringsAsFactors = FALSE); on.exit(base::options(oop), add = TRUE)
+
+  options = modifyList(
+    getOption('DT.options', list()),
+    if (is.function(options)) options() else options
+  )
+  params = list()
+
+  # deal with row names: rownames = TRUE or missing, use rownames(data)
+  rn = if (missing(rownames) || isTRUE(rownames)) base::rownames(data) else {
+    if (is.character(rownames)) rownames  # use custom row names
+  }
+
+  hideDataTable = FALSE
+  if (is.null(data) || identical(ncol(data), 0L)) {
+    data = matrix(ncol = 0, nrow = NROW(data))
+    hideDataTable = TRUE
+  } else if (length(dim(data)) != 2) {
+    str(data)
+    stop("'data' must be 2-dimensional (e.g. data frame or matrix)")
+  }
+
+  if (is.data.frame(data)) {
+    data = as.data.frame(data)
+    numc = unname(which(vapply(data, is.numeric, logical(1))))
+  } else {
+    if (!is.matrix(data))
+      stop("'data' must be either a matrix or a data frame")
+    numc = if (is.numeric(data)) seq_len(ncol(data))
+    data = as.data.frame(data)
+  }
+  if (!is.null(rn)) {
+    data = cbind(' ' = rn, data)
+    numc = numc + 1  # move indices of numeric columns to the right by 1
+  }
+
+  # align numeric columns to the right
+  if (length(numc)) options = appendColumnDefs(
+    options, list(className = 'dt-right', targets = numc - 1)
+  )
+
+  # make sure the table is _not_ ordered by default (change the DataTables default)
+  if (is.null(options[['order']])) options$order = list()
+  # I do not see the point of "autoWidth: true" as the default in DataTables
+  if (is.null(options[['autoWidth']])) options$autoWidth = FALSE
+  # disable CSS classes for ordered columns
+  if (is.null(options[['orderClasses']])) options$orderClasses = FALSE
+
+  cn = base::colnames(data)
+  if (missing(colnames)) {
+    colnames = cn
+  } else if (!is.null(names(colnames))) {
+    # e.g. colnames = c('Sepal Width' = 'Sepal.Width' or 2) => make the 2nd
+    # column name 'Sepal Width'
+    i = convertIdx(colnames, cn)
+    cn[i] = names(colnames)
+    colnames = cn
+  }
+  # when rownames = TRUE, user may have only provided colnames for original
+  # data, and we need to add a name for the first column, i.e. row names
+  if (ncol(data) - length(colnames) == 1) colnames = c(' ', colnames)
+  # do not order the first column if the name is empty (a column for row names)
+  if (length(colnames) && colnames[1] == ' ')
+    options = appendColumnDefs(options, list(orderable = FALSE, targets = 0))
+
+  style = match.arg(tolower(style), DTStyles())
+  if (style == 'bootstrap') class = DT2BSClass(class)
+  if (style != 'default') params$style = style
+
+  # add class for fillContainer if necessary
+  if (isTRUE(fillContainer))
+    class = paste(class, 'fill-container');
+
+  if (is.character(filter)) filter = list(position = match.arg(filter))
+  filter = modifyList(list(position = 'none', clear = TRUE, plain = FALSE), filter)
+  # HTML code for column filters
+  filterHTML = as.character(filterRow(data, !is.null(rn) && colnames[1] == ' ', filter))
+  # use the first row in the header as the sorting cells when I put the filters
+  # in the second row
+  if (filter$position == 'top') options$orderCellsTop = TRUE
+  params$filter = filter$position
+  if (filter$position != 'none') params$filterHTML = filterHTML
+
+  if (missing(container)) {
+    container = tags$table(tableHeader(colnames, escape), class = class)
+  } else {
+    params$class = class
+  }
+
+  # indices of columns that need to be escaped
+  attr(options, 'escapeIdx') = escapeToConfig(escape, colnames)
+
+  if (is.list(extensions)) {
+    extensions = names(extensions)
+  } else if (!is.character(extensions)) {
+    stop("'extensions' must be either a character vector or a named list")
+  }
+  params$extensions = if (length(extensions)) as.list(extensions)
+
+  # automatically configure options and callback for extensions
+  if ('Responsive' %in% extensions) options$responsive = TRUE
+
+  params$caption = captionString(caption)
+
+  if (!identical(class(callback), class(JS(''))))
+    stop("The 'callback' argument only accept a value returned from JS()")
+  if (length(options$pageLength) && length(options$lengthMenu) == 0) {
+    if (!isFALSE(options$lengthChange))
+      options$lengthMenu = sort(unique(c(options$pageLength, 10, 25, 50, 100)))
+    if (identical(options$lengthMenu, c(10, 25, 50, 100)))
+      options$lengthMenu = NULL  # that is just the default
+  }
+
+  # record fillContainer and autoHideNavigation
+  if (!is.null(fillContainer)) params$fillContainer = fillContainer
+  if (!is.null(autoHideNavigation)) params$autoHideNavigation = autoHideNavigation
+
+  params = structure(modifyList(params, list(
+    data = data, container = as.character(container), options = options,
+    callback = if (!missing(callback)) JS('function(table) {', callback, '}')
+  )), colnames = cn, rownames = length(rn) > 0)
+  # selection parameters in shiny
+  if (inShiny()) {
+    if (is.character(selection)) {
+      selection = list(mode = match.arg(selection))
+    }
+    selection = modifyList(
+      list(mode = 'multiple', selected = NULL, target = 'row'), selection
+    )
+    # for compatibility with DT < 0.1.22 ('selected' could be row names)
+    if (grepl('^row', selection$target) && is.character(selection$selected) && length(rn)) {
+      selection$selected = match(selection$selected, rn)
+    }
+    params$selection = selection
+  }
+
+  deps = list(DTDependency(style))
+  deps = c(deps, unlist(
+    lapply(extensions, extDependency, style, options),
+    recursive = FALSE
+  ))
+  if (params$filter != 'none') deps = c(deps, filterDependencies())
+  if (isTRUE(options$searchHighlight))
+    deps = c(deps, list(pluginDependency('searchHighlight')))
+  if (length(plugins))
+    deps = c(deps, lapply(plugins, pluginDependency))
+
+  # force width and height to NULL for fillContainer
+  if (isTRUE(fillContainer)) {
+    width = NULL
+    height = NULL
+  }
+
+  htmlwidgets::createWidget(
+    'datatables', if (hideDataTable) NULL else params,
+    package = 'DT', width = width, height = height, elementId = elementId,
+    sizingPolicy = htmlwidgets::sizingPolicy(
+      knitr.figure = FALSE, knitr.defaultWidth = "100%", knitr.defaultHeight = "auto"
+    ),
+    dependencies = deps, preRenderHook = function(instance) {
+
+      data = instance[['x']][['data']]
+
+      # 1.5Mb is just an arbitrary size from my experiments
+      if (object.size(data) > 1.5e6 && getOption('DT.warn.size', TRUE))
+        warning(
+          'It seems your data is too big for client-side DataTables. You may ',
+          'consider server-side processing: http://rstudio.github.io/DT/server.html'
+        )
+
+      data = escapeData(data, escape, colnames)
+      data = unname(data)
+      instance$x$data = data
+
+      instance
+    }
+  )
+}
+
+appendColumnDefs = function(options, def) {
+  defs = options[['columnDefs']]
+  if (is.null(defs)) defs = list()
+  defs[[length(defs) + 1]] = def
+  options$columnDefs = defs
+  options
+}
+
+# convert character indices to numeric
+convertIdx = function(i, names, n = length(names), invert = FALSE) {
+  if (!is.character(i)) return({
+    if (invert) {
+      if (is.numeric(i)) -i else if (is.logical(i)) !i else {
+        stop('Indices must be either character, numeric, or logical')
+      }
+    } else i
+  })
+  if (is.null(names)) stop('The data must have column names')
+  o = setNames(seq_len(n), names)
+  i = o[i]
+  if (any(is.na(i)))
+    stop("Some column names in the 'escape' argument not found in data")
+  if (invert) o[-i] else i
+}
+
+#' @importFrom htmltools HTML htmlEscape
+escapeData = function(data, i, colnames) {
+  if (is.null(data) || prod(dim(data)) == 0 || identical(i, FALSE)) return(data)
+  i = convertIdx(i, colnames, ncol(data))
+  # only escape character columns (no need to escape numeric or logical columns)
+  data[i] = lapply(data[i], function(x) {
+    if (is.character(x) || is.factor(x)) htmlEscape(x) else x
+  })
+  data
+}
+
+escapeColNames = function(colnames, i) {
+  if (isTRUE(i)) return(colnames)  # tags$th will escape them
+  i = convertIdx(i, colnames, length(colnames), invert = TRUE)
+  colnames = as.list(colnames)
+  colnames[i] = lapply(colnames[i], HTML)
+  colnames
+}
+
+escapeToConfig = function(escape, colnames) {
+  if (isTRUE(escape)) return('true')
+  if (isFALSE(escape)) return('false')
+  if (!is.numeric(escape)) escape = convertIdx(escape, colnames)
+  if (is.logical(escape)) escape = which(escape)
+  sprintf('"%s"', paste(escape, collapse = ','))
+}
+
+#' Generate a table header or footer from column names
+#'
+#' Convenience functions to generate a table header (\samp{<thead></thead>}) or
+#' footer (\samp{<tfoot></tfoot>}) given the column names. They are basically
+#' wrappers of \code{htmltools::tags$th} applied to the column names.
+#' @param names a character vector of the column names of the table (if it is an
+#'   object with column names, its column names will be used instead)
+#' @param escape whether to escape the names (see \code{\link{datatable}})
+#' @return A tag object generated by \code{htmltools::tags}.
+#' @export
+#' @examples library(DT)
+#' tableHeader(iris)  # or equivalently,
+#' tableHeader(colnames(iris))
+#' tableFooter(iris)  # footer
+#'
+#' library(htmltools)
+#' tags$table(tableHeader(iris), tableFooter(iris))
+tableHeader = function(names, escape = TRUE) {
+  tableHead(names, 'head', escape)
+}
+#' @rdname tableHeader
+#' @export
+tableFooter = function(names, escape = TRUE) {
+  tableHead(names, 'foot', escape)
+}
+
+tableHead = function(names, type = c('head', 'foot'), escape = TRUE, ...) {
+  names2 = colnames(names)
+  if (!is.null(names2)) names = names2
+  type = match.arg(type)
+  f = tags[[sprintf('t%s', type)]]
+  f(tags$tr(lapply(escapeColNames(names, escape), tags$th)), ...)
+}
+
+#' @importFrom htmltools tagList
+filterRow = function(
+  data, rownames = TRUE,
+  filter = list(position = 'none', clear = TRUE, plain = FALSE)
+) {
+  if (filter$position == 'none') return()
+  tds = list()
+  decimals = function(x) {
+    x = abs(na.omit(x))
+    if (length(x) == 0) return()
+    i = 0L
+    while (i < 15 && any(round(x, i) != x)) i = i + 1L
+    if (i > 0L) i
+  }
+  for (j in seq_len(ncol(data))) {
+    if (j == 1 && rownames) {
+      tds[[j]] = tags$td('')  # no filter for row names (may change in future)
+      next
+    }
+    t = NULL
+    d = data[, j]
+    x = if (is.numeric(d) || is.Date(d)) {
+      t = if (is.numeric(d)) {
+        if (is.integer(d)) 'integer' else 'number'
+      } else 'time'
+      if (t == 'time') {
+        # JavaScript does have the Date type like R (YYYY-mm-dd without time)
+        if (inherits(d, 'Date')) {
+          d = as.POSIXct(d); t = 'date'
+        }
+        d = as.numeric(d) * 1000  # use milliseconds for JavaScript
+      }
+      suppressWarnings({
+        d1 = min(d, na.rm = TRUE)
+        d2 = max(d, na.rm = TRUE)
+      })
+      dec = decimals(d)
+      if (!is.null(dec)) {
+        d1 = floor(d1 * 10^dec) / 10^dec
+        d2 = ceiling(d2 * 10^dec) / 10^dec
+      }
+      if (is.finite(d1) && is.finite(d2) && d2 > d1) tags$div(
+        style = 'display: none; position: absolute; width: 200px;',
+        tags$div(`data-min` = d1, `data-max` = d2, `data-scale` = dec),
+        tags$span(style = 'float: left;'), tags$span(style = 'float: right;')
+      ) else {
+        t = 'disabled'
+        NULL
+      }
+    } else if (is.factor(d) || is.logical(d)) {
+      if (length(unique(d)) <= 1) {
+        t = 'disabled'
+      } else if (is.logical(d)) {
+        t = 'logical'
+        d = c('true', 'false', if (any(is.na(d))) 'na')
+      } else {
+        t = 'factor'
+        d = sort(unique(d))
+      }
+      if (t != 'disabled') tags$div(
+        tags$select(
+          multiple = 'multiple', style = 'width: 100%;',
+          `data-options` = jsonlite::toJSON(as.character(d))
+        ),
+        style = 'width: 100%; display: none;'
+      )
+    } else if (is.character(d)) {
+      t = if (length(unique(d)) <= 1) 'disabled' else 'character'
+      NULL
+    }
+    clear = filter$clear
+    input = if (filter$plain) {
+      tags$div(
+        style = 'margin-bottom: auto;',
+        tags$input(
+          type = if (clear) 'search' else 'text', placeholder = 'All',
+          style = 'width: 100%;'
+        )
+      )
+    } else {
+      tags$div(
+        class = if (clear) 'form-group has-feedback' else 'form-group',
+        style = 'margin-bottom: auto;',
+        tags$input(
+          type = 'search', placeholder = 'All', class = 'form-control',
+          style = 'width: 100%;'
+        ),
+        if (clear) tags$span(
+          class = 'glyphicon glyphicon-remove-circle form-control-feedback'
+        )
+      )
+    }
+    x = tagList(input, x)
+    tds[[j]] = tags$td(x, `data-type` = t, style = 'vertical-align: top;')
+  }
+  tags$tr(tds)
+}
+
+filterDependencies = function() {
+  list(
+    htmlDependency(
+      'nouislider', '7.0.10', depPath('nouislider'),
+      script = 'jquery.nouislider.min.js', stylesheet = 'jquery.nouislider.min.css'
+    ),
+    htmlDependency(
+      'selectize', '0.12.0', depPath('selectize'),
+      script = 'selectize.min.js', stylesheet = 'selectize.bootstrap3.css'
+    )
+  )
+}
+
+depPath = function(...) {
+  system.file('htmlwidgets', 'lib', ..., package = 'DT')
+}
+
+depName = function(style = 'default', ...) {
+  tolower(paste(c(..., if (style != 'default') c('-', style)), collapse = ''))
+}
+
+DTStyles = function() {
+  r = '^dataTables[.]([^.]+)[.]min[.]css$'
+  x = list.files(depPath('datatables', 'css'), r)
+  c('default', gsub(r, '\\1', x))
+}
+
+extPath = function(...) {
+  depPath('datatables-extensions', ...)
+}
+
+extAll = function() {
+  list.dirs(extPath(), FALSE, FALSE)
+}
+
+extDependency = function(extension, style, options) {
+  if (!(extension %in% extAll())) stop('The extension ', extension, ' does not exist')
+  src = extPath(extension)
+  ext = sub('^(.)', '\\L\\1', extension, perl = TRUE)
+  buttonDeps = NULL
+  if (extension == 'Buttons') {
+    buttons = listButtons(options)
+    buttonDeps = extraDependency(
+      c(if ('excel' %in% buttons) 'jszip', if ('pdf' %in% buttons) 'pdfmake'),
+      extension, 'js'
+    )
+    js = c(
+      sprintf('dataTables.%s.min.js', ext),
+      sprintf('buttons.%s.min.js', c('flash', 'html5', 'colVis', 'print'))
+    )
+  } else js = sprintf('dataTables.%s.min.js', ext)
+  if (style != 'default') js = c(js, sprintf('%s.%s.min.js', ext, style))
+  css = sprintf('%s.%s.min.css', ext, if (style == 'default') 'dataTables' else style)
+  js = file.path('js', js); css = file.path('css', css)
+  in_dir(src, {
+    js = existing_files(js); css = existing_files(css)
+  })
+  deps = htmlDependency(
+    depName(style, 'dt-ext-', extension), DataTablesVersion, src,
+    script = js, stylesheet = css, all_files = FALSE
+  )
+  append(buttonDeps, list(deps))
+}
+
+# whether a button was configured in the options
+listButtons = function(options) {
+  config = options[['buttons']]
+  if (is.null(config)) return()
+  if (is.character(config)) return(config)
+  if (is.list(config)) return(unlist(lapply(config, function(cfg) {
+    if (is.character(cfg)) return(cfg)
+    if (is.list(cfg)) {
+      extend = cfg$extend
+      return(if (extend != 'collection') extend else listButtons(cfg))
+    }
+  })))
+  stop('Options for DataTables extensions must be either a character vector or a list')
+}
+
+extraDepData = list(
+  jszip = list(script = 'jszip.min.js'),
+  pdfmake = list(script = c('pdfmake.min.js', 'vfs_fonts.js'))
+)
+
+extraDependency = function(names = NULL, ...) {
+  lapply(names, function(name) {
+    htmlDependency(
+      name, DataTablesVersion, extPath(...),
+      script = extraDepData[[name]][['script']], all_files = FALSE
+    )
+  })
+}
+
+# core JS and CSS dependencies of DataTables
+DTDependency = function(style) {
+  js = 'jquery.dataTables.min.js'
+  if (style == 'default') {
+    # patch the default style
+    css = c('jquery.dataTables.min.css', 'jquery.dataTables.extra.css')
+  } else {
+    js = c(js, sprintf('dataTables.%s.min.js', style))
+    css = sprintf('dataTables.%s.min.css', style)
+    # patch the Bootstrap style
+    if (style == 'bootstrap') css = c(css, 'dataTables.bootstrap.extra.css')
+  }
+  htmlDependency(
+    depName(style, 'dt-core'), DataTablesVersion, src = depPath('datatables'),
+    script = file.path('js', js), stylesheet = file.path('css', css),
+    all_files = FALSE
+  )
+}
+
+# translate DataTables classes to Bootstrap table classes
+DT2BSClass = function(class) {
+  class = unlist(strsplit(class, '\\s+'))
+  if ('display' %in% class)
+    class = unique(c('stripe', 'hover', 'row-border', 'order-column', class))
+  BSclass = c(
+    'cell-border' = 'table-bordered', 'compact' = 'table-condensed',
+    'hover' = 'table-hover', 'stripe' = 'table-striped'
+  )
+  class = c(
+    BSclass[intersect(class, names(BSclass))],
+    grep('^table-', class, value = TRUE)
+  )
+  class = unique(c('table', class))
+  paste(class, collapse = ' ')
+}
+
+pluginDependency = function(plugin) {
+  d = depPath('datatables-plugins', plugin)
+  htmlDependency(
+    paste0('dt-plugin-', tolower(plugin)), DataTablesVersion, src = d,
+    script = list.files(d, '[.]js$'), stylesheet = list.files(d, '[.]css$')
+  )
+}
diff --git a/R/format.R b/R/format.R
new file mode 100644
index 0000000..7c1bab5
--- /dev/null
+++ b/R/format.R
@@ -0,0 +1,289 @@
+formatColumns = function(table, columns, template, ...) {
+  if (inherits(columns, 'formula')) columns = all.vars(columns)
+  x = table$x
+  colnames = base::attr(x, 'colnames', exact = TRUE)
+  rownames = base::attr(x, 'rownames', exact = TRUE)
+  x$options$rowCallback = appendFormatter(
+    x$options$rowCallback, columns, colnames, rownames, template, ...
+  )
+  table$x = x
+  table
+}
+
+#' Format table columns
+#'
+#' Format numeric columns in a table as currency (\code{formatCurrency()}) or
+#' percentages (\code{formatPercentage()}), or round numbers to a specified
+#' number of decimal places (\code{formatRound()}), or a specified number
+#' of significant figures (\code{formatSignif()}).  The function
+#' \code{formatStyle()} applies CSS styles to table cells by column.
+#' @param table a table object created from \code{\link{datatable}()}
+#' @param columns the indices of the columns to be formatted (can be character,
+#'   numeric, logical, or a formula of the form \code{~ V1 + V2}, which is
+#'   equivalent to \code{c('V1', 'V2')})
+#' @param currency the currency symbol
+#' @param interval put a marker after how many digits of the numbers
+#' @param mark the marker after every \code{interval} decimals in the numbers
+#' @param dec.mark a character to indicate the decimal point
+#' @param before whether to place the currency symbol before or after the values
+#' @param method the method(s) to convert a date to string in JavaScript; see
+#'   \code{DT:::DateMethods} for a list of possible methods, and
+#'   \url{http://mzl.la/1xGe99W} for a full reference
+#' @references See \url{http://rstudio.github.io/DT/functions.html} for detailed
+#'   documentation and examples.
+#' @export
+#' @examples # !formatR
+#' library(DT)
+#' m = cbind(matrix(rnorm(120, 1e5, 1e6), 40), runif(40), rnorm(40, 100))
+#' colnames(m) = head(LETTERS, ncol(m))
+#' m
+#'
+#' # format the columns A and C as currency, and D as percentages
+#' datatable(m) %>% formatCurrency(c('A', 'C')) %>% formatPercentage('D', 2)
+#'
+#' # the first two columns are Euro currency, and round column E to 3 decimal places
+#' datatable(m) %>% formatCurrency(1:2, '\U20AC') %>% formatRound('E', 3)
+#'
+#' # render vapor pressure with only two significant figures.
+#' datatable(pressure) %>% formatSignif('pressure',2)
+#'
+#' # apply CSS styles to columns
+#' datatable(iris) %>%
+#'   formatStyle('Sepal.Length', fontWeight = styleInterval(5, c('bold', 'weight'))) %>%
+#'   formatStyle('Sepal.Width',
+#'     color = styleInterval(3.4, c('red', 'white')),
+#'     backgroundColor = styleInterval(3.4, c('yellow', 'gray'))
+#'   )
+formatCurrency = function(
+  table, columns, currency = '$', interval = 3, mark = ',', digits = 2,
+  dec.mark = getOption('OutDec'), before = TRUE
+) {
+  currency = gsub("'", "\\\\'", currency)
+  mark = gsub("'", "\\\\'", mark)
+  formatColumns(table, columns, tplCurrency, currency, interval, mark, digits, dec.mark, before)
+}
+
+#' @export
+#' @rdname formatCurrency
+#' @param prefix string to put in front of the column values
+#' @param suffix string to put after the column values
+formatString = function(table, columns, prefix = '', suffix = '') {
+  formatColumns(table, columns, tplString, prefix, suffix)
+}
+
+#' @export
+#' @rdname formatCurrency
+#' @param digits the number of decimal places to round to
+formatPercentage = function(table, columns, digits = 0) {
+  formatColumns(table, columns, tplPercentage, digits)
+}
+
+#' @export
+#' @rdname formatCurrency
+formatRound = function(table, columns, digits = 2) {
+  formatColumns(table, columns, tplRound, digits)
+}
+
+#' @export
+#' @rdname formatCurrency
+formatSignif = function(table, columns, digits = 2) {
+  formatColumns(table, columns, tplSignif, digits)
+}
+
+#' @export
+#' @rdname formatCurrency
+formatDate = function(table, columns, method = 'toDateString') {
+  formatColumns(table, columns, tplDate, method)
+}
+
+#' @param valueColumns indices of the columns from which the cell values are
+#'   obtained; this can be different with the \code{columns} argument, e.g. you
+#'   may style one column based on the values of a different column
+#' @param target the target to apply the CSS styles to (the current cell or the
+#'   full row)
+#' @param fontWeight the font weight, e.g. \code{'bold'} and \code{'normal'}
+#' @param color the font color, e.g. \code{'red'} and \code{'#ee00aa'}
+#' @param backgroundColor the background color of table cells
+#' @param background the background of table cells
+#' @param ... other CSS properties, e.g. \code{'border'}, \code{'font-size'},
+#'   \code{'text-align'}, and so on; if you want to condition CSS styles on the
+#'   cell values, you may use the helper functions such as
+#'   \code{\link{styleInterval}()}; note the actual CSS property names are
+#'   dash-separated, but you can use camelCase names in this function (otherwise
+#'   you will have to use backticks to quote the names, e.g. \code{`font-size` =
+#'   '12px'}), and this function will automatically convert camelCase names to
+#'   dash-separated names (e.g. \code{'fontWeight'} will be converted to
+#'   \code{'font-weight'} internally)
+#' @export
+#' @rdname formatCurrency
+formatStyle = function(
+  table, columns, valueColumns = columns, target = c('cell', 'row'),
+  fontWeight = NULL, color = NULL, backgroundColor = NULL, background = NULL, ...
+) {
+  styles = dropNULL(list(
+    fontWeight = fontWeight, color = color, backgroundColor = backgroundColor,
+    background = background, ...
+  ))
+  formatColumns(table, columns, tplStyle, valueColumns, match.arg(target), styles)
+}
+
+# turn character/logical indices to numeric indices
+name2int = function(name, names, rownames) {
+  if (is.numeric(name)) {
+    i = if (all(name >= 0)) name else seq_along(names)[name]
+    if (!rownames) i = i - 1
+    return(i)
+  }
+  i = unname(setNames(seq_along(names), names)[name]) - 1
+  if (any(is.na(i))) stop(
+    'You specified the columns: ', paste(name, collapse = ', '), ', ',
+    'but the column names of the data are ', paste(names, collapse = ', ')
+  )
+  i
+}
+
+appendFormatter = function(js, name, names, rownames = TRUE, template, ...) {
+  js = if (length(js) == 0) c('function(row, data) {', '}') else {
+    unlist(strsplit(as.character(js), '\n'))
+  }
+  i = name2int(name, names, rownames)
+  JS(append(
+    js, after = 1,
+    template(i, ..., names, rownames)
+  ))
+}
+
+tplCurrency = function(cols, currency, interval, mark, digits, dec.mark, before, ...) {
+  sprintf(
+    "DTWidget.formatCurrency(this, row, data, %d, '%s', %d, %d, '%s', '%s', %s);",
+    cols, currency, digits, interval, mark, dec.mark, if (before) 'true' else 'false'
+  )
+}
+
+tplString = function(cols, prefix, suffix, ...) {
+  sprintf("DTWidget.formatString(this, row, data, %d, '%s', '%s');", cols, prefix, suffix)
+}
+
+tplPercentage = function(cols, digits, ...) {
+  sprintf("DTWidget.formatPercentage(this, row, data, %d, %s);", cols, digits)
+}
+
+tplRound = function(cols, digits, ...) {
+  sprintf("DTWidget.formatRound(this, row, data, %d, %d);", cols, digits)
+}
+
+tplSignif = function(cols, digits, ...) {
+  sprintf("DTWidget.formatSignif(this, row, data, %d, %d);", cols, digits)
+}
+
+tplDate = function(cols, method, ...) {
+  sprintf("DTWidget.formatDate(this, row, data, %d, '%s')", cols, method);
+}
+
+DateMethods = c(
+  'toDateString', 'toISOString', 'toLocaleDateString', 'toLocaleString',
+  'toLocaleTimeString', 'toString', 'toTimeString', 'toUTCString'
+)
+
+tplStyle = function(cols, valueCols, target, styles, ...) {
+  if (length(styles) == 0) return()
+  if (!is.list(styles)) stop("'styles' must be a list")
+  JSclass = class(JS(''))
+  # if a style is specified in JS(), do not single quote it (it is a JS expression)
+  styles = vapply(styles, function(s) {
+    isJS = inherits(s, JSclass)
+    s = paste(s, collapse = '\n')
+    if (isJS) s else sprintf("'%s'", s)
+  }, FUN.VALUE = character(1))
+  css = paste(sprintf("'%s':%s", upperToDash(names(styles)), styles), collapse = ',')
+  valueCols = name2int(valueCols, ...)
+  switch(
+    target,
+    cell = sprintf(
+      "var value=data[%s]; if (value!==null) $(this.api().cell(row, %s).node()).css({%s});",
+      valueCols, cols, css
+    ),
+    row = sprintf(
+      "var value=data[%s]; if (value!==null) $(row).css({%s});",
+      valueCols, css
+    ),
+    stop('Invalid target!')
+  )
+}
+
+#' Conditional CSS styles
+#'
+#' A few helper functions for the \code{\link{formatStyle}()} function to
+#' calculate CSS styles for table cells based on the cell values. Under the
+#' hood, they just generate JavaScript and CSS code from the values specified in
+#' R.
+#'
+#' The function \code{styleInterval()} maps intervals to CSS values. Its
+#' argument \code{values} must be of length \code{n + 1} where \code{n =
+#' length(cuts)}. The right-closed interval \samp{(cuts[i - 1], cuts[i]]} is
+#' mapped to \samp{values[i]} for \samp{i = 2, 3, ..., n}; \samp{values[1]} is
+#' for the interval \samp{(-Inf, cuts[1]]}, and \samp{values[n + 1]} is for
+#' \samp{(cuts[n], +Inf)}. You can think of the order of \code{cuts} and
+#' \code{values} using this diagram: \samp{-Inf -> values[1] -> cuts[1] ->
+#' values[2] -> cuts[2] -> ... -> values[n] -> cuts[n] -> values[n + 1] ->
+#' +Inf}.
+#'
+#' The function \code{styleEqual()} maps data values to CSS values in the
+#' one-to-one manner, i.e. \code{values[i]} is used when the table cell value is
+#' \code{levels[i]}.
+#'
+#' The function \code{styleColorBar()} can be used to draw background color bars
+#' behind table cells in a column, and the width of bars is proportional to the
+#' column values.
+#' @param cuts a vector of cut points (sorted increasingly)
+#' @param values a vector of CSS values
+#' @export
+styleInterval = function(cuts, values) {
+  n = length(cuts)
+  if (n != length(values) - 1)
+    stop("length(cuts) must be equal to length(values) - 1")
+  values = sprintf("'%s'", values)
+  if (n == 0) return(values)
+  if (!all(cuts == sort(cuts))) stop("'cuts' must be sorted increasingly")
+  js = ''
+  for (i in seq_len(n)) {
+    js = paste0(js, sprintf('value <= %s ? %s : ', cuts[i], values[i]))
+  }
+  JS(paste0(js, values[n + 1]))
+}
+
+#' @param levels a character vector of data values to be mapped (one-to-one) to
+#'   CSS values
+#' @export
+#' @rdname styleInterval
+styleEqual = function(levels, values) {
+  n = length(levels)
+  if (n != length(values))
+    stop("length(levels) must be equal to length(values)")
+  if (n == 0) return("''")
+  js = ''
+  for (i in seq_len(n)) {
+    js = paste0(js, sprintf("value == '%s' ? '%s' : ", levels[i], values[i]))
+  }
+  JS(paste0(js, "''"))
+}
+
+#' @param data a numeric vector whose range will be used for scaling the
+#' table data from 0-100 before being represented as color bars. A vector
+#' of length 2 is acceptable here for specifying a range possibly wider or
+#' narrower than the range of the table data itself.
+#' @param color the color of the bars
+#' @param angle a number of degrees representing the direction to fill the
+#' gradient relative to a horizontal line and the gradient line, going
+#' counter-clockwise. For example, 90 fills right to left and -90 fills
+#' left to right.
+#' @export
+#' @rdname styleInterval
+styleColorBar = function(data, color, angle=90) {
+  rg = range(data, na.rm = TRUE, finite = TRUE)
+  r1 = rg[1]; r2 = rg[2]; r = r2 - r1
+  JS(sprintf(
+    "isNaN(parseFloat(value)) || value <= %s ? '' : 'linear-gradient(%sdeg, transparent ' + (%s - value)/%s * 100 + '%%, %s ' + (%s - value)/%s * 100 + '%%)'",
+    r1, angle, r2, r, color, r2, r
+  ))
+}
diff --git a/R/package.R b/R/package.R
new file mode 100644
index 0000000..09f1ae6
--- /dev/null
+++ b/R/package.R
@@ -0,0 +1,8 @@
+#' @importFrom htmlwidgets JS saveWidget
+#' @export JS saveWidget
+#' @importFrom magrittr %>%
+#' @export %>%
+#' @import stats utils
+NULL
+
+DataTablesVersion = '1.10.12'
diff --git a/R/shiny.R b/R/shiny.R
new file mode 100644
index 0000000..69dec09
--- /dev/null
+++ b/R/shiny.R
@@ -0,0 +1,524 @@
+#' Helper functions for using DT in Shiny
+#'
+#' These two functions are like most \code{fooOutput()} and \code{renderFoo()}
+#' functions in the \pkg{shiny} package. The former is used to create a
+#' container for table, and the latter is used in the server logic to render the
+#' table.
+#' @inheritParams shiny::dataTableOutput
+#' @param width the width of the table container
+#' @param height the height of the table container
+#' @references \url{http://rstudio.github.io/DT/shiny.html}
+#' @export
+#' @examples # !formatR
+#' if (interactive()) {
+#'   library(shiny)
+#'   shinyApp(
+#'     ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
+#'     server = function(input, output) {
+#'       output$tbl = DT::renderDataTable(
+#'         iris, options = list(lengthChange = FALSE)
+#'       )
+#'     }
+#'   )
+#' }
+dataTableOutput = function(outputId, width = '100%', height = 'auto') {
+  htmlwidgets::shinyWidgetOutput(
+    outputId, 'datatables', width, height, package = 'DT'
+  )
+}
+
+#' @export
+#' @rdname dataTableOutput
+#' @inheritParams shiny::renderDataTable
+#' @param expr an expression to create a table widget (normally via
+#'   \code{\link{datatable}()}), or a data object to be passed to
+#'   \code{datatable()} to create a table widget
+#' @param server whether to use server-side processing. If \code{TRUE}, then the
+#'   data is kept on the server and the browser requests a page at a time; if
+#'   \code{FALSE}, then the entire data frame is sent to the browser at once.
+#'   Highly recommended for medium to large data frames, which can cause
+#'   browsers to slow down or crash.
+#' @param ... ignored when \code{expr} returns a table widget, and passed as
+#'   additional arguments to \code{datatable()} when \code{expr} returns a data
+#'   object
+renderDataTable = function(expr, server = TRUE, env = parent.frame(), quoted = FALSE, ...) {
+  if (!quoted) expr = substitute(expr)
+
+  # TODO: this can be simplified after this htmlwidgets PR is merged
+  # https://github.com/ramnathv/htmlwidgets/pull/122
+  currentSession = NULL
+  currentOutputName = NULL
+
+  exprFunc = shiny::exprToFunction(expr, env, quoted = TRUE)
+  widgetFunc = function() {
+    instance = exprFunc()
+    if (!all(c('datatables', 'htmlwidget') %in% class(instance))) {
+      instance = datatable(instance, ...)
+    } else if (length(list(...)) != 0) {
+      warning("renderDataTable ignores ... arguments when expr yields a datatable object; see ?renderDataTable")
+    }
+
+    # in the server mode, we should not store the full data in JSON
+    if (server && !is.null(instance[['x']])) {
+      origData = instance[['x']][['data']]
+      instance$x$data = NULL
+
+      # register the data object in a shiny session
+      options = instance[['x']][['options']]
+
+      # Normalize "ajax" argument; if we leave it a string then we have several
+      # code paths that need to account for both string and list representations
+      if (is.character(options[['ajax']])) {
+        options$ajax = list(url = options$ajax)
+      }
+
+      if (is.null(options[['ajax']][['url']])) {
+        url = sessionDataURL(currentSession, origData, currentOutputName, dataTablesFilter)
+        options$ajax$url = url
+      }
+      instance$x$options = fixServerOptions(options)
+    }
+
+    instance
+  }
+
+  renderFunc = htmlwidgets::shinyRenderWidget(
+    widgetFunc(), dataTableOutput, environment(), FALSE
+  )
+
+  shiny::markRenderFunction(dataTableOutput, function(shinysession, name, ...) {
+    currentSession <<- shinysession
+    currentOutputName <<- name
+    on.exit({
+      currentSession <<- NULL
+      currentOutputName <<- NULL
+    }, add = TRUE)
+
+    renderFunc()
+  })
+}
+
+#' Manipulate an existing DataTables instance in a Shiny app
+#'
+#' The function \code{datatableProxy()} creates a proxy object that can be used
+#' to manipulate an existing DataTables instance in a Shiny app, e.g. select
+#' rows/columns, or add rows.
+#' @param outputId the id of the table to be manipulated (the same id as the one
+#'   you used in \code{\link{dataTableOutput}()})
+#' @param session the Shiny session object (from the server function of the
+#'   Shiny app)
+#' @param deferUntilFlush whether an action should be carried out right away, or
+#'   should be held until after the next time all of the outputs are updated
+#' @note \code{addRow()} only works for client-side tables. If you want to use
+#'   it in a Shiny app, make sure to use \code{renderDataTable(..., server =
+#'   FALSE)}.
+#' @references \url{http://rstudio.github.io/DT/shiny.html}
+#' @rdname proxy
+#' @export
+dataTableProxy = function(
+  outputId, session = shiny::getDefaultReactiveDomain(), deferUntilFlush = TRUE
+) {
+  if (is.null(session))
+    stop('datatableProxy() must be called from the server function of a Shiny app')
+
+  structure(
+    list(id = outputId, session = session, deferUntilFlush = deferUntilFlush),
+    class = 'datatableProxy'
+  )
+}
+
+#' @param proxy a proxy object returned by \code{dataTableProxy()}
+#' @param selected an integer vector of row/column indices, or a matrix of two
+#'   columns (row and column indices, respectively) for cell indices; you may
+#'   use \code{NULL} to clear existing selections
+#' @rdname proxy
+#' @export
+selectRows = function(proxy, selected) {
+  invokeRemote(proxy, 'selectRows', list(I(selected)))
+}
+
+#' @rdname proxy
+#' @export
+selectColumns = function(proxy, selected) {
+  invokeRemote(proxy, 'selectColumns', list(I(selected)))
+}
+
+#' @rdname proxy
+#' @export
+selectCells = function(proxy, selected) {
+  invokeRemote(proxy, 'selectCells', list(selected))
+}
+
+#' @param data a single row of data to be added to the table; it can be a matrix
+#'   or data frame of one row, or a vector or list of row data (in the latter
+#'   case, please be cautious about the row name: if your table contains row
+#'   names, here \code{data} must also contain the row name as the first
+#'   element)
+#' @rdname proxy
+#' @export
+addRow = function(proxy, data) {
+  if ((is.matrix(data) || is.data.frame(data)) && nrow(data) != 1)
+    stop("'data' must be of only one row")
+  invokeRemote(proxy, 'addRow', list(as.list(unname(data)), I(rownames(data))))
+}
+
+#' @rdname proxy
+#' @export
+clearSearch = function(proxy) {
+  updateSearch(proxy, list(global = '', columns = ''))
+}
+
+#' @param page a number indicating the page to select
+#' @rdname proxy
+#' @export
+selectPage = function(proxy, page) {
+  invokeRemote(proxy, 'selectPage', list(page))
+}
+
+#' @param caption a new table caption (see the \code{caption} argument of
+#'   \code{\link{datatable}()})
+#' @rdname proxy
+#' @export
+updateCaption = function(proxy, caption) {
+  invokeRemote(proxy, 'updateCaption', list(captionString(caption)))
+}
+
+#' @param keywords a list of two components: \code{global} is the global search
+#'   keyword of a single character string (ignored if \code{NULL});
+#'   \code{columns} is a character vector of the search keywords for all columns
+#'   (when the table has one column for the row names, this vector of keywords
+#'   should contain one keyword for the row names as well)
+#' @rdname proxy
+#' @export
+updateSearch = function(proxy, keywords = list(global = NULL, columns = NULL)) {
+  global = keywords$global
+  if (is.null(global)) {
+    keywords['global'] = list(NULL)
+  } else {
+    if (!is.character(global) || length(global) != 1)
+      stop('keywords$global must be a character string')
+  }
+  columns = keywords$columns
+  if (is.null(columns)) {
+    keywords['columns'] = list(NULL)
+  } else {
+    if (is.character(columns)) {
+      if (length(columns) == 0) stop(
+        'The length of keywords$columns must be greater than zero if it is a character vector'
+      )
+    } else if (is.list(columns)) {
+      if (any(sapply(columns, length) > 1)) stop(
+        'keywords$columns should be a list of NULL or character strings'
+      )
+    } else stop('keywords$columns must be either a character vector or a list')
+  }
+  invokeRemote(proxy, 'updateSearch', list(keywords))
+}
+
+#' @param resetPaging whether to reset the paging position
+#' @param clearSelection which existing selections to clear: it can be any
+#'   combinations of \code{row}, \code{column}, and \code{cell}, or \code{all}
+#'   for all three, or \code{none} to keep current selections (by default, all
+#'   selections are cleared after the data is reloaded)
+#' @note \code{reloadData()} only works for tables in the server-side processing
+#'   mode, e.g. tables rendered with \code{renderDataTable(server = TRUE)}. The
+#'   data to be reloaded (i.e. the one you pass to \code{dataTableAjax()}) must
+#'   have exactly the same number of columns as the previous data object in the
+#'   table.
+#' @rdname proxy
+#' @export
+reloadData = function(
+  proxy, resetPaging = TRUE, clearSelection = c('all', 'none', 'row', 'column', 'cell')
+) {
+  if ('all' %in% clearSelection) clearSelection = c('row', 'column', 'cell')
+  invokeRemote(proxy, 'reloadData', list(resetPaging, clearSelection))
+}
+
+#' Replace data in an existing table
+#'
+#' Replace the data object of a table output and avoid regenerating the full
+#' table, in which case the state of the current table will be preserved
+#' (sorting, filtering, and pagination) and applied to the table with new data.
+#' @param proxy a proxy object created by \code{dataTableProxy()}
+#' @param data the new data object to be loaded in the table
+#' @param ... other arguments to be passed to \code{\link{dataTableAjax}()}
+#' @param resetPaging,clearSelection passed to \code{\link{reloadData}()}
+#' @note When you replace the data in an existing table, please make sure the
+#'   new data has the same number of columns as the current data. When you have
+#'   enabled column filters, you should also make sure the attributes of every
+#'   column remain the same, e.g. factor columns should have the same or fewer
+#'   levels, and numeric columns should have the same or smaller range,
+#'   otherwise the filters may never be able to reach certain rows in the data.
+#' @export
+replaceData = function(proxy, data, ..., resetPaging = TRUE, clearSelection = 'all') {
+  dataTableAjax(proxy$session, data, ..., outputId = proxy$id)
+  reloadData(proxy, resetPaging, clearSelection)
+}
+
+invokeRemote = function(proxy, method, args = list()) {
+  if (!inherits(proxy, 'datatableProxy'))
+    stop('Invalid proxy argument; table proxy object was expected')
+
+  msg = list(id = proxy$id, call = list(method = method, args = args))
+
+  sess = proxy$session
+  if (proxy$deferUntilFlush) {
+    sess$onFlushed(function() {
+      sess$sendCustomMessage('datatable-calls', msg)
+    }, once = TRUE)
+  } else {
+    sess$sendCustomMessage('datatable-calls', msg)
+  }
+  proxy
+}
+
+shinyFun = function(name) getFromNamespace(name, 'shiny')
+
+#' Register a data object in a shiny session for DataTables
+#'
+#' This function stores a data object in a shiny session and returns a URL that
+#' returns JSON data based on DataTables Ajax requests. The URL can be used as
+#' the \code{url} option inside the \code{ajax} option of the table. It is
+#' basically an implementation of server-side processing of DataTables in R.
+#' Filtering, sorting, and pagination are processed through R instead of
+#' JavaScript (client-side processing).
+#'
+#' Normally you should not need to call this function directly. It is called
+#' internally when a table widget is rendered in a Shiny app to configure the
+#' table option \code{ajax} automatically. If you are familiar with
+#' \pkg{DataTables}' server-side processing, and want to use a custom filter
+#' function, you may call this function to get an Ajax URL.
+#' @param session the \code{session} object in the shiny server function
+#'   (\code{function(input, output, session)})
+#' @param data a data object (will be coerced to a data frame internally)
+#' @param rownames see \code{\link{datatable}()}; it must be consistent with
+#'   what you use in \code{datatable()}, e.g. if the widget is generated by
+#'   \code{datatable(rownames = FALSE)}, you must also use
+#'   \code{dataTableAjax(rownames = FALSE)} here
+#' @param filter (for expert use only) a function with two arguments \code{data}
+#'   and \code{params} (Ajax parameters, a list of the form \code{list(search =
+#'   list(value = 'FOO', regex = 'false'), length = 10, ...)}) that return the
+#'   filtered table result according to the DataTables Ajax request
+#' @param outputId the output ID of the table (the same ID passed to
+#'   \code{dataTableOutput()}; if missing, a random string)
+#' @references \url{http://rstudio.github.io/DT/server.html}
+#' @return A character string (an Ajax URL that can be queried by DataTables).
+#' @example inst/examples/ajax-shiny.R
+#' @export
+dataTableAjax = function(session, data, rownames, filter = dataTablesFilter, outputId) {
+
+  oop = options(stringsAsFactors = FALSE); on.exit(options(oop), add = TRUE)
+
+  # abuse tempfile() to obtain a random id unique to this R session
+  if (missing(outputId)) outputId = basename(tempfile(''))
+
+  # deal with row names: rownames = TRUE or missing, use rownames(data)
+  rn = if (missing(rownames) || isTRUE(rownames)) base::rownames(data) else {
+    if (is.character(rownames)) rownames  # use custom row names
+  }
+  data = as.data.frame(data)  # think dplyr
+  if (length(rn)) data = cbind(' ' = rn, data)
+
+  sessionDataURL(session, data, outputId, filter)
+}
+
+sessionDataURL = function(session, data, id, filter) {
+
+  URLdecode = shinyFun('URLdecode')
+  toJSON = shinyFun('toJSON')
+  httpResponse = shinyFun('httpResponse')
+
+  filterFun = function(data, req) {
+    # DataTables requests were sent via POST
+    params = URLdecode(rawToChar(req$rook.input$read()))
+    Encoding(params) = 'UTF-8'
+    # use system native encoding if possible (again, this grep(fixed = TRUE) bug
+    # https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=16264)
+    params2 = iconv(params, 'UTF-8', '')
+    if (!is.na(params2)) params = params2 else warning(
+      'Some DataTables parameters contain multibyte characters ',
+      'that do not work in current locale.'
+    )
+    params = shiny::parseQueryString(params, nested = TRUE)
+
+    res = tryCatch(filter(data, params), error = function(e) {
+      list(error = as.character(e))
+    })
+    httpResponse(200, 'application/json', enc2utf8(toJSON(res, dataframe = 'rows')))
+  }
+
+  session$registerDataObj(id, data, filterFun)
+}
+
+# filter a data frame according to the DataTables request parameters
+dataTablesFilter = function(data, params) {
+  n = nrow(data)
+  q = params
+  ci = q$search[['caseInsensitive']] == 'true'
+  # users may be updating the table too frequently
+  if (length(q$columns) != ncol(data)) return(list(
+    draw = as.integer(q$draw),
+    recordsTotal = n,
+    recordsFiltered = 0,
+    data = list(),
+    DT_rows_all = seq_len(n),
+    DT_rows_current = list()
+  ))
+
+  # global searching
+  i = logical(n)
+  # for some reason, q$search might be NULL, leading to error `if (logical(0))`
+  if (isTRUE(q$search[['value']] != '')) for (j in seq_len(ncol(data))) {
+    if (q$columns[[j]][['searchable']] != 'true') next
+    i0 = grep2(
+      q$search[['value']], as.character(data[, j]),
+      fixed = q$search[['regex']] == 'false', ignore.case = ci
+    )
+    i[i0] = TRUE
+  } else i = !i
+  i = which(i)
+
+  # search by columns
+  if (length(i)) for (j in names(q$columns)) {
+    col = q$columns[[j]]
+    # if the j-th column is not searchable or the search string is "", skip it
+    if (col[['searchable']] != 'true') next
+    if ((k <- col[['search']][['value']]) == '') next
+    j = as.integer(j)
+    dj = data[, j + 1]
+    ij = if (is.numeric(dj) || is.Date(dj)) {
+      which(filterRange(dj, k))
+    } else if (is.factor(dj)) {
+      which(dj %in% jsonlite::fromJSON(k))
+    } else if (is.logical(dj)) {
+      which(dj %in% as.logical(jsonlite::fromJSON(k)))
+    } else {
+      grep2(k, as.character(dj), fixed = col[['search']][['regex']] == 'false',
+            ignore.case = ci)
+    }
+    i = intersect(ij, i)
+    if (length(i) == 0) break
+  }
+  if (length(i) != n) data = data[i, , drop = FALSE]
+  iAll = i  # row indices of filtered data
+
+  # sorting
+  oList = list()
+  for (ord in q$order) {
+    k = ord[['column']]  # which column to sort
+    d = ord[['dir']]     # direction asc/desc
+    if (q$columns[[k]][['orderable']] != 'true') next
+    col = data[, as.integer(k) + 1]
+    oList[[length(oList) + 1]] = (if (d == 'asc') identity else `-`)(
+      if (is.numeric(col)) col else xtfrm(col)
+    )
+  }
+  if (length(oList)) {
+    i = do.call(order, oList)
+    data = data[i, , drop = FALSE]
+    iAll = iAll[i]
+  }
+  # paging
+  if (q$length != '-1') {
+    len = as.integer(q$length)
+    # I don't know why this can happen, but see https://github.com/rstudio/DT/issues/164
+    if (is.na(len)) {
+      warning("The DataTables parameter 'length' is '", q$length, "' (invalid).")
+      len = 0
+    }
+    i = seq(as.integer(q$start) + 1L, length.out = len)
+    i = i[i <= nrow(data)]
+    fdata = data[i, , drop = FALSE]  # filtered data
+    iCurrent = iAll[i]
+  } else {
+    fdata = data
+    iCurrent = iAll
+  }
+
+  if (q$escape != 'false') {
+    k = seq_len(ncol(fdata))
+    if (q$escape != 'true') {
+      # q$escape might be negative indices, e.g. c(-1, -5)
+      k = k[as.integer(strsplit(q$escape, ',')[[1]])]
+    }
+    for (j in k) if (maybe_character(fdata[, j])) fdata[, j] = htmlEscape(fdata[, j])
+  }
+
+  # TODO: if iAll is just 1:n, is it necessary to pass this vector to JSON, then
+  # to R? When n is large, it may not be very efficient
+  list(
+    draw = as.integer(q$draw),
+    recordsTotal = n,
+    recordsFiltered = nrow(data),
+    data = unname(fdata),
+    DT_rows_all = iAll,
+    DT_rows_current = iCurrent
+  )
+}
+
+# when both ignore.case and fixed are TRUE, we use grep(ignore.case = FALSE,
+# fixed = TRUE) to do lower-case matching of pattern on x
+grep2 = function(pattern, x, ignore.case = FALSE, fixed = FALSE, ...) {
+  if (fixed && ignore.case) {
+    pattern = tolower(pattern)
+    x = tolower(x)
+    ignore.case = FALSE
+  }
+  # when the user types in the search box, the regular expression may not be
+  # complete before it is sent to the server, in which case we do not search
+  if (!fixed && inherits(try(grep(pattern, ''), silent = TRUE), 'try-error'))
+    return(seq_along(x))
+  grep(pattern, x, ignore.case = ignore.case, fixed = fixed, ...)
+}
+
+# filter a numeric/date/time vector using the search string "lower ... upper"
+filterRange = function(d, string) {
+  if (!grepl('[.]{3}', string) || length(r <- strsplit(string, '[.]{3}')[[1]]) > 2)
+    stop('The range of a numeric / date / time column must be of length 2')
+  if (length(r) == 1) r = c(r, '')  # lower,
+  r = gsub('^\\s+|\\s+$', '', r)
+  r1 = r[1]; r2 = r[2]
+  if (is.numeric(d)) {
+    r1 = as.numeric(r1); r2 = as.numeric(r2)
+  } else if (inherits(d, 'Date')) {
+    if (r1 != '') r1 = as.Date(r1)
+    if (r2 != '') r2 = as.Date(r2)
+  } else {
+    if (r1 != '') r1 = as.POSIXct(r1, tz = 'GMT', '%Y-%m-%dT%H:%M:%S')
+    if (r2 != '') r2 = as.POSIXct(r2, tz = 'GMT', '%Y-%m-%dT%H:%M:%S')
+  }
+  if (r[1] == '') return(d <= r2)
+  if (r[2] == '') return(d >= r1)
+  d >= r1 & d <= r2
+}
+
+# treat factors as characters
+maybe_character = function(x) {
+  is.character(x) || is.factor(x)
+}
+
+fixServerOptions = function(options) {
+  options$serverSide = TRUE
+  if (is.null(options$processing)) options$processing = TRUE
+
+  # if you generated the Ajax URL from dataTableAjax(), I'll configure type:
+  # 'POST' and a few other options automatically
+  if (!inShiny()) return(options)
+  if (length(grep('^session/[a-z0-9]+/dataobj/', options$ajax$url)) == 0)
+    return(options)
+
+  if (is.null(options$ajax$type)) options$ajax$type = 'POST'
+  if (is.null(options$ajax$data)) options$ajax$data = JS(
+    'function(d) {',
+    sprintf(
+      'd.search.caseInsensitive = %s;',
+      tolower(!isFALSE(options[['search']]$caseInsensitive))
+    ),
+    sprintf('d.escape = %s;', attr(options, 'escapeIdx', exact = TRUE)),
+    'var encodeAmp = function(x) { x.value = x.value.replace(/&/g, "%26"); }',
+    'encodeAmp(d.search);',
+    '$.each(d.columns, function(i, v) {encodeAmp(v.search);});',
+    '}'
+  )
+  options
+}
diff --git a/R/utils.R b/R/utils.R
new file mode 100644
index 0000000..ae990d8
--- /dev/null
+++ b/R/utils.R
@@ -0,0 +1,33 @@
+dropNULL = function(x) {
+  if (length(x) == 0 || !is.list(x)) return(x)
+  x[!unlist(lapply(x, is.null))]
+}
+
+isFALSE = function(x) identical(x, FALSE)
+
+is.Date = function(x) inherits(x, c('Date', 'POSIXlt', 'POSIXct'))
+
+# for CSS propertices: fontWeight -> font-weight, backgroundColor ->
+# background-color, etc
+upperToDash = function(x) {
+  x = gsub('^(.)', '\\L\\1', x, perl = TRUE)
+  x = gsub('([A-Z])', '-\\L\\1', x, perl = TRUE)
+  x
+}
+
+# not rigorous, but should work in most cases
+inShiny = function() 'shiny' %in% loadedNamespaces()
+
+in_dir = function(dir, expr) {
+  owd = setwd(dir); on.exit(setwd(owd))
+  expr
+}
+
+existing_files = function(x) x[file.exists(x)]
+
+# generate <caption></caption>
+captionString = function(caption) {
+  if (is.character(caption)) caption = tags$caption(caption)
+  caption = as.character(caption)
+  if (length(caption)) caption
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..17f372f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,21 @@
+# An R interface to the DataTables library
+
+[![Build Status](https://travis-ci.org/rstudio/DT.svg)](https://travis-ci.org/rstudio/DT)
+
+This package provides a function `datatable()` to display R data via the [DataTables](http://datatables.net/) library (N.B. not to be confused with the **data.table** package).
+
+## Installation
+
+You may install the stable version from CRAN, or the development version using **devtools**:
+
+```r
+# install from CRAN
+install.packages('DT')
+
+# or the development version if necessary
+devtools::install_github('rstudio/DT')
+
+# then try DT::datatable(iris) as a hello world example
+```
+
+See the full documentation at <http://rstudio.github.io/DT>. Please use [Github issues](https://github.com/rstudio/DT/issues) if you want to file bug reports or feature requests, and you may use [StackOverflow](http://stackoverflow.com/questions/tagged/dt) or the [shiny-discuss](https://groups.google.com/forum/#!forum/shiny-discuss) mailing list to ask questions.
diff --git a/build/vignette.rds b/build/vignette.rds
new file mode 100644
index 0000000..fa35b81
Binary files /dev/null and b/build/vignette.rds differ
diff --git a/inst/doc/DT.Rmd b/inst/doc/DT.Rmd
new file mode 100644
index 0000000..a06f85d
--- /dev/null
+++ b/inst/doc/DT.Rmd
@@ -0,0 +1,26 @@
+---
+title: "An Introduction to the DT Package"
+author: "Yihui Xie"
+date: '`r Sys.Date()`'
+output:
+  knitr:::html_vignette:
+    number_sections: yes
+    toc: yes
+vignette: |
+  %\VignetteIndexEntry{An Introduction to the DT Package}
+  %\VignetteEngine{knitr::rmarkdown_notangle}
+---
+
+<style type="text/css">
+table, table th, table td {
+  border: none;
+}
+</style>
+
+Please see http://rstudio.github.io/DT for the full documentation. Here is only a minimal example:
+
+```{r}
+library(DT)
+datatable(iris)
+```
+
diff --git a/inst/doc/DT.html b/inst/doc/DT.html
new file mode 100644
index 0000000..885fcd1
--- /dev/null
+++ b/inst/doc/DT.html
@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<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">
+
+<meta name="author" content="Yihui Xie" />
+
+<meta name="date" content="2016-08-08" />
+
+<title>An Introduction to the DT Package</title>
+
+<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZS [...]
+<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKX [...]
+<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewoKLy8gc29tZSBoZWxwZXIgZnVuY3Rpb25zOiB1c2luZyBhIGdsb2JhbCBvYmplY3QgRFRXaWRnZXQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZAovLyBpbiBKUygpIGNvZGUsIGUuZy4gZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KGZvbyA9IEpTKCdjb2RlJykpKTsgdW5saWtlIFIncwovLyBkeW5hbWljIHNjb3BpbmcsIHdoZW4gJ2NvZGUnIGlzIGV2YWwoKSdlZCwgSmF2YVNjcmlwdCBkb2VzIG5vdCBrbm93IG9iamVjdHMKLy8gZnJvbSB0aGUgInBhcmVudCBmcmFtZSIsIGUuZy4gSlMoJ0RUV2lkZ2V0Jykgd2lsbCBub3Qgd29yayB1bmxlc3MgaXQgd2FzIG1hZG [...]
+<link href="data:text/css;charset=utf-8,table%2EdataTable%7Bwidth%3A100%25%3Bmargin%3A0%20auto%3Bclear%3Aboth%3Bborder%2Dcollapse%3Aseparate%3Bborder%2Dspacing%3A0%7Dtable%2EdataTable%20thead%20th%2Ctable%2EdataTable%20tfoot%20th%7Bfont%2Dweight%3Abold%7Dtable%2EdataTable%20thead%20th%2Ctable%2EdataTable%20thead%20td%7Bpadding%3A10px%2018px%3Bborder%2Dbottom%3A1px%20solid%20%23111%7Dtable%2EdataTable%20thead%20th%3Aactive%2Ctable%2EdataTable%20thead%20td%3Aactive%7Boutline%3Anone%7Dtable [...]
+<link href="data:text/css;charset=utf-8,%0Atable%2EdataTable%20tr%2Eselected%20td%2C%20table%2EdataTable%20td%2Eselected%20%7B%0Abackground%2Dcolor%3A%20%23b0bed9%20%21important%3B%0A%7D%0A%0A%2EdataTables%5FscrollBody%20%2EdataTables%5Fsizing%20%7B%0Avisibility%3A%20hidden%3B%0A%7D%0A" rel="stylesheet" />
+<script src="data:application/x-javascript;base64,LyohCiBEYXRhVGFibGVzIDEuMTAuMTIKIMKpMjAwOC0yMDE1IFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiovCihmdW5jdGlvbihoKXsiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxmdW5jdGlvbihEKXtyZXR1cm4gaChELHdpbmRvdyxkb2N1bWVudCl9KToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKEQsSSl7RHx8KEQ9d2luZG93KTtJfHwoST0idW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3c/cmVxdWlyZSgianF1ZXJ5Iik6cmVxdWlyZSgianF1ZXJ5IikoRC [...]
+
+
+<style type="text/css">code{white-space: pre;}</style>
+<style type="text/css">
+div.sourceCode { overflow-x: auto; }
+table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
+  margin: 0; padding: 0; vertical-align: baseline; border: none; }
+table.sourceCode { width: 100%; line-height: 100%; }
+td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
+td.sourceCode { padding-left: 5px; }
+code > span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code > span.dt { color: #902000; } /* DataType */
+code > span.dv { color: #40a070; } /* DecVal */
+code > span.bn { color: #40a070; } /* BaseN */
+code > span.fl { color: #40a070; } /* Float */
+code > span.ch { color: #4070a0; } /* Char */
+code > span.st { color: #4070a0; } /* String */
+code > span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code > span.ot { color: #007020; } /* Other */
+code > span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code > span.fu { color: #06287e; } /* Function */
+code > span.er { color: #ff0000; font-weight: bold; } /* Error */
+code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+code > span.cn { color: #880000; } /* Constant */
+code > span.sc { color: #4070a0; } /* SpecialChar */
+code > span.vs { color: #4070a0; } /* VerbatimString */
+code > span.ss { color: #bb6688; } /* SpecialString */
+code > span.im { } /* Import */
+code > span.va { color: #19177c; } /* Variable */
+code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code > span.op { color: #666666; } /* Operator */
+code > span.bu { } /* BuiltIn */
+code > span.ex { } /* Extension */
+code > span.pp { color: #bc7a00; } /* Preprocessor */
+code > span.at { color: #7d9029; } /* Attribute */
+code > span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+</style>
+
+
+
+<link href="data:text/css;charset=utf-8,body%20%7B%0Abackground%2Dcolor%3A%20%23fff%3B%0Amargin%3A%201em%20auto%3B%0Amax%2Dwidth%3A%20800px%3B%0Aoverflow%3A%20visible%3B%0Apadding%2Dleft%3A%202em%3B%0Apadding%2Dright%3A%202em%3B%0Afont%2Dfamily%3A%20%22Helvetica%20Neue%22%2C%20Helvetica%2C%20Arial%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2014px%3B%0Aline%2Dheight%3A%2020px%3B%0A%7D%0A%23header%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0A%23TOC%20%7B%0Aclear%3A%20both%3B%0Amargin%3A%200%200% [...]
+
+</head>
+
+<body>
+
+
+
+
+<h1 class="title toc-ignore">An Introduction to the DT Package</h1>
+<h4 class="author"><em>Yihui Xie</em></h4>
+<h4 class="date"><em>2016-08-08</em></h4>
+
+
+
+<style type="text/css">
+table, table th, table td {
+  border: none;
+}
+</style>
+<p>Please see <a href="http://rstudio.github.io/DT" class="uri">http://rstudio.github.io/DT</a> for the full documentation. Here is only a minimal example:</p>
+<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(DT)
+<span class="kw">datatable</span>(iris)</code></pre></div>
+<div id="htmlwidget-e54b06540b86013b99e9" style="width:100%;height:auto;" class="datatables html-widget"></div>
+<script type="application/json" data-for="htmlwidget-e54b06540b86013b99e9">{"x":{"filter":"none","data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79", [...]
+
+<script type="text/javascript">
+window.onload = function() {
+  var i, fig = 1, caps = document.getElementsByClassName('caption');
+  for (i = 0; i < caps.length; i++) {
+    var cap = caps[i];
+    if (cap.parentElement.className !== 'figure' || cap.nodeName !== 'P')
+      continue;
+    cap.innerHTML = '<span>Figure ' + fig + ':</span> ' + cap.innerHTML;
+    fig++;
+  }
+  fig = 1;
+  caps = document.getElementsByTagName('caption');
+  for (i = 0; i < caps.length; i++) {
+    var cap = caps[i];
+    if (cap.parentElement.nodeName !== 'TABLE') continue;
+    cap.innerHTML = '<span>Table ' + fig + ':</span> ' + cap.innerHTML;
+    fig++;
+  }
+}
+</script>
+
+
+<!-- dynamically load mathjax for compatibility with self-contained -->
+<script>
+  (function () {
+    var script = document.createElement("script");
+    script.type = "text/javascript";
+    script.src  = "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
+    document.getElementsByTagName("head")[0].appendChild(script);
+  })();
+</script>
+
+</body>
+</html>
diff --git a/inst/examples/DT-click/DESCRIPTION b/inst/examples/DT-click/DESCRIPTION
new file mode 100644
index 0000000..1c4ca6c
--- /dev/null
+++ b/inst/examples/DT-click/DESCRIPTION
@@ -0,0 +1,6 @@
+Title: Interaction with Table Cells
+Author: Yihui Xie
+AuthorUrl: http://www.rstudio.com
+License: MIT
+DisplayMode: Showcase
+Type: Shiny
diff --git a/inst/examples/DT-click/Readme.md b/inst/examples/DT-click/Readme.md
new file mode 100644
index 0000000..d300262
--- /dev/null
+++ b/inst/examples/DT-click/Readme.md
@@ -0,0 +1,5 @@
+This example demonstrates the interaction with table cells. You can click on the
+row ID's, and you will be navigated to the `Plot` tab. The text input there will
+get the value of the clicked cell, and the plot will be updated accordingly.
+
+**DT** (>= 0.1.26) is required to run this example.
diff --git a/inst/examples/DT-click/rsconnect/shinyapps.io/yihui/DT-click.dcf b/inst/examples/DT-click/rsconnect/shinyapps.io/yihui/DT-click.dcf
new file mode 100644
index 0000000..aac94e1
--- /dev/null
+++ b/inst/examples/DT-click/rsconnect/shinyapps.io/yihui/DT-click.dcf
@@ -0,0 +1,9 @@
+name: DT-click
+account: yihui
+server: shinyapps.io
+appId: 49537
+bundleId: 519178
+url: https://yihui.shinyapps.io/DT-click/
+when: 1469808742.23965
+asMultiple: FALSE
+asStatic: FALSE
diff --git a/inst/examples/DT-click/server.R b/inst/examples/DT-click/server.R
new file mode 100644
index 0000000..a659d1c
--- /dev/null
+++ b/inst/examples/DT-click/server.R
@@ -0,0 +1,29 @@
+library(shiny)
+library(DT)
+
+shinyServer(function(input, output, session) {
+
+  # add CSS style 'cursor: pointer' to the 0-th column (i.e. row names)
+  output$x1 = DT::renderDataTable({
+    datatable(
+      cars, selection = 'none', class = 'cell-border strip hover'
+    ) %>% formatStyle(0, cursor = 'pointer')
+  })
+
+  observeEvent(input$x1_cell_clicked, {
+    info = input$x1_cell_clicked
+    # do nothing if not clicked yet, or the clicked cell is not in the 1st column
+    if (is.null(info$value) || info$col != 0) return()
+    updateTabsetPanel(session, 'x0', selected = 'Plot')
+    updateTextInput(session, 'x2', value = info$value)
+  })
+
+  # highlight the point of the selected cell
+  output$x3 = renderPlot({
+    par(mar = c(4, 4, 1, .1))
+    plot(cars)
+    id = input$x2
+    if (id != '') points(cars[id, , drop = FALSE], pch = 19, cex = 2)
+  })
+
+})
diff --git a/inst/examples/DT-click/ui.R b/inst/examples/DT-click/ui.R
new file mode 100644
index 0000000..d0126f1
--- /dev/null
+++ b/inst/examples/DT-click/ui.R
@@ -0,0 +1,11 @@
+library(shiny)
+
+navbarPage(
+
+  title = 'Interaction with Table Cells', id = 'x0',
+
+  tabPanel('Table', DT::dataTableOutput('x1')),
+
+  tabPanel('Plot', textInput('x2', 'Row ID'), plotOutput('x3'))
+
+)
diff --git a/inst/examples/DT-filter/DESCRIPTION b/inst/examples/DT-filter/DESCRIPTION
new file mode 100644
index 0000000..d26a80c
--- /dev/null
+++ b/inst/examples/DT-filter/DESCRIPTION
@@ -0,0 +1,6 @@
+Title: Column Filters on the Server Side
+Author: Yihui Xie
+AuthorUrl: http://www.rstudio.com
+License: MIT
+DisplayMode: Showcase
+Type: Shiny
diff --git a/inst/examples/DT-filter/Readme.md b/inst/examples/DT-filter/Readme.md
new file mode 100644
index 0000000..49cb7e3
--- /dev/null
+++ b/inst/examples/DT-filter/Readme.md
@@ -0,0 +1 @@
+This app shows how column filters provided by the **DT** package work in shiny. Different types of columns are presented in the table: character (`name`), numeric (`mpg` and `hp`), factor (`am`), and date (`date`).
diff --git a/inst/examples/DT-filter/rsconnect/shinyapps.io/yihui/DT-filter.dcf b/inst/examples/DT-filter/rsconnect/shinyapps.io/yihui/DT-filter.dcf
new file mode 100644
index 0000000..1fdacfa
--- /dev/null
+++ b/inst/examples/DT-filter/rsconnect/shinyapps.io/yihui/DT-filter.dcf
@@ -0,0 +1,9 @@
+name: DT-filter
+account: yihui
+server: shinyapps.io
+appId: 36229
+bundleId: 519181
+url: https://yihui.shinyapps.io/DT-filter/
+when: 1469808832.61345
+asMultiple: FALSE
+asStatic: FALSE
diff --git a/inst/examples/DT-filter/server.R b/inst/examples/DT-filter/server.R
new file mode 100644
index 0000000..0a9b8cd
--- /dev/null
+++ b/inst/examples/DT-filter/server.R
@@ -0,0 +1,17 @@
+library(shiny)
+library(DT)
+
+shinyServer(function(input, output, session) {
+
+  mtcars2 = data.frame(
+    name = rownames(mtcars), mtcars[, c('mpg', 'hp')],
+    stringsAsFactors = FALSE
+  )
+  mtcars2$am = factor(mtcars$am, labels = c('automatic', 'manual'))
+  mtcars2$date = Sys.Date() + seq_len(nrow(mtcars))
+
+  output$tbl = DT::renderDataTable(
+    mtcars2, filter = 'top', server = TRUE, rownames = FALSE,
+    options = list(autoWidth = TRUE)
+  )
+})
diff --git a/inst/examples/DT-filter/ui.R b/inst/examples/DT-filter/ui.R
new file mode 100644
index 0000000..57a2e2b
--- /dev/null
+++ b/inst/examples/DT-filter/ui.R
@@ -0,0 +1,8 @@
+library(shiny)
+
+shinyUI(fluidPage(
+  title = 'Column Filters on the Server Side',
+  fluidRow(
+    DT::dataTableOutput('tbl')
+  )
+))
diff --git a/inst/examples/DT-info/DESCRIPTION b/inst/examples/DT-info/DESCRIPTION
new file mode 100644
index 0000000..d4bf287
--- /dev/null
+++ b/inst/examples/DT-info/DESCRIPTION
@@ -0,0 +1,6 @@
+Title: DataTables Information
+Author: Yihui Xie
+AuthorUrl: http://www.rstudio.com
+License: MIT
+DisplayMode: Showcase
+Type: Shiny
diff --git a/inst/examples/DT-info/Readme.md b/inst/examples/DT-info/Readme.md
new file mode 100644
index 0000000..c6bf6b5
--- /dev/null
+++ b/inst/examples/DT-info/Readme.md
@@ -0,0 +1,5 @@
+After you render a table on the page, you can use its output id to access some information about it. Currently the indices of rows on the current page and all pages are available (after filtering is applied). Suppose your output id is `foo`, `input$foo_rows_current` is the indices of rows on the current page, and `input$foo_rows_all` is the indices of rows on all pages.
+
+Navigate through all pages to see how the plot changes. Type in the search box to see the points filtered by the search string. You can also order the columns, e.g. order `hp`, click the pagination buttons, and you will see highlighted points shift to the left or right.
+
+**DT** (>= 0.1.26) is required to run this example.
diff --git a/inst/examples/DT-info/rsconnect/shinyapps.io/yihui/DT-info.dcf b/inst/examples/DT-info/rsconnect/shinyapps.io/yihui/DT-info.dcf
new file mode 100644
index 0000000..187e92b
--- /dev/null
+++ b/inst/examples/DT-info/rsconnect/shinyapps.io/yihui/DT-info.dcf
@@ -0,0 +1,9 @@
+name: DT-info
+account: yihui
+server: shinyapps.io
+appId: 34746
+bundleId: 519183
+url: https://yihui.shinyapps.io/DT-info/
+when: 1469808896.89859
+asMultiple: FALSE
+asStatic: FALSE
diff --git a/inst/examples/DT-info/server.R b/inst/examples/DT-info/server.R
new file mode 100644
index 0000000..5d444a1
--- /dev/null
+++ b/inst/examples/DT-info/server.R
@@ -0,0 +1,61 @@
+library(shiny)
+library(DT)
+
+shinyServer(function(input, output, session) {
+
+  # two columns of the mtcars data
+  mtcars2 = mtcars[, c('hp', 'mpg')]
+
+  # render the table (with row names)
+  output$x1 = DT::renderDataTable(mtcars2, server = FALSE)
+
+  # a scatterplot with certain points highlighted
+  output$x2 = renderPlot({
+
+    s1 = input$x1_rows_current  # rows on the current page
+    s2 = input$x1_rows_all      # rows on all pages (after being filtered)
+
+    par(mar = c(4, 4, 1, .1))
+    plot(mtcars2, pch = 21)
+
+    # solid dots (pch = 19) for current page
+    if (length(s1)) {
+      points(mtcars2[s1, , drop = FALSE], pch = 19, cex = 2)
+    }
+
+    # show red circles when performing searching
+    if (length(s2) > 0 && length(s2) < nrow(mtcars2)) {
+      points(mtcars2[s2, , drop = FALSE], pch = 21, cex = 3, col = 'red')
+    }
+
+    # dynamically change the legend text
+    s = input$x1_search
+    txt = if (is.null(s) || s == '') 'Filtered data' else {
+      sprintf('Data matching "%s"', s)
+    }
+
+    legend(
+      'topright', c('Original data', 'Data on current page', txt),
+      pch = c(21, 19, 21), pt.cex = c(1, 2, 3), col = c(1, 1, 2),
+      y.intersp = 2, bty = 'n'
+    )
+
+  })
+
+  # download the filtered data
+  output$x3 = downloadHandler('mtcars-filtered.csv', content = function(file) {
+    s = input$x1_rows_all
+    write.csv(mtcars2[s, , drop = FALSE], file)
+  })
+
+  output$x4 = DT::renderDataTable(mtcars2, server = TRUE)
+
+  output$x5 = renderPrint({
+    cat('Rows on the current page:\n\n')
+    cat(input$x4_rows_current, sep = ', ')
+    cat('\n\nAll rows:\n\n')
+    cat(input$x4_rows_all, sep = ', ')
+    cat('\n\nSelected rows:\n\n')
+    cat(input$x4_rows_selected, sep = ', ')
+  })
+})
diff --git a/inst/examples/DT-info/ui.R b/inst/examples/DT-info/ui.R
new file mode 100644
index 0000000..8f7863c
--- /dev/null
+++ b/inst/examples/DT-info/ui.R
@@ -0,0 +1,19 @@
+library(shiny)
+
+fluidPage(
+  title = 'DataTables Information',
+  h1('A client-side table'),
+  fluidRow(
+    column(6, DT::dataTableOutput('x1')),
+    column(6, plotOutput('x2', height = 500))
+  ),
+  fluidRow(
+    p(class = 'text-center', downloadButton('x3', 'Download Filtered Data'))
+  ),
+  hr(),
+  h1('A table using server-side processing'),
+  fluidRow(
+    column(6, DT::dataTableOutput('x4')),
+    column(6, verbatimTextOutput('x5'))
+  )
+)
diff --git a/inst/examples/DT-proxy/DESCRIPTION b/inst/examples/DT-proxy/DESCRIPTION
new file mode 100644
index 0000000..8b85e55
--- /dev/null
+++ b/inst/examples/DT-proxy/DESCRIPTION
@@ -0,0 +1,6 @@
+Title: Manipulate a DataTables Instance
+Author: Yihui Xie
+AuthorUrl: http://www.rstudio.com
+License: MIT
+DisplayMode: Showcase
+Type: Shiny
diff --git a/inst/examples/DT-proxy/Readme.md b/inst/examples/DT-proxy/Readme.md
new file mode 100644
index 0000000..b164385
--- /dev/null
+++ b/inst/examples/DT-proxy/Readme.md
@@ -0,0 +1,4 @@
+You can pass a `dataTableProxy()` object to several methods to manipulate an
+existing table without completely re-rendering it.
+
+**DT** (>= 0.1.26) is required to run this example.
diff --git a/inst/examples/DT-proxy/rsconnect/shinyapps.io/yihui/DT-proxy.dcf b/inst/examples/DT-proxy/rsconnect/shinyapps.io/yihui/DT-proxy.dcf
new file mode 100644
index 0000000..358c544
--- /dev/null
+++ b/inst/examples/DT-proxy/rsconnect/shinyapps.io/yihui/DT-proxy.dcf
@@ -0,0 +1,9 @@
+name: DT-proxy
+account: yihui
+server: shinyapps.io
+appId: 50432
+bundleId: 519184
+url: https://yihui.shinyapps.io/DT-proxy/
+when: 1469808958.76347
+asMultiple: FALSE
+asStatic: FALSE
diff --git a/inst/examples/DT-proxy/server.R b/inst/examples/DT-proxy/server.R
new file mode 100644
index 0000000..9ca6a93
--- /dev/null
+++ b/inst/examples/DT-proxy/server.R
@@ -0,0 +1,43 @@
+library(shiny)
+library(DT)
+
+shinyServer(function(input, output, session) {
+
+  # using server = FALSE mainly for addRow(); server = TRUE works for
+  # selectRows() and selectColumns()
+  output$foo = DT::renderDataTable(
+    iris, server = FALSE, selection = list(target = 'row+column'),
+    caption = 'Using a proxy object to manipulate the table'
+  )
+
+  proxy = dataTableProxy('foo')
+
+  observeEvent(input$select1, {
+    proxy %>% selectRows(as.numeric(input$rows))
+  })
+
+  observeEvent(input$select2, {
+    proxy %>% selectColumns(input$col)
+  })
+
+  observeEvent(input$clear1, {
+    proxy %>% selectRows(NULL)
+  })
+
+  observeEvent(input$clear2, {
+    proxy %>% selectColumns(NULL)
+  })
+
+  observeEvent(input$add, {
+    proxy %>% addRow(iris[sample(nrow(iris), 1), , drop = FALSE])
+  })
+
+  observe({
+    if (input$cap != '') proxy %>% updateCaption(input$cap)
+  })
+
+  output$info = renderPrint({
+    list(rows = input$foo_rows_selected, columns = input$foo_columns_selected)
+  })
+
+})
diff --git a/inst/examples/DT-proxy/ui.R b/inst/examples/DT-proxy/ui.R
new file mode 100644
index 0000000..82f7ebb
--- /dev/null
+++ b/inst/examples/DT-proxy/ui.R
@@ -0,0 +1,25 @@
+library(shiny)
+
+fluidPage(
+
+  title = 'Manipulate an Existing Table',
+
+  sidebarLayout(
+    sidebarPanel(
+      selectizeInput('rows', 'Row IDs', choices = seq_len(nrow(iris)), multiple = TRUE),
+      actionButton('select1', 'Select Rows'),
+      actionButton('clear1', 'Clear Rows'),
+      numericInput('col', 'Column ID', 1, min = 1, max = ncol(iris), step = 1),
+      actionButton('select2', 'Select Column'),
+      actionButton('clear2', 'Clear Columns'),
+      hr(),
+      actionButton('add', 'Add Row'),
+      hr(),
+      textInput('cap', 'Table Caption')
+    ),
+    mainPanel(
+      DT::dataTableOutput('foo'),
+      verbatimTextOutput('info')
+    )
+  )
+)
diff --git a/inst/examples/DT-radio/DESCRIPTION b/inst/examples/DT-radio/DESCRIPTION
new file mode 100644
index 0000000..a5d8a5c
--- /dev/null
+++ b/inst/examples/DT-radio/DESCRIPTION
@@ -0,0 +1,6 @@
+Title: Radio buttons in a table
+Author: Yihui Xie
+AuthorUrl: http://www.rstudio.com
+License: MIT
+DisplayMode: Showcase
+Type: Shiny
diff --git a/inst/examples/DT-radio/Readme.md b/inst/examples/DT-radio/Readme.md
new file mode 100644
index 0000000..d29def0
--- /dev/null
+++ b/inst/examples/DT-radio/Readme.md
@@ -0,0 +1,3 @@
+This example shows how to embed radio buttons in a table. The key is `escape = FALSE` since the table cell values are raw HTML that should not be escaped. The JavaScript `callback` is to make sure all rows have their ID's and the class `shiny-input-radiogroup`, so that Shiny can recognize these radio buttons after `Shiny.bindAll()`.
+
+**DT** (>= 0.1.67) is required to run this example.
diff --git a/inst/examples/DT-radio/app.R b/inst/examples/DT-radio/app.R
new file mode 100644
index 0000000..1e5a762
--- /dev/null
+++ b/inst/examples/DT-radio/app.R
@@ -0,0 +1,36 @@
+library(shiny)
+library(DT)
+shinyApp(
+  ui = fluidPage(
+    title = 'Radio buttons in a table',
+    DT::dataTableOutput('foo'),
+    verbatimTextOutput('sel')
+  ),
+  server = function(input, output, session) {
+    m = matrix(
+      as.character(1:5), nrow = 12, ncol = 5, byrow = TRUE,
+      dimnames = list(month.abb, LETTERS[1:5])
+    )
+    for (i in seq_len(nrow(m))) {
+      m[i, ] = sprintf(
+        '<input type="radio" name="%s" value="%s"/>',
+        month.abb[i], m[i, ]
+      )
+    }
+    m
+    output$foo = DT::renderDataTable(
+      m, escape = FALSE, selection = 'none', server = FALSE,
+      options = list(dom = 't', paging = FALSE, ordering = FALSE),
+      callback = JS("table.rows().every(function(i, tab, row) {
+          var $this = $(this.node());
+          $this.attr('id', this.data()[0]);
+          $this.addClass('shiny-input-radiogroup');
+        });
+        Shiny.unbindAll(table.table().node());
+        Shiny.bindAll(table.table().node());")
+    )
+    output$sel = renderPrint({
+      str(sapply(month.abb, function(i) input[[i]]))
+    })
+  }
+)
diff --git a/inst/examples/DT-radio/rsconnect/shinyapps.io/yihui/DT-radio.dcf b/inst/examples/DT-radio/rsconnect/shinyapps.io/yihui/DT-radio.dcf
new file mode 100644
index 0000000..79e18e7
--- /dev/null
+++ b/inst/examples/DT-radio/rsconnect/shinyapps.io/yihui/DT-radio.dcf
@@ -0,0 +1,9 @@
+name: DT-radio
+account: yihui
+server: shinyapps.io
+appId: 118756
+bundleId: 525706
+url: https://yihui.shinyapps.io/DT-radio/
+when: 1470521916.12562
+asMultiple: FALSE
+asStatic: FALSE
diff --git a/inst/examples/DT-reload/app.R b/inst/examples/DT-reload/app.R
new file mode 100644
index 0000000..41f774d
--- /dev/null
+++ b/inst/examples/DT-reload/app.R
@@ -0,0 +1,31 @@
+library(shiny)
+library(DT)
+shinyApp(
+  ui = fluidPage(
+    fluidRow(
+      column(2, actionButton('refresh', 'Refresh Data', icon = icon('refresh'))),
+      column(10, DT::dataTableOutput('foo'))
+    )
+  ),
+
+  server = function(input, output, session) {
+
+    df = iris
+    n = nrow(df)
+    df$ID = seq_len(n)
+
+    loopData = reactive({
+      input$refresh
+      df$ID <<- c(df$ID[n], df$ID[-n])
+      df
+    })
+
+    output$foo = DT::renderDataTable(isolate(loopData()))
+
+    proxy = dataTableProxy('foo')
+
+    observe({
+      replaceData(proxy, loopData(), resetPaging = FALSE)
+    })
+  }
+)
diff --git a/inst/examples/DT-rows/DESCRIPTION b/inst/examples/DT-rows/DESCRIPTION
new file mode 100644
index 0000000..89b0843
--- /dev/null
+++ b/inst/examples/DT-rows/DESCRIPTION
@@ -0,0 +1,6 @@
+Title: Row Selection
+Author: Yihui Xie
+AuthorUrl: http://www.rstudio.com
+License: MIT
+DisplayMode: Showcase
+Type: Shiny
diff --git a/inst/examples/DT-rows/Readme.md b/inst/examples/DT-rows/Readme.md
new file mode 100644
index 0000000..0fa0359
--- /dev/null
+++ b/inst/examples/DT-rows/Readme.md
@@ -0,0 +1,9 @@
+The top example shows a client-side table, and the indices of the selected rows 
+(`input$x1_rows_selected`) are integers.
+
+The bottom example shows a server-side table. Make sure you have included row 
+names in the table (as the first column of the table). In the case of 
+server-side processing, the row names of the selected rows are available in 
+`input$x3_rows_selected` as a character vector.
+
+**DT** (>= 0.1.26) is required to run this example.
diff --git a/inst/examples/DT-rows/rsconnect/shinyapps.io/yihui/DT-rows.dcf b/inst/examples/DT-rows/rsconnect/shinyapps.io/yihui/DT-rows.dcf
new file mode 100644
index 0000000..6de7268
--- /dev/null
+++ b/inst/examples/DT-rows/rsconnect/shinyapps.io/yihui/DT-rows.dcf
@@ -0,0 +1,9 @@
+name: DT-rows
+account: yihui
+server: shinyapps.io
+appId: 44234
+bundleId: 519186
+url: https://yihui.shinyapps.io/DT-rows/
+when: 1469809057.10392
+asMultiple: FALSE
+asStatic: FALSE
diff --git a/inst/examples/DT-rows/server.R b/inst/examples/DT-rows/server.R
new file mode 100644
index 0000000..5089cfc
--- /dev/null
+++ b/inst/examples/DT-rows/server.R
@@ -0,0 +1,29 @@
+library(shiny)
+library(DT)
+
+shinyServer(function(input, output, session) {
+
+  output$x1 = DT::renderDataTable(cars, server = FALSE)
+
+  # highlight selected rows in the scatterplot
+  output$x2 = renderPlot({
+    s = input$x1_rows_selected
+    par(mar = c(4, 4, 1, .1))
+    plot(cars)
+    if (length(s)) points(cars[s, , drop = FALSE], pch = 19, cex = 2)
+  })
+
+  # server-side processing
+  mtcars2 = mtcars[, 1:8]
+  output$x3 = DT::renderDataTable(mtcars2, server = TRUE)
+
+  # print the selected indices
+  output$x4 = renderPrint({
+    s = input$x3_rows_selected
+    if (length(s)) {
+      cat('These rows were selected:\n\n')
+      cat(s, sep = ', ')
+    }
+  })
+
+})
diff --git a/inst/examples/DT-rows/ui.R b/inst/examples/DT-rows/ui.R
new file mode 100644
index 0000000..b873e70
--- /dev/null
+++ b/inst/examples/DT-rows/ui.R
@@ -0,0 +1,23 @@
+library(shiny)
+
+fluidPage(
+
+  title = 'Select Table Rows',
+
+  h1('A Client-side Table'),
+
+  fluidRow(
+    column(6, DT::dataTableOutput('x1')),
+    column(6, plotOutput('x2', height = 500))
+  ),
+
+  hr(),
+
+  h1('A Server-side Table'),
+
+  fluidRow(
+    column(9, DT::dataTableOutput('x3')),
+    column(3, verbatimTextOutput('x4'))
+  )
+
+)
diff --git a/inst/examples/DT-scroller/DESCRIPTION b/inst/examples/DT-scroller/DESCRIPTION
new file mode 100644
index 0000000..334a936
--- /dev/null
+++ b/inst/examples/DT-scroller/DESCRIPTION
@@ -0,0 +1,6 @@
+Title: Using the Scroller Extension in DataTables
+Author: Yihui Xie
+AuthorUrl: http://www.rstudio.com
+License: MIT
+DisplayMode: Showcase
+Type: Shiny
diff --git a/inst/examples/DT-scroller/Readme.md b/inst/examples/DT-scroller/Readme.md
new file mode 100644
index 0000000..4496407
--- /dev/null
+++ b/inst/examples/DT-scroller/Readme.md
@@ -0,0 +1 @@
+This application demonstrates the Scroller extension of the DataTables library. The data was written in JSON to a file `large.txt` under `www`, and loaded via the `ajax` option of DataTables. As you scroll down the table, more rows will be displayed.
diff --git a/inst/examples/DT-scroller/rsconnect/shinyapps.io/yihui/DT-scroller.dcf b/inst/examples/DT-scroller/rsconnect/shinyapps.io/yihui/DT-scroller.dcf
new file mode 100644
index 0000000..702f1db
--- /dev/null
+++ b/inst/examples/DT-scroller/rsconnect/shinyapps.io/yihui/DT-scroller.dcf
@@ -0,0 +1,9 @@
+name: DT-scroller
+account: yihui
+server: shinyapps.io
+appId: 34078
+bundleId: 519189
+url: https://yihui.shinyapps.io/DT-scroller/
+when: 1469809120.66141
+asMultiple: FALSE
+asStatic: FALSE
diff --git a/inst/examples/DT-scroller/server.R b/inst/examples/DT-scroller/server.R
new file mode 100644
index 0000000..9850d57
--- /dev/null
+++ b/inst/examples/DT-scroller/server.R
@@ -0,0 +1,25 @@
+library(shiny)
+
+if (!file_test('-d', 'www')) dir.create('www')
+
+# prepare the Ajax data source
+writeLines(
+  jsonlite::toJSON(list(aaData = matrix(1:4000, ncol = 4))),
+  'www/large.txt'
+)
+
+shinyServer(function(input, output) {
+  # an empty matrix to generate the table container
+  sketch = matrix(ncol = 4, dimnames = list(NULL, head(letters, 4)))
+  # render the widget
+  output$tbl = DT::renderDataTable(
+    sketch, extensions = 'Scroller', server = FALSE,
+    options = list(
+      ajax = 'large.txt',
+      deferRender = TRUE,
+      dom = 'frtiS',
+      scrollY = 200,
+      scrollCollapse = TRUE
+    )
+  )
+})
diff --git a/inst/examples/DT-scroller/ui.R b/inst/examples/DT-scroller/ui.R
new file mode 100644
index 0000000..2a4f631
--- /dev/null
+++ b/inst/examples/DT-scroller/ui.R
@@ -0,0 +1,10 @@
+library(shiny)
+
+shinyUI(fluidPage(
+  title = 'Using the Scroller Extension in DataTables',
+  fluidRow(
+    column(2),
+    column(8, DT::dataTableOutput('tbl')),
+    column(2)
+  )
+))
diff --git a/inst/examples/DT-scroller/www/large.txt b/inst/examples/DT-scroller/www/large.txt
new file mode 100644
index 0000000..9497326
--- /dev/null
+++ b/inst/examples/DT-scroller/www/large.txt
@@ -0,0 +1 @@
+{"aaData":[[1,1001,2001,3001],[2,1002,2002,3002],[3,1003,2003,3003],[4,1004,2004,3004],[5,1005,2005,3005],[6,1006,2006,3006],[7,1007,2007,3007],[8,1008,2008,3008],[9,1009,2009,3009],[10,1010,2010,3010],[11,1011,2011,3011],[12,1012,2012,3012],[13,1013,2013,3013],[14,1014,2014,3014],[15,1015,2015,3015],[16,1016,2016,3016],[17,1017,2017,3017],[18,1018,2018,3018],[19,1019,2019,3019],[20,1020,2020,3020],[21,1021,2021,3021],[22,1022,2022,3022],[23,1023,2023,3023],[24,1024,2024,3024],[25,1025,2 [...]
diff --git a/inst/examples/DT-selection/DESCRIPTION b/inst/examples/DT-selection/DESCRIPTION
new file mode 100644
index 0000000..7b2d050
--- /dev/null
+++ b/inst/examples/DT-selection/DESCRIPTION
@@ -0,0 +1,6 @@
+Title: Row/Column/Cell Selections
+Author: Yihui Xie
+AuthorUrl: http://www.rstudio.com
+License: MIT
+DisplayMode: Showcase
+Type: Shiny
diff --git a/inst/examples/DT-selection/Readme.md b/inst/examples/DT-selection/Readme.md
new file mode 100644
index 0000000..098800f
--- /dev/null
+++ b/inst/examples/DT-selection/Readme.md
@@ -0,0 +1,9 @@
+This example demonstrates row, column, and cell selections in **DT**.
+
+All types of selections work in both client-side and server-side processing 
+modes. The selection mode can be `none`, `single`, or `multiple`. You may select
+rows, columns, cells, or both rows and columns, and obtain the row/column/cell 
+indices from Shiny accordingly. See the [**DT**
+website](http://rstudio.github.io/DT/shiny.html) for more information.
+
+**DT** (>= 0.1.26) is required to run this example.
diff --git a/inst/examples/DT-selection/rsconnect/shinyapps.io/yihui/DT-selection.dcf b/inst/examples/DT-selection/rsconnect/shinyapps.io/yihui/DT-selection.dcf
new file mode 100644
index 0000000..db515f8
--- /dev/null
+++ b/inst/examples/DT-selection/rsconnect/shinyapps.io/yihui/DT-selection.dcf
@@ -0,0 +1,9 @@
+name: DT-selection
+account: yihui
+server: shinyapps.io
+appId: 51473
+bundleId: 519194
+url: https://yihui.shinyapps.io/DT-selection/
+when: 1469809303.27552
+asMultiple: FALSE
+asStatic: FALSE
diff --git a/inst/examples/DT-selection/server.R b/inst/examples/DT-selection/server.R
new file mode 100644
index 0000000..01dd2ff
--- /dev/null
+++ b/inst/examples/DT-selection/server.R
@@ -0,0 +1,180 @@
+library(shiny)
+library(DT)
+
+shinyServer(function(input, output, session) {
+
+  df = iris[, 1:3]
+  options(DT.options = list(pageLength = 5))
+
+  # row selection
+  output$x11 = DT::renderDataTable(df, server = FALSE, selection = 'single')
+  output$y11 = renderPrint(input$x11_rows_selected)
+
+  output$x12 = DT::renderDataTable(df, server = FALSE)
+  output$y12 = renderPrint(input$x12_rows_selected)
+
+  output$x13 = DT::renderDataTable(df, selection = 'single')
+  output$y13 = renderPrint(input$x13_rows_selected)
+
+  output$x14 = DT::renderDataTable(df)
+  output$y14 = renderPrint(input$x14_rows_selected)
+
+  output$x15 = DT::renderDataTable(
+    df, server = FALSE, selection = list(selected = c(1, 3, 4, 6, 9))
+  )
+  output$y15 = renderPrint(input$x15_rows_selected)
+
+  output$x16 = DT::renderDataTable(
+    df, selection = list(selected = c(1, 3, 4, 6, 9))
+  )
+  output$y16 = renderPrint(input$x16_rows_selected)
+
+  # column selection
+  output$x21 = DT::renderDataTable(
+    df, server = FALSE, selection = list(mode = 'single', target = 'column')
+  )
+  output$y21 = renderPrint(input$x21_columns_selected)
+
+  output$x22 = DT::renderDataTable(
+    df, server = FALSE, selection = list(target = 'column')
+  )
+  output$y22 = renderPrint(input$x22_columns_selected)
+
+  output$x23 = DT::renderDataTable(
+    df, selection = list(mode = 'single', target = 'column')
+  )
+  output$y23 = renderPrint(input$x23_columns_selected)
+
+  output$x24 = DT::renderDataTable(df, selection = list(target = 'column'))
+  output$y24 = renderPrint(input$x24_columns_selected)
+
+  output$x25 = DT::renderDataTable(
+    df, server = FALSE, selection = list(target = 'column', selected = c(1, 3))
+  )
+  output$y25 = renderPrint(input$x25_columns_selected)
+
+  output$x26 = DT::renderDataTable(
+    df, selection = list(target = 'column', selected = c(1, 3))
+  )
+  output$y26 = renderPrint(input$x26_columns_selected)
+
+  # cell selection
+  output$x31 = DT::renderDataTable(
+    df, server = FALSE, selection = list(mode = 'single', target = 'cell')
+  )
+  output$y31 = renderPrint(input$x31_cells_selected)
+
+  output$x32 = DT::renderDataTable(
+    df, server = FALSE, selection = list(target = 'cell')
+  )
+  output$y32 = renderPrint(input$x32_cells_selected)
+
+  output$x33 = DT::renderDataTable(
+    df, selection = list(mode = 'single', target = 'cell')
+  )
+  output$y33 = renderPrint(input$x33_cells_selected)
+
+  output$x34 = DT::renderDataTable(df, selection = list(target = 'cell'))
+  output$y34 = renderPrint(input$x34_cells_selected)
+
+  output$x35 = DT::renderDataTable(
+    df,
+    server = FALSE,
+    selection = list(target = 'cell', selected = cbind(
+      c(1, 3, 4, 9), c(3, 2, 1, 2)
+    ))
+  )
+  output$y35 = renderPrint(input$x35_cells_selected)
+
+  output$x36 = DT::renderDataTable(
+    df,
+    selection = list(target = 'cell', selected = cbind(
+      c(1, 3, 4, 9), c(3, 2, 1, 2)
+    ))
+  )
+  output$y36 = renderPrint(input$x36_cells_selected)
+
+  # row+column selection
+  print_rows_cols = function(id) {
+    cat('Rows selected:\n')
+    print(input[[paste0(id, '_rows_selected')]])
+    cat('Columns selected:\n')
+    print(input[[paste0(id, '_columns_selected')]])
+  }
+  output$x41 = DT::renderDataTable(
+    df, server = FALSE, selection = list(mode = 'single', target = 'row+column')
+  )
+  output$y41 = renderPrint(print_rows_cols('x41'))
+
+  output$x42 = DT::renderDataTable(
+    df, server = FALSE, selection = list(target = 'row+column')
+  )
+  output$y42 = renderPrint(print_rows_cols('x42'))
+
+  output$x43 = DT::renderDataTable(
+    df, selection = list(mode = 'single', target = 'row+column')
+  )
+  output$y43 = renderPrint(print_rows_cols('x43'))
+
+  output$x44 = DT::renderDataTable(df, selection = list(target = 'row+column'))
+  output$y44 = renderPrint(print_rows_cols('x44'))
+
+  output$x45 = DT::renderDataTable(
+    df,
+    server = FALSE,
+    selection = list(target = 'row+column', selected = list(
+      rows = c(1, 3, 4, 9), cols = c(3, 2)
+    ))
+  )
+  output$y45 = renderPrint(print_rows_cols('x45'))
+
+  output$x46 = DT::renderDataTable(
+    df,
+    selection = list(target = 'row+column', selected = list(
+      rows = c(1, 3, 4, 9), cols = c(3, 2)
+    ))
+  )
+  output$y46 = renderPrint(print_rows_cols('x46'))
+
+  sketch = htmltools::withTags(table(
+    class = 'display',
+    thead(
+      tr(
+        th(rowspan = 2, ''),
+        th(rowspan = 2, 'Species'),
+        th(colspan = 2, 'Sepal'),
+        th(colspan = 2, 'Petal')
+      ),
+      tr(
+        lapply(rep(c('Length', 'Width'), 2), th)
+      )
+    ),
+    tfoot(
+      tr(
+        th(rowspan = 2, ''),
+        th(rowspan = 2, 'Species'),
+        lapply(rep(c('Length', 'Width'), 2), th)
+      ),
+      tr(
+        th(colspan = 2, 'Sepal'),
+        th(colspan = 2, 'Petal')
+      )
+    )
+  ))
+  output$x47 = DT::renderDataTable(
+    iris, container = sketch, server = FALSE,
+    selection = list(target = 'row+column')
+  )
+  output$y47 = renderPrint(print_rows_cols('x47'))
+
+  output$x48 = DT::renderDataTable(
+    iris, container = sketch,
+    selection = list(target = 'row+column')
+  )
+  output$y48 = renderPrint(print_rows_cols('x48'))
+
+  # disable selection
+  output$x51 = DT::renderDataTable(df, server = FALSE, selection = 'none')
+  output$x52 = DT::renderDataTable(df, selection = 'none')
+
+})
diff --git a/inst/examples/DT-selection/ui.R b/inst/examples/DT-selection/ui.R
new file mode 100644
index 0000000..3767415
--- /dev/null
+++ b/inst/examples/DT-selection/ui.R
@@ -0,0 +1,187 @@
+library(shiny)
+
+navbarPage(
+
+  title = 'DT Selection',
+
+  tabPanel(
+    'Row',
+    fluidRow(
+      column(
+        6, h1('Client-side / Single selection'), hr(),
+        DT::dataTableOutput('x11'),
+        verbatimTextOutput('y11')
+      ),
+      column(
+        6, h1('Client-side / Multiple selection'), hr(),
+        DT::dataTableOutput('x12'),
+        verbatimTextOutput('y12')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Server-side / Single selection'), hr(),
+        DT::dataTableOutput('x13'),
+        verbatimTextOutput('y13')
+      ),
+      column(
+        6, h1('Server-side / Multiple selection'), hr(),
+        DT::dataTableOutput('x14'),
+        verbatimTextOutput('y14')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Client-side / Pre-selection'), hr(),
+        DT::dataTableOutput('x15'),
+        verbatimTextOutput('y15')
+      ),
+      column(
+        6, h1('Server-side / Pre-selection'), hr(),
+        DT::dataTableOutput('x16'),
+        verbatimTextOutput('y16')
+      )
+    )
+  ),
+
+  tabPanel(
+    'Column',
+    fluidRow(
+      column(
+        6, h1('Client-side / Single selection'), hr(),
+        DT::dataTableOutput('x21'),
+        verbatimTextOutput('y21')
+      ),
+      column(
+        6, h1('Client-side / Multiple selection'), hr(),
+        DT::dataTableOutput('x22'),
+        verbatimTextOutput('y22')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Server-side / Single selection'), hr(),
+        DT::dataTableOutput('x23'),
+        verbatimTextOutput('y23')
+      ),
+      column(
+        6, h1('Server-side / Multiple selection'), hr(),
+        DT::dataTableOutput('x24'),
+        verbatimTextOutput('y24')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Client-side / Pre-selection'), hr(),
+        DT::dataTableOutput('x25'),
+        verbatimTextOutput('y25')
+      ),
+      column(
+        6, h1('Server-side / Pre-selection'), hr(),
+        DT::dataTableOutput('x26'),
+        verbatimTextOutput('y26')
+      )
+    )
+  ),
+
+  tabPanel(
+    'Cell',
+    fluidRow(
+      column(
+        6, h1('Client-side / Single selection'), hr(),
+        DT::dataTableOutput('x31'),
+        verbatimTextOutput('y31')
+      ),
+      column(
+        6, h1('Client-side / Multiple selection'), hr(),
+        DT::dataTableOutput('x32'),
+        verbatimTextOutput('y32')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Server-side / Single selection'), hr(),
+        DT::dataTableOutput('x33'),
+        verbatimTextOutput('y33')
+      ),
+      column(
+        6, h1('Server-side / Multiple selection'), hr(),
+        DT::dataTableOutput('x34'),
+        verbatimTextOutput('y34')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Client-side / Pre-selection'), hr(),
+        DT::dataTableOutput('x35'),
+        verbatimTextOutput('y35')
+      ),
+      column(
+        6, h1('Server-side / Pre-selection'), hr(),
+        DT::dataTableOutput('x36'),
+        verbatimTextOutput('y36')
+      )
+    )
+  ),
+
+  tabPanel(
+    'Row+Column',
+    fluidRow(
+      column(
+        6, h1('Client-side / Single selection'), hr(),
+        DT::dataTableOutput('x41'),
+        verbatimTextOutput('y41')
+      ),
+      column(
+        6, h1('Client-side / Multiple selection'), hr(),
+        DT::dataTableOutput('x42'),
+        verbatimTextOutput('y42')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Server-side / Single selection'), hr(),
+        DT::dataTableOutput('x43'),
+        verbatimTextOutput('y43')
+      ),
+      column(
+        6, h1('Server-side / Multiple selection'), hr(),
+        DT::dataTableOutput('x44'),
+        verbatimTextOutput('y44')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Client-side / Pre-selection'), hr(),
+        DT::dataTableOutput('x45'),
+        verbatimTextOutput('y45')
+      ),
+      column(
+        6, h1('Server-side / Pre-selection'), hr(),
+        DT::dataTableOutput('x46'),
+        verbatimTextOutput('y46')
+      )
+    ),
+    fluidRow(
+      column(
+        6, h1('Client-side / Custom Table Container'), hr(),
+        DT::dataTableOutput('x47'),
+        verbatimTextOutput('y47')
+      ),
+      column(
+        6, h1('Server-side / Custom Table Container'), hr(),
+        DT::dataTableOutput('x48'),
+        verbatimTextOutput('y48')
+      )
+    )
+  ),
+
+  tabPanel(
+    'None',
+    fluidRow(
+      column(6, h1('Client-side'), hr(), DT::dataTableOutput('x51')),
+      column(6, h1('Server-side'), hr(), DT::dataTableOutput('x52'))
+    )
+  )
+
+)
diff --git a/inst/examples/DT-shiny/server.R b/inst/examples/DT-shiny/server.R
new file mode 100644
index 0000000..291e838
--- /dev/null
+++ b/inst/examples/DT-shiny/server.R
@@ -0,0 +1,7 @@
+library(shiny)
+library(DT)
+
+shinyServer(function(input, output, session) {
+  output$tbl_a = DT::renderDataTable(iris, server = FALSE)
+  output$tbl_b = DT::renderDataTable(iris)
+})
diff --git a/inst/examples/DT-shiny/ui.R b/inst/examples/DT-shiny/ui.R
new file mode 100644
index 0000000..d51a534
--- /dev/null
+++ b/inst/examples/DT-shiny/ui.R
@@ -0,0 +1,17 @@
+library(shiny)
+
+shinyUI(fluidPage(
+  title = 'Use the DT package in shiny',
+  h1('A Table Using Client-side Processing'),
+  fluidRow(
+    column(2),
+    column(8, DT::dataTableOutput('tbl_a')),
+    column(2)
+  ),
+  h1('A Table Using Server-side Processing'),
+  fluidRow(
+    column(2),
+    column(8, DT::dataTableOutput('tbl_b')),
+    column(2)
+  )
+))
diff --git a/inst/examples/ajax-shiny.R b/inst/examples/ajax-shiny.R
new file mode 100644
index 0000000..e0d4e5d
--- /dev/null
+++ b/inst/examples/ajax-shiny.R
@@ -0,0 +1,23 @@
+# !formatR
+DTApp = function(data, ..., options = list()) {
+  library(shiny)
+  library(DT)
+  shinyApp(
+    ui = fluidPage(
+      title = 'Server-side processing of DataTables',
+      fluidRow(
+        DT::dataTableOutput('tbl')
+      )
+    ),
+    server = function(input, output, session) {
+      options$serverSide = TRUE
+      options$ajax = list(url = dataTableAjax(session, data))
+      # create a widget using an Ajax URL created above
+      widget = datatable(data, ..., options = options)
+      output$tbl = DT::renderDataTable(widget)
+    }
+  )
+}
+
+if (interactive()) DTApp(iris)
+if (interactive()) DTApp(iris, filter = 'top')
diff --git a/inst/examples/datatable.R b/inst/examples/datatable.R
new file mode 100644
index 0000000..b27ee16
--- /dev/null
+++ b/inst/examples/datatable.R
@@ -0,0 +1,25 @@
+# !formatR
+library(DT)
+
+# see the package vignette for examples and the link to website
+vignette('DT', package = 'DT')
+
+# some boring edge cases for testing purposes
+m = matrix(nrow = 0, ncol = 5, dimnames = list(NULL, letters[1:5]))
+datatable(m)  # zero rows
+datatable(as.data.frame(m))
+
+m = matrix(1, dimnames = list(NULL, 'a'))
+datatable(m)  # one row and one column
+datatable(as.data.frame(m))
+
+m = data.frame(a = 1, b = 2, c = 3)
+datatable(m)
+datatable(as.matrix(m))
+
+# dates
+datatable(data.frame(
+  date = seq(as.Date("2015-01-01"), by = "day", length.out = 5), x = 1:5
+))
+datatable(data.frame(x = Sys.Date()))
+datatable(data.frame(x = Sys.time()))
diff --git a/inst/htmlwidgets/datatables.js b/inst/htmlwidgets/datatables.js
new file mode 100644
index 0000000..1d213ef
--- /dev/null
+++ b/inst/htmlwidgets/datatables.js
@@ -0,0 +1,923 @@
+(function() {
+
+// some helper functions: using a global object DTWidget so that it can be used
+// in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's
+// dynamic scoping, when 'code' is eval()'ed, JavaScript does not know objects
+// from the "parent frame", e.g. JS('DTWidget') will not work unless it was made
+// a global object
+var DTWidget = {};
+
+DTWidget.formatCurrency = function(thiz, row, data, col, currency, digits, interval, mark, decMark, before) {
+  var d = parseFloat(data[col]);
+  if (isNaN(d)) return;
+  // 123456666.7890 -> 123,456,666.7890
+  var markInterval = function(x, interval, mark) {
+    if (!/^-?[\d.]+$/.test(x)) return x;
+    var xv = x.split('.');
+    if (xv.length > 2) return x;  // should have at most one decimal point
+    xv[0] = xv[0].replace(new RegExp('\\B(?=(\\d{' + interval + '})+(?!\\d))', 'g'), mark);
+    return xv.join(decMark);
+  };
+  d = d.toFixed(digits);
+  var res = markInterval(d, interval, mark);
+  res = before ? (/^-/.test(res) ? '-' + currency + res.replace(/^-/, '') : currency + res) :
+    res + currency;
+  $(thiz.api().cell(row, col).node()).html(res);
+};
+
+DTWidget.formatString = function(thiz, row, data, col, prefix, suffix) {
+  var d = data[col];
+  if (d === null) return;
+  $(thiz.api().cell(row, col).node()).html(prefix + d + suffix);
+};
+
+DTWidget.formatPercentage = function(thiz, row, data, col, digits) {
+  var d = parseFloat(data[col]);
+  if (isNaN(d)) return;
+  $(thiz.api().cell(row, col).node()).html((d * 100).toFixed(digits) + '%');
+};
+
+DTWidget.formatRound = function(thiz, row, data, col, digits) {
+  var d = parseFloat(data[col]);
+  if (isNaN(d)) return;
+  $(thiz.api().cell(row, col).node()).html(d.toFixed(digits));
+};
+
+DTWidget.formatSignif = function(thiz, row, data, col, digits) {
+  var d = parseFloat(data[col]);
+  if (isNaN(d)) return;
+  $(thiz.api().cell(row, col).node()).html(d.toPrecision(digits));
+};
+
+DTWidget.formatDate = function(thiz, row, data, col, method) {
+  var d = data[col];
+  if (d === null) return;
+  d = new Date(d);
+  $(thiz.api().cell(row, col).node()).html(d[method]());
+};
+
+window.DTWidget = DTWidget;
+
+var transposeArray2D = function(a) {
+  return a.length === 0 ? a : HTMLWidgets.transposeArray2D(a);
+};
+
+HTMLWidgets.widget({
+  name: "datatables",
+  type: "output",
+  initialize: function(el, width, height) {
+    $(el).html(' ');
+    return { data: null };
+  },
+  renderValue: function(el, data, instance) {
+    if (el.offsetWidth === 0 || el.offsetHeight === 0) {
+      instance.data = data;
+      return;
+    }
+    instance.data = null;
+    var $el = $(el);
+    $el.empty();
+
+    if (data === null) {
+      return;
+    }
+
+    // If we are in a flexdashboard scroll layout then we:
+    //  (a) Always want to use pagination (otherwise we'll have
+    //      a "double scroll bar" effect on the phone); and
+    //  (b) Never want to fill the container (we want the pagination
+    //      level to determine the size of the container)
+    if (window.FlexDashboard && !window.FlexDashboard.isFillPage()) {
+      data.options.bPaginate = true;
+      data.fillContainer = false;
+    }
+
+    // if we are in the viewer then we always want to fillContainer and
+    // and autoHideNavigation (unless the user has explicitly set these)
+    if (window.HTMLWidgets.viewerMode) {
+      if (!data.hasOwnProperty("fillContainer"))
+        data.fillContainer = true;
+      if (!data.hasOwnProperty("autoHideNavigation"))
+        data.autoHideNavigation = true;
+    }
+
+    // propagate fillContainer to instance (so we have it in resize)
+    instance.fillContainer = data.fillContainer;
+
+    var cells = data.data;
+
+    if (cells instanceof Array) cells = transposeArray2D(cells);
+
+    $el.append(data.container);
+    var $table = $el.find('table');
+    if (data.class) $table.addClass(data.class);
+    if (data.caption) $table.prepend(data.caption);
+
+    if (HTMLWidgets.shinyMode && data.selection.mode !== 'none' &&
+        data.selection.target === 'row+column') {
+      if ($table.children('tfoot').length === 0) {
+        $table.append($('<tfoot>'));
+        $table.find('thead tr').clone().appendTo($table.find('tfoot'));
+      }
+    }
+
+    // column filters
+    var filterRow;
+    switch (data.filter) {
+      case 'top':
+        $table.children('thead').append(data.filterHTML);
+        filterRow = $table.find('thead tr:last td');
+        break;
+      case 'bottom':
+        if ($table.children('tfoot').length === 0) {
+          $table.append($('<tfoot>'));
+        }
+        $table.children('tfoot').prepend(data.filterHTML);
+        filterRow = $table.find('tfoot tr:first td');
+        break;
+    }
+
+    var options = { searchDelay: 1000 };
+    if (cells !== null) $.extend(options, {
+      data: cells
+    });
+
+    // options for fillContainer
+    var bootstrapActive = typeof($.fn.popover) != 'undefined';
+    if (instance.fillContainer) {
+
+      // force scrollX/scrollY and turn off autoWidth
+      options.scrollX = true;
+      options.scrollY = "100px"; // can be any value, we'll adjust below
+
+      // if we aren't paginating then move around the info/filter controls
+      // to save space at the bottom and rephrase the info callback
+      if (data.options.bPaginate === false) {
+
+        // we know how to do this cleanly for bootstrap, not so much
+        // for other themes/layouts
+        if (bootstrapActive) {
+          options.dom = "<'row'<'col-sm-4'i><'col-sm-8'f>>" +
+                        "<'row'<'col-sm-12'tr>>";
+        }
+
+        options.fnInfoCallback = function(oSettings, iStart, iEnd,
+                                           iMax, iTotal, sPre) {
+          return Number(iTotal).toLocaleString() + " records";
+        };
+      }
+    }
+
+    // auto hide navigation if requested
+    if (data.autoHideNavigation === true) {
+      if (bootstrapActive && data.options.bPaginate !== false) {
+        // strip all nav if length >= cells
+        if ((cells instanceof Array) && data.options.iDisplayLength >= cells.length)
+          options.dom = "<'row'<'col-sm-12'tr>>";
+        // alternatively lean things out for flexdashboard mobile portrait
+        else if (window.FlexDashboard && window.FlexDashboard.isMobilePhone())
+          options.dom = "<'row'<'col-sm-12'f>>" +
+                        "<'row'<'col-sm-12'tr>>"  +
+                        "<'row'<'col-sm-12'p>>";
+      }
+    }
+
+    $.extend(true, options, data.options || {});
+
+    var searchCols = options.searchCols;
+    if (searchCols) {
+      searchCols = searchCols.map(function(x) {
+        return x === null ? '' : x.search;
+      });
+      // FIXME: this means I don't respect the escapeRegex setting
+      delete options.searchCols;
+    }
+
+    // server-side processing?
+    var server = options.serverSide === true;
+
+    // use the dataSrc function to pre-process JSON data returned from R
+    var DT_rows_all = [], DT_rows_current = [];
+    if (server && HTMLWidgets.shinyMode && typeof options.ajax === 'object' &&
+        /^session\/[\da-z]+\/dataobj/.test(options.ajax.url) && !options.ajax.dataSrc) {
+      options.ajax.dataSrc = function(json) {
+        DT_rows_all = $.makeArray(json.DT_rows_all);
+        DT_rows_current = $.makeArray(json.DT_rows_current);
+        return json.data;
+      };
+    }
+
+    var table = $table.DataTable(options);
+    $el.data('datatable', table);
+
+    var inArray = function(val, array) {
+      return $.inArray(val, $.makeArray(array)) > -1;
+    };
+
+    // encode + to %2B when searching in the table on server side, because
+    // shiny::parseQueryString() treats + as spaces, and DataTables does not
+    // encode + to %2B (or % to %25) when sending the request
+    var encode_plus = function(x) {
+      return server ? x.replace(/%/g, '%25').replace(/\+/g, '%2B') : x;
+    };
+
+    if (data.filter !== 'none') {
+
+      filterRow.each(function(i, td) {
+
+        var $td = $(td), type = $td.data('type'), filter;
+        var $input = $td.children('div').first().children('input');
+        $input.prop('disabled', !table.settings()[0].aoColumns[i].bSearchable || type === 'disabled');
+        $input.on('input blur', function() {
+          $input.next('span').toggle(Boolean($input.val()));
+        });
+        // Bootstrap sets pointer-events to none and we won't be able to click
+        // the clear button
+        $input.next('span').css('pointer-events', 'auto').hide().click(function() {
+          $(this).hide().prev('input').val('').trigger('input').focus();
+        });
+        var searchCol;  // search string for this column
+        if (searchCols && searchCols[i]) {
+          searchCol = searchCols[i];
+          $input.val(searchCol).trigger('input');
+        }
+        var $x = $td.children('div').last();
+
+        // remove the overflow: hidden attribute of the scrollHead
+        // (otherwise the scrolling table body obscures the filters)
+        var scrollHead = $(el).find('.dataTables_scrollHead,.dataTables_scrollFoot');
+        var cssOverflow = scrollHead.css('overflow');
+        if (cssOverflow === 'hidden') {
+          $x.on('show hide', function(e) {
+            scrollHead.css('overflow', e.type === 'show' ? '' : cssOverflow);
+          });
+          $x.css('z-index', 25);
+        }
+
+        if (inArray(type, ['factor', 'logical'])) {
+          $input.on({
+            click: function() {
+              $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus();
+            },
+            input: function() {
+              if ($input.val() === '') filter[0].selectize.setValue([]);
+            }
+          });
+          var $input2 = $x.children('select');
+          filter = $input2.selectize({
+            options: $input2.data('options').map(function(v, i) {
+              return ({text: v, value: v});
+            }),
+            plugins: ['remove_button'],
+            hideSelected: true,
+            onChange: function(value) {
+              if (value === null) value = []; // compatibility with jQuery 3.0
+              $input.val(value.length ? JSON.stringify(value) : '');
+              if (value.length) $input.trigger('input');
+              $input.attr('title', $input.val());
+              if (server) {
+                table.column(i).search(value.length ? encode_plus(JSON.stringify(value)) : '').draw();
+                return;
+              }
+              // turn off filter if nothing selected
+              $td.data('filter', value.length > 0);
+              table.draw();  // redraw table, and filters will be applied
+            }
+          });
+          if (searchCol) filter[0].selectize.setValue(JSON.parse(searchCol));
+          // an ugly hack to deal with shiny: for some reason, the onBlur event
+          // of selectize does not work in shiny
+          $x.find('div > div.selectize-input > input').on('blur', function() {
+            $x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur');
+          });
+          filter.next('div').css('margin-bottom', 'auto');
+        } else if (type === 'character') {
+          var fun = function() {
+            var regex = false, ci = true;
+            if (options.search) {
+              regex = options.search.regex,
+              ci = options.search.caseInsensitive !== false;
+            }
+            table.column(i).search(encode_plus($input.val()), regex, !regex, ci).draw();
+          };
+          if (server) {
+            fun = $.fn.dataTable.util.throttle(fun, options.searchDelay);
+          }
+          $input.on('input', fun);
+        } else if (inArray(type, ['number', 'integer', 'date', 'time'])) {
+          var $x0 = $x;
+          $x = $x0.children('div').first();
+          $x0.css({
+            'background-color': '#fff',
+            'border': '1px #ddd solid',
+            'border-radius': '4px',
+            'padding': '20px 20px 10px 20px'
+          });
+          var $spans = $x0.children('span').css({
+            'margin-top': '10px',
+            'white-space': 'nowrap'
+          });
+          var $span1 = $spans.first(), $span2 = $spans.last();
+          var r1 = +$x.data('min'), r2 = +$x.data('max');
+          // when the numbers are too small or have many decimal places, the
+          // slider may have numeric precision problems (#150)
+          var scale = Math.pow(10, Math.max(0, +$x.data('scale') || 0));
+          r1 = Math.round(r1 * scale); r2 = Math.round(r2 * scale);
+          var scaleBack = function(x, scale) {
+            if (scale === 1) return x;
+            var d = Math.round(Math.log(scale) / Math.log(10));
+            // to avoid problems like 3.423/100 -> 0.034230000000000003
+            return (x / scale).toFixed(d);
+          };
+          $input.on({
+            focus: function() {
+              $x0.show().trigger('show');
+              // first, make sure the slider div leaves at least 20px between
+              // the two (slider value) span's
+              $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20));
+              // then, if the input is really wide, make the slider the same
+              // width as the input
+              if ($x0.outerWidth() < $input.outerWidth()) {
+                $x0.outerWidth($input.outerWidth());
+              }
+              // make sure the slider div does not reach beyond the right margin
+              if ($(window).width() < $x0.offset().left + $x0.width()) {
+                $x0.offset({
+                  'left': $input.offset().left + $input.outerWidth() - $x0.outerWidth()
+                });
+              }
+            },
+            blur: function() {
+              $x0.hide().trigger('hide');
+            },
+            input: function() {
+              if ($input.val() === '') filter.val([r1, r2]);
+            },
+            change: function() {
+              var v = $input.val().replace(/\s/g, '');
+              if (v === '') return;
+              v = v.split('...');
+              if (v.length !== 2) {
+                $input.parent().addClass('has-error');
+                return;
+              }
+              if (v[0] === '') v[0] = r1;
+              if (v[1] === '') v[1] = r2;
+              $input.parent().removeClass('has-error');
+              // treat date as UTC time at midnight
+              var strTime = function(x) {
+                var s = type === 'date' ? 'T00:00:00Z' : '';
+                var t = new Date(x + s).getTime();
+                // add 10 minutes to date since it does not hurt the date, and
+                // it helps avoid the tricky floating point arithmetic problems,
+                // e.g. sometimes the date may be a few milliseconds earlier
+                // than the midnight due to precision problems in noUiSlider
+                return type === 'date' ? t + 3600000 : t;
+              };
+              if (inArray(type, ['date', 'time'])) {
+                v[0] = strTime(v[0]);
+                v[1] = strTime(v[1]);
+              }
+              if (v[0] != r1) v[0] *= scale;
+              if (v[1] != r2) v[1] *= scale;
+              filter.val(v);
+            }
+          });
+          var formatDate = function(d) {
+            d = scaleBack(d, scale);
+            if (type === 'number') return d;
+            if (type === 'integer') return parseInt(d);
+            var x = new Date(+d);
+            if (type === 'date') {
+              var pad0 = function(x) {
+                return ('0' + x).substr(-2, 2);
+              };
+              return x.getUTCFullYear() + '-' + pad0(1 + x.getUTCMonth())
+                      + '-' + pad0(x.getUTCDate());
+            } else {
+              return x.toISOString();
+            }
+          };
+          var opts = type === 'date' ? { step: 60 * 60 * 1000 } :
+                     type === 'integer' ? { step: 1 } : {};
+          filter = $x.noUiSlider($.extend({
+            start: [r1, r2],
+            range: {min: r1, max: r2},
+            connect: true
+          }, opts));
+          if (scale > 1) (function() {
+            var t1 = r1, t2 = r2;
+            var val = filter.val();
+            while (val[0] > r1 || val[1] < r2) {
+              if (val[0] > r1) {
+                t1 -= val[0] - r1;
+              }
+              if (val[1] < r2) {
+                t2 += r2 - val[1];
+              }
+              filter = $x.noUiSlider($.extend({
+                start: [t1, t2],
+                range: {min: t1, max: t2},
+                connect: true
+              }, opts), true);
+              val = filter.val();
+            }
+            r1  = t1; r2 = t2;
+          })();
+          $span1.text(formatDate(r1)); $span2.text(formatDate(r2));
+          var updateSlider = function(e) {
+            var val = filter.val();
+            // turn off filter if in full range
+            $td.data('filter', val[0] > r1 || val[1] < r2);
+            var v1 = formatDate(val[0]), v2 = formatDate(val[1]), ival;
+            if ($td.data('filter')) {
+              ival = v1 + ' ... ' + v2;
+              $input.attr('title', ival).val(ival).trigger('input');
+            } else {
+              $input.attr('title', '').val('');
+            }
+            $span1.text(v1); $span2.text(v2);
+            if (e.type === 'slide') return;  // no searching when sliding only
+            if (server) {
+              table.column(i).search($td.data('filter') ? ival : '').draw();
+              return;
+            }
+            table.draw();
+          };
+          filter.on({
+            set: updateSlider,
+            slide: updateSlider
+          });
+        }
+
+        // server-side processing will be handled by R (or whatever server
+        // language you use); the following code is only needed for client-side
+        // processing
+        if (server) {
+          // if a search string has been pre-set, search now
+          if (searchCol) table.column(i).search(encode_plus(searchCol)).draw();
+          return;
+        }
+
+        var customFilter = function(settings, data, dataIndex) {
+          // there is no way to attach a search function to a specific table,
+          // and we need to make sure a global search function is not applied to
+          // all tables (i.e. a range filter in a previous table should not be
+          // applied to the current table); we use the settings object to
+          // determine if we want to perform searching on the current table,
+          // since settings.sTableId will be different to different tables
+          if (table.settings()[0] !== settings) return true;
+          // no filter on this column or no need to filter this column
+          if (typeof filter === 'undefined' || !$td.data('filter')) return true;
+
+          var r = filter.val(), v, r0, r1;
+          if (type === 'number' || type === 'integer') {
+            v = parseFloat(data[i]);
+            // how to handle NaN? currently exclude these rows
+            if (isNaN(v)) return(false);
+            r0 = parseFloat(scaleBack(r[0], scale))
+            r1 = parseFloat(scaleBack(r[1], scale));
+            if (v >= r0 && v <= r1) return true;
+          } else if (type === 'date' || type === 'time') {
+            v = new Date(data[i]);
+            r0 = new Date(r[0] / scale); r1 = new Date(r[1] / scale);
+            if (v >= r0 && v <= r1) return true;
+          } else if (type === 'factor') {
+            if (r.length === 0 || inArray(data[i], r)) return true;
+          } else if (type === 'logical') {
+            if (r.length === 0) return true;
+            if (inArray(data[i] === '' ? 'na' : data[i], r)) return true;
+          }
+          return false;
+        };
+
+        $.fn.dataTable.ext.search.push(customFilter);
+
+        // search for the preset search strings if it is non-empty
+        if (searchCol) {
+          if (inArray(type, ['factor', 'logical'])) {
+            filter[0].selectize.setValue(JSON.parse(searchCol));
+          } else if (type === 'character') {
+            $input.trigger('input');
+          } else if (inArray(type, ['number', 'integer', 'date', 'time'])) {
+            $input.trigger('change');
+          }
+        }
+
+      });
+
+    }
+
+    // highlight search keywords
+    var highlight = function() {
+      var body = $(table.table().body());
+      // removing the old highlighting first
+      body.unhighlight();
+
+      // don't highlight the "not found" row, so we get the rows using the api
+      if (table.rows({ filter: 'applied' }).data().length === 0) return;
+      // highlight gloal search keywords
+      body.highlight($.trim(table.search()).split(/\s+/));
+      // then highlight keywords from individual column filters
+      if (filterRow) filterRow.each(function(i, td) {
+        var $td = $(td), type = $td.data('type');
+        if (type !== 'character') return;
+        var $input = $td.children('div').first().children('input');
+        var column = table.column(i).nodes().to$(),
+            val = $.trim($input.val());
+        if (type !== 'character' || val === '') return;
+        column.highlight(val.split(/\s+/));
+      });
+    };
+
+    if (options.searchHighlight) {
+      table
+      .on('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth', highlight)
+      .on('destroy', function() {
+        // remove event handler
+        table.off( 'draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth' );
+      });
+
+      // initial highlight for state saved conditions and initial states
+      highlight();
+    }
+
+    // run the callback function on the table instance
+    if (typeof data.callback === 'function') data.callback(table);
+    this.adjustWidth(el);
+
+     // fillContainer = TRUE behavior
+    if (instance.fillContainer) {
+
+      // we need to wait just a bit to do this so DT can completely
+      // finish laying itself out
+      var thiz = this;
+      setTimeout(function() {
+
+        // calculate correct height
+        thiz.fillAvailableHeight(el, $(el).innerHeight());
+
+        // we need to force DT to recalculate column widths
+        // (otherwise all the columns are the same size)
+        table.columns.adjust();
+      }, 200);
+    }
+
+    // interaction with shiny
+    if (!HTMLWidgets.shinyMode) return;
+
+    var methods = {};
+    var shinyData = {};
+
+    methods.updateCaption = function(caption) {
+      if (!caption) return;
+      $table.children('caption').replaceWith(caption);
+    }
+
+    var changeInput = function(id, data, type) {
+      id = el.id + '_' + id;
+      if (type) id = id + ':' + type;
+      // do not update if the new data is the same as old data
+      if (shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(data))
+        return;
+      shinyData[id] = JSON.stringify(data);
+      Shiny.onInputChange(id, data);
+    };
+
+    var addOne = function(x) {
+      return x.map(function(i) { return 1 + i; });
+    };
+
+    var unique = function(x) {
+      var ux = [];
+      $.each(x, function(i, el){
+        if ($.inArray(el, ux) === -1) ux.push(el);
+      });
+      return ux;
+    }
+
+    // change the row index of a cell
+    var tweakCellIndex = function(cell) {
+      var info = cell.index();
+      if (server) {
+        info.row = DT_rows_current[info.row];
+      } else {
+        info.row += 1;
+      }
+      return {row: info.row, col: info.column};
+    }
+
+    var selMode = data.selection.mode, selTarget = data.selection.target;
+    if (inArray(selMode, ['single', 'multiple'])) {
+      var selClass = data.style === 'bootstrap' ? 'active' : 'selected';
+      var selected = data.selection.selected, selected1, selected2;
+      if (selected === null) {
+        selected1 = selected2 = [];
+      } else if (selTarget === 'row') {
+        selected1 = $.makeArray(selected);
+      } else if (selTarget === 'column') {
+        selected2 = $.makeArray(selected);
+      } else if (selTarget === 'row+column') {
+        selected1 = $.makeArray(selected.rows);
+        selected2 = $.makeArray(selected.cols);
+      }
+      // row, column, or cell selection
+      if (inArray(selTarget, ['row', 'row+column'])) {
+        var selectedRows = function() {
+          var rows = table.rows('.' + selClass, {search: 'applied'});
+          var idx = rows.indexes().toArray();
+          if (!server) return addOne(idx);
+          idx = idx.map(function(i) {
+            return DT_rows_current[i];
+          });
+          selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx;
+          return selected1;
+        }
+        table.on('click.dt', 'tbody tr', function() {
+          var $this = $(this), thisRow = table.row(this);
+          if (selMode === 'multiple') {
+            $this.toggleClass(selClass);
+          } else {
+            if ($this.hasClass(selClass)) {
+              $this.removeClass(selClass);
+            } else {
+              table.$('tr.' + selClass).removeClass(selClass);
+              $this.addClass(selClass);
+            }
+          }
+          if (server && !$this.hasClass(selClass)) {
+            var id = DT_rows_current[thisRow.index()];
+            // remove id from selected1 since its class .selected has been removed
+            selected1.splice($.inArray(id, selected1), 1);
+          }
+          changeInput('rows_selected', selectedRows());
+          changeInput('row_last_clicked', server ?
+                      DT_rows_current[thisRow.index()] : thisRow.index() + 1);
+        });
+        changeInput('rows_selected', selected1);
+        var selectRows = function() {
+          table.$('tr.' + selClass).removeClass(selClass);
+          if (selected1.length === 0) return;
+          if (server) {
+            table.rows({page: 'current'}).every(function() {
+              if (inArray(DT_rows_current[this.index()], selected1)) {
+                $(this.node()).addClass(selClass);
+              }
+            });
+          } else {
+            var selected0 = selected1.map(function(i) { return i - 1; });
+            $(table.rows(selected0).nodes()).addClass(selClass);
+          }
+        }
+        selectRows();  // in case users have specified pre-selected rows
+        // restore selected rows after the table is redrawn (e.g. sort/search/page);
+        // client-side tables will preserve the selections automatically; for
+        // server-side tables, we have to *real* row indices are in `selected1`
+        if (server) table.on('draw.dt', selectRows);
+        methods.selectRows = function(selected) {
+          selected1 = selected ? selected : [];
+          selectRows();
+          changeInput('rows_selected', selected1);
+        }
+      }
+
+      if (inArray(selTarget, ['column', 'row+column'])) {
+        if (selTarget === 'row+column') {
+          $(table.columns().footer()).css('cursor', 'pointer');
+        }
+        table.on('click.dt', selTarget === 'column' ? 'tbody td' : 'tfoot tr th', function() {
+          var colIdx = selTarget === 'column' ? table.cell(this).index().column :
+              $.inArray(this, table.columns().footer()),
+              thisCol = $(table.column(colIdx).nodes());
+          if (colIdx === -1) return;
+          if (thisCol.hasClass(selClass)) {
+            thisCol.removeClass(selClass);
+            selected2.splice($.inArray(colIdx, selected2), 1);
+          } else {
+            if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass);
+            thisCol.addClass(selClass);
+            selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx]));
+          }
+          changeInput('columns_selected', selected2);
+        });
+        changeInput('columns_selected', selected2);
+        var selectCols = function() {
+          table.columns().nodes().flatten().to$().removeClass(selClass);
+          if (selected2.length > 0)
+            table.columns(selected2).nodes().flatten().to$().addClass(selClass);
+        }
+        selectCols();  // in case users have specified pre-selected columns
+        if (server) table.on('draw.dt', selectCols);
+        methods.selectColumns = function(selected) {
+          selected2 = selected ? selected : [];
+          selectCols();
+          changeInput('columns_selected', selected2);
+        }
+      }
+
+      if (selTarget === 'cell') {
+        var selected3;
+        if (selected === null) {
+          selected3 = [];
+        } else {
+          selected3 = selected;
+        }
+        var findIndex = function(ij) {
+          for (var i = 0; i < selected3.length; i++) {
+            if (ij[0] === selected3[i][0] && ij[1] === selected3[i][1]) return i;
+          }
+          return -1;
+        }
+        table.on('click.dt', 'tbody td', function() {
+          var $this = $(this), info = tweakCellIndex(table.cell(this));
+          if ($this.hasClass(selClass)) {
+            $this.removeClass(selClass);
+            selected3.splice(findIndex([info.row, info.col]), 1);
+          } else {
+            if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass);
+            $this.addClass(selClass);
+            selected3 = selMode === 'single' ? [[info.row, info.col]] :
+              unique(selected3.concat([[info.row, info.col]]));
+          }
+          changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');
+        });
+        changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');
+        var selectCells = function() {
+          table.$('td.' + selClass).removeClass(selClass);
+          if (selected3.length === 0) return;
+          if (server) {
+            table.cells({page: 'current'}).every(function() {
+              var info = tweakCellIndex(this);
+              if (findIndex([info.row, info.col], selected3) > -1)
+                $(this.node()).addClass(selClass);
+            });
+          } else {
+            selected3.map(function(ij) {
+              $(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass);
+            });
+          }
+        };
+        selectCells();  // in case users have specified pre-selected columns
+        if (server) table.on('draw.dt', selectCells);
+        methods.selectCells = function(selected) {
+          selected3 = selected ? selected : [];
+          selectCells();
+          changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');
+        }
+      }
+    }
+
+    // expose some table info to Shiny
+    var updateTableInfo = function(e, settings) {
+      // TODO: is anyone interested in the page info?
+      // changeInput('page_info', table.page.info());
+      var updateRowInfo = function(id, modifier) {
+        var idx;
+        if (server) {
+          idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all;
+        } else {
+          var rows = table.rows($.extend({
+            search: 'applied',
+            page: 'all'
+          }, modifier));
+          idx = addOne(rows.indexes().toArray());
+        }
+        changeInput('rows' + '_' + id, idx);
+      };
+      updateRowInfo('current', {page: 'current'});
+      updateRowInfo('all', {});
+    }
+    table.on('draw.dt', updateTableInfo);
+    updateTableInfo();
+
+    // state info
+    table.on('draw.dt column-visibility.dt', function() {
+      changeInput('state', table.state());
+    });
+    changeInput('state', table.state());
+
+    // search info
+    var updateSearchInfo = function() {
+      changeInput('search', table.search());
+      if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) {
+        return $(td).find('input').first().val();
+      }));
+    }
+    table.on('draw.dt', updateSearchInfo);
+    updateSearchInfo();
+
+    // the current cell clicked on
+    table.on('click.dt', 'tbody td', function() {
+      var info = tweakCellIndex(table.cell(this));
+      info.value = table.cell(this).data();
+      changeInput('cell_clicked', info);
+    })
+    changeInput('cell_clicked', {});
+
+    // do not trigger table selection when clicking on links unless they have classes
+    table.on('click.dt', 'tbody td a', function(e) {
+      if (this.className === '') e.stopPropagation();
+    });
+
+    methods.addRow = function(data, rowname) {
+      var data0 = table.row(0).data(), n = data0.length, d = n - data.length;
+      if (d === 1) {
+        data = rowname.concat(data)
+      } else if (d !== 0) {
+        console.log(data);
+        console.log(data0);
+        throw 'New data must be of the same length as current data (' + n + ')';
+      };
+      table.row.add(data).draw();
+    }
+
+    methods.updateSearch = function(keywords) {
+      if (keywords.global !== null)
+        $(table.table().container()).find('input[type=search]').first()
+             .val(keywords.global).trigger('input');
+      var columns = keywords.columns;
+      if (!filterRow || columns === null) return;
+      filterRow.toArray().map(function(td, i) {
+        var v = typeof columns === 'string' ? columns : columns[i];
+        if (typeof v === 'undefined') {
+          console.log('The search keyword for column ' + i + ' is undefined')
+          return;
+        }
+        $(td).find('input').first().val(v);
+        table.column(i).search(v);
+      });
+      table.draw();
+    }
+
+    methods.selectPage = function(page) {
+      if (table.page.info().pages < page || page < 1) {
+        throw 'Selected page is out of range';
+      };
+      table.page(page - 1).draw(false);
+    }
+
+    methods.reloadData = function(resetPaging, clearSelection) {
+      // empty selections first if necessary
+      if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]);
+      if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]);
+      if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]);
+      table.ajax.reload(null, resetPaging);
+    }
+
+    table.shinyMethods = methods;
+  },
+  resize: function(el, width, height, instance) {
+    if (instance.data) this.renderValue(el, instance.data, instance);
+
+    // dynamically adjust height if fillContainer = TRUE
+    if (instance.fillContainer)
+      this.fillAvailableHeight(el, height);
+
+    this.adjustWidth(el);
+  },
+
+  // dynamically set the scroll body to fill available height
+  // (used with fillContainer = TRUE)
+  fillAvailableHeight: function(el, availableHeight) {
+
+    // see how much of the table is occupied by header/footer elements
+    // and use that to compute a target scroll body height
+    var dtWrapper = $(el).find('div.dataTables_wrapper');
+    var dtScrollBody = $(el).find($('div.dataTables_scrollBody'));
+    var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight();
+    var scrollBodyHeight = availableHeight - framingHeight;
+
+    // set the height
+    dtScrollBody.height(scrollBodyHeight + 'px');
+  },
+
+  // adjust the width of columns; remove the hard-coded widths on table and the
+  // scroll header when scrollX/Y are enabled
+  adjustWidth: function(el) {
+    var $el = $(el), table = $el.data('datatable');
+    if (table) table.columns.adjust();
+    $el.find('.dataTables_scrollHeadInner').css('width', '')
+        .children('table').css('margin-left', '');
+  }
+});
+
+  if (!HTMLWidgets.shinyMode) return;
+
+  Shiny.addCustomMessageHandler('datatable-calls', function(data) {
+    var id = data.id;
+    var el = document.getElementById(id);
+    var table = el ? $(el).data('datatable') : null;
+    if (!table) {
+      console.log("Couldn't find table with id " + id);
+      return;
+    }
+
+    var methods = table.shinyMethods, call = data.call;
+    if (methods[call.method]) {
+      methods[call.method].apply(table, call.args);
+    } else {
+      console.log("Unknown method " + call.method);
+    }
+  });
+
+})();
diff --git a/inst/htmlwidgets/datatables.yaml b/inst/htmlwidgets/datatables.yaml
new file mode 100644
index 0000000..25d1644
--- /dev/null
+++ b/inst/htmlwidgets/datatables.yaml
@@ -0,0 +1,5 @@
+dependencies:
+  - name: jquery
+    version: 1.12.4
+    src: "htmlwidgets/lib/jquery"
+    script: jquery.min.js
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.bootstrap.min.css
new file mode 100644
index 0000000..bbd2a11
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.bootstrap.min.css
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #337ab7;background:#337ab7}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#337ab7;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.rig [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.bootstrap4.min.css
new file mode 100644
index 0000000..58a210e
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.bootstrap4.min.css
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #0275d8;background:#0275d8}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#0275d8;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.rig [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.dataTables.min.css
new file mode 100644
index 0000000..57238a8
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.dataTables.min.css
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #316ad1;background:linear-gradient(to bottom, #abcffb 0%, #4989de 100%)}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#4989de;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-au [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.foundation.min.css
new file mode 100644
index 0000000..74f02a7
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.foundation.min.css
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #008CBA;background:#008CBA}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#008CBA;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.rig [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.jqueryui.min.css
new file mode 100644
index 0000000..28b15d6
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.jqueryui.min.css
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #316ad1;background:linear-gradient(to bottom, #abcffb 0%, #4989de 100%)}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#4989de;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-au [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.semanticui.min.css
new file mode 100644
index 0000000..33b4824
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/css/autoFill.semanticui.min.css
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #888;background:#888}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#888;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width: [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.bootstrap.min.js b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.bootstrap.min.js
new file mode 100644
index 0000000..7a8d071
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.bootstrap.min.js
@@ -0,0 +1,5 @@
+/*!
+ Bootstrap integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-bs")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="btn btn-primary";return a});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.bootstrap4.min.js b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.bootstrap4.min.js
new file mode 100644
index 0000000..87ea58c
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.bootstrap4.min.js
@@ -0,0 +1,5 @@
+/*!
+ Bootstrap integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs4","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-bs4")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="btn btn-primary";return a});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.foundation.min.js b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.foundation.min.js
new file mode 100644
index 0000000..df655a5
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.foundation.min.js
@@ -0,0 +1,5 @@
+/*!
+ Foundation integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-zf","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-zf")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="button tiny";return a});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.jqueryui.min.js b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.jqueryui.min.js
new file mode 100644
index 0000000..4bb198f
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.jqueryui.min.js
@@ -0,0 +1,6 @@
+/*!
+ jQuery UI integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-jqui","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-jqui")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="ui-button ui-state-default u [...]
+return a});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.semanticui.min.js b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.semanticui.min.js
new file mode 100644
index 0000000..b67185b
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/autoFill.semanticui.min.js
@@ -0,0 +1,5 @@
+/*!
+ Bootstrap integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-se","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-se")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="ui button";return a});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/dataTables.autoFill.min.js b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/dataTables.autoFill.min.js
new file mode 100644
index 0000000..625ea46
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/AutoFill/js/dataTables.autoFill.min.js
@@ -0,0 +1,23 @@
+/*!
+ AutoFill 2.1.2
+ ©2008-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(e){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(j){return e(j,window,document)}):"object"===typeof exports?module.exports=function(j,i){j||(j=window);if(!i||!i.fn.dataTable)i=require("datatables.net")(j,i).$;return e(i,j,j.document)}:e(jQuery,window,document)})(function(e,j,i,q){var l=e.fn.dataTable,o=0,m=function(b,c){if(!l.versionCheck||!l.versionCheck("1.10.8"))throw"Warning: AutoFill requires DataTables 1.10.8 or greater";this.c=e.exten [...]
+m.defaults,c);this.s={dt:new l.Api(b),namespace:".autoFill"+o++,scroll:{},scrollInterval:null,handle:{height:0,width:0}};this.dom={handle:e('<div class="dt-autofill-handle"/>'),select:{top:e('<div class="dt-autofill-select top"/>'),right:e('<div class="dt-autofill-select right"/>'),bottom:e('<div class="dt-autofill-select bottom"/>'),left:e('<div class="dt-autofill-select left"/>')},background:e('<div class="dt-autofill-background"/>'),list:e('<div class="dt-autofill-list">'+this.s.dt.i1 [...]
+"")+"<ul/></div>"),dtScroll:null,offsetParent:null};this._constructor()};e.extend(m.prototype,{_constructor:function(){var b=this,c=this.s.dt,a=e("div.dataTables_scrollBody",this.s.dt.table().container());a.length&&(this.dom.dtScroll=a,"static"===a.css("position")&&a.css("position","relative"));this._focusListener();this.dom.handle.on("mousedown",function(a){b._mousedown(a);return false});c.on("destroy.autoFill",function(){c.off(".autoFill");e(c.table().body()).off(b.s.namespace);e(i.bod [...]
+_attach:function(b){var c=this.s.dt,a=c.cell(b).index(),d=this.dom.handle,h=this.s.handle,f=e("div.dataTables_scrollBody",this.s.dt.table().container()),g=0,k=0;if(!a||-1===c.columns(this.c.columns).indexes().indexOf(a.column))this._detach();else{this.dom.offsetParent||(this.dom.offsetParent=e(b).offsetParent());if(!h.height||!h.width)d.appendTo("body"),h.height=d.outerHeight(),h.width=d.outerWidth();a=e(b).position();f.length&&this.dom.offsetParent[0]!==c.table().node()&&(k=f.scrollTop( [...]
+this.dom.attachedTo=b;d.css({top:a.top+b.offsetHeight-h.height+k,left:a.left+b.offsetWidth-h.width+g}).appendTo(this.dom.offsetParent)}},_actionSelector:function(b){var c=this,a=this.s.dt,d=m.actions,h=[];e.each(d,function(c,d){d.available(a,b)&&h.push(c)});if(1===h.length&&!1===this.c.alwaysAsk){var f=d[h[0]].execute(a,b);this._update(f,b)}else{var g=this.dom.list.children("ul").empty();h.push("cancel");e.each(h,function(h,f){g.append(e("<li/>").append('<div class="dt-autofill-question" [...]
+b)+"<div>").append(e('<div class="dt-autofill-button">').append(e('<button class="'+m.classes.btn+'">'+a.i18n("autoFill.button",">")+"</button>").on("click",function(){var h=d[f].execute(a,b,e(this).closest("li"));c._update(h,b);c.dom.background.remove();c.dom.list.remove()}))))});this.dom.background.appendTo("body");this.dom.list.appendTo("body");this.dom.list.css("margin-top",-1*(this.dom.list.outerHeight()/2))}},_detach:function(){this.dom.attachedTo=null;this.dom.handle.detach()}, [...]
+this.s.dt,a=this.s.start,d=e(this.dom.start),h=e(b),f={row:c.rows({page:"current"}).nodes().indexOf(h.parent()[0]),column:h.index()};if(c.cell(h).any()&&-1!==c.columns(this.c.columns).indexes().indexOf(f.column)){this.s.end=f;var g,k,b=a.row<f.row?d:h;g=a.row<f.row?h:d;k=a.column<f.column?d:h;d=a.column<f.column?h:d;b=b.position().top;k=k.position().left;a=g.position().top+g.outerHeight()-b;d=d.position().left+d.outerWidth()-k;if((g=this.dom.dtScroll)&&this.dom.offsetParent[0]!==c.table( [...]
+g.scrollTop(),k+=g.scrollLeft();c=this.dom.select;c.top.css({top:b,left:k,width:d});c.left.css({top:b,left:k,height:a});c.bottom.css({top:b+a,left:k,width:d});c.right.css({top:b,left:k+d,height:a})}},_editor:function(b){var c=this.s.dt,a=this.c.editor;if(a){for(var d={},h=[],e=a.fields(),g=0,k=b.length;g<k;g++)for(var i=0,m=b[g].length;i<m;i++){var n=b[g][i],j=c.settings()[0].aoColumns[n.index.column],l=j.editField;if(l===q)for(var j=j.mData,p=0,o=e.length;p<o;p++){var r=a.field(e[p]);if [...]
+j){l=r.name();break}}if(!l)throw"Could not automatically determine field data. Please see https://datatables.net/tn/11";d[l]||(d[l]={});j=c.row(n.index.row).id();d[l][j]=n.set;h.push(n.index)}a.bubble(h,!1).multiSet(d).submit()}},_emitEvent:function(b,c){this.s.dt.iterator("table",function(a){e(a.nTable).triggerHandler(b+".dt",c)})},_focusListener:function(){var b=this,c=this.s.dt,a=this.s.namespace,d=null!==this.c.focus?this.c.focus:c.settings()[0].keytable?"focus":"hover";if("focus"=== [...]
+function(a,c,d){b._attach(d.node())}).on("key-blur.autoFill",function(){b._detach()});else if("click"===d)e(c.table().body()).on("click"+a,"td, th",function(){b._attach(this)}),e(i.body).on("click"+a,function(a){e(a.target).parents().filter(c.table().body()).length||b._detach()});else e(c.table().body()).on("mouseenter"+a,"td, th",function(){b._attach(this)}).on("mouseleave"+a,function(a){e(a.relatedTarget).hasClass("dt-autofill-handle")||b._detach()})},_mousedown:function(b){var c=this, [...]
+this.dom.start=this.dom.attachedTo;this.s.start={row:a.rows({page:"current"}).nodes().indexOf(e(this.dom.start).parent()[0]),column:e(this.dom.start).index()};e(i.body).on("mousemove.autoFill",function(a){c._mousemove(a)}).on("mouseup.autoFill",function(a){c._mouseup(a)});var a=this.dom.select,d=e(this.s.dt.table().body()).offsetParent();a.top.appendTo(d);a.left.appendTo(d);a.right.appendTo(d);a.bottom.appendTo(d);this._drawSelection(this.dom.start,b);this.dom.handle.css("display","none" [...]
+this.s.scroll={windowHeight:e(j).height(),windowWidth:e(j).width(),dtTop:b?b.offset().top:null,dtLeft:b?b.offset().left:null,dtHeight:b?b.outerHeight():null,dtWidth:b?b.outerWidth():null}},_mousemove:function(b){var c=b.target.nodeName.toLowerCase();"td"!==c&&"th"!==c||(this._drawSelection(b.target,b),this._shiftScroll(b))},_mouseup:function(){e(i.body).off(".autoFill");var b=this.s.dt,c=this.dom.select;c.top.remove();c.left.remove();c.right.remove();c.bottom.remove();this.dom.handle.css [...]
+"block");var c=this.s.start,a=this.s.end;if(!(c.row===a.row&&c.column===a.column)){for(var d=this._range(c.row,a.row),c=this._range(c.column,a.column),a=[],h=b.settings()[0],f=h.aoColumns,g=0;g<d.length;g++)a.push(e.map(c,function(a){var a=b.cell(":eq("+d[g]+")",a+":visible",{page:"current"}),c=a.data(),e=a.index(),i=f[e.column].editField;i!==q&&(c=h.oApi._fnGetObjectDataFn(i)(b.row(e.row).data()));return{cell:a,data:c,label:a.data(),index:e}}));this._actionSelector(a);clearInterval(this [...]
+this.s.scrollInterval=null}},_range:function(b,c){var a=[],d;if(b<=c)for(d=b;d<=c;d++)a.push(d);else for(d=b;d>=c;d--)a.push(d);return a},_shiftScroll:function(b){var c=this,a=this.s.scroll,d=!1,e=b.pageY-i.body.scrollTop,f=b.pageX-i.body.scrollLeft,g,k,j,l;65>e?g=-5:e>a.windowHeight-65&&(g=5);65>f?k=-5:f>a.windowWidth-65&&(k=5);null!==a.dtTop&&b.pageY<a.dtTop+65?j=-5:null!==a.dtTop&&b.pageY>a.dtTop+a.dtHeight-65&&(j=5);null!==a.dtLeft&&b.pageX<a.dtLeft+65?l=-5:null!==a.dtLeft&&b.pageX>a [...]
+65&&(l=5);g||k||j||l?(a.windowVert=g,a.windowHoriz=k,a.dtVert=j,a.dtHoriz=l,d=!0):this.s.scrollInterval&&(clearInterval(this.s.scrollInterval),this.s.scrollInterval=null);!this.s.scrollInterval&&d&&(this.s.scrollInterval=setInterval(function(){if(a.windowVert)i.body.scrollTop=i.body.scrollTop+a.windowVert;if(a.windowHoriz)i.body.scrollLeft=i.body.scrollLeft+a.windowHoriz;if(a.dtVert||a.dtHoriz){var b=c.dom.dtScroll[0];if(a.dtVert)b.scrollTop=b.scrollTop+a.dtVert;if(a.dtHoriz)b.scrollLeft [...]
+a.dtHoriz}},20))},_update:function(b,c){if(!1!==b){var a=this.s.dt,d;this._emitEvent("preAutoFill",[a,c]);this._editor(c);if(null!==this.c.update?this.c.update:!this.c.editor){for(var e=0,f=c.length;e<f;e++)for(var g=0,i=c[e].length;g<i;g++)d=c[e][g],d.cell.data(d.set);a.draw(!1)}this._emitEvent("autoFill",[a,c])}}});m.actions={increment:{available:function(b,c){return e.isNumeric(c[0][0].label)},option:function(b){return b.i18n("autoFill.increment",'Increment / decrement each cell by: < [...]
+execute:function(b,c,a){for(var b=1*c[0][0].data,a=1*e("input",a).val(),d=0,h=c.length;d<h;d++)for(var f=0,g=c[d].length;f<g;f++)c[d][f].set=b,b+=a}},fill:{available:function(){return!0},option:function(b,c){return b.i18n("autoFill.fill","Fill all cells with <i>"+c[0][0].label+"</i>")},execute:function(b,c){for(var a=c[0][0].data,d=0,e=c.length;d<e;d++)for(var f=0,g=c[d].length;f<g;f++)c[d][f].set=a}},fillHorizontal:{available:function(b,c){return 1<c.length&&1<c[0].length},option:functi [...]
+"Fill cells horizontally")},execute:function(b,c){for(var a=0,d=c.length;a<d;a++)for(var e=0,f=c[a].length;e<f;e++)c[a][e].set=c[a][0].data}},fillVertical:{available:function(b,c){return 1<c.length&&1<c[0].length},option:function(b){return b.i18n("autoFill.fillVertical","Fill cells vertically")},execute:function(b,c){for(var a=0,d=c.length;a<d;a++)for(var e=0,f=c[a].length;e<f;e++)c[a][e].set=c[0][e].data}},cancel:{available:function(){return!1},option:function(b){return b.i18n("autoFill [...]
+"Cancel")},execute:function(){return!1}}};m.version="2.1.2";m.defaults={alwaysAsk:!1,focus:null,columns:"",update:null,editor:null};m.classes={btn:"btn"};e(i).on("preInit.dt.autofill",function(b,c){if("dt"===b.namespace){var a=c.oInit.autoFill,d=l.defaults.autoFill;if(a||d)d=e.extend({},a,d),!1!==a&&new m(c,d)}});l.AutoFill=m;return l.AutoFill=m});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.bootstrap.min.css
new file mode 100644
index 0000000..05b6c22
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.bootstrap.min.css
@@ -0,0 +1 @@
+div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px; [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.bootstrap4.min.css
new file mode 100644
index 0000000..50839c5
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.bootstrap4.min.css
@@ -0,0 +1 @@
+div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px; [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.dataTables.min.css
new file mode 100644
index 0000000..a8758ee
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.dataTables.min.css
@@ -0,0 +1 @@
+div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;marg [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.foundation.min.css
new file mode 100644
index 0000000..6caef67
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.foundation.min.css
@@ -0,0 +1 @@
+div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-buttons li{margin:0}ul.dt-buttons li.active a{box-shadow:inset 0 0 10px rgba(0,0,0,0.6)}ul.dt-buttons. [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.jqueryui.min.css
new file mode 100644
index 0000000..51662b2
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.jqueryui.min.css
@@ -0,0 +1 @@
+div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-buttons{position:relative;float:left}div.dt-buttons .dt-button{margin-right:0}div.dt-buttons .dt-butt [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.semanticui.min.css
new file mode 100644
index 0000000..54cb930
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/css/buttons.semanticui.min.css
@@ -0,0 +1 @@
+div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px !important;z-index:2002;b [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.bootstrap.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.bootstrap.min.js
new file mode 100644
index 0000000..dc28bac
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+ Bootstrap integration for DataTables' Buttons
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{classNa [...]
+button:{className:"btn btn-default"},collection:{tag:"ul",className:"dt-button-collection dropdown-menu",button:{tag:"li",className:"dt-button"},buttonLiner:{tag:"a",className:""}}}});a.ext.buttons.collection.text=function(a){return a.i18n("buttons.collection",'Collection <span class="caret"/>')};return a.Buttons});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.bootstrap4.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.bootstrap4.min.js
new file mode 100644
index 0000000..048b857
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.bootstrap4.min.js
@@ -0,0 +1,6 @@
+/*!
+ Bootstrap integration for DataTables' Buttons
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs4","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs4")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{class [...]
+button:{className:"btn btn-secondary"},collection:{tag:"div",className:"dt-button-collection dropdown-menu",button:{tag:"a",className:"dt-button dropdown-item"}}}});a.ext.buttons.collection.className+=" dropdown-toggle";return a.Buttons});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.colVis.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.colVis.min.js
new file mode 100644
index 0000000..e007073
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.colVis.min.js
@@ -0,0 +1,5 @@
+(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(d){return g(d,window,document)}):"object"===typeof exports?module.exports=function(d,e){d||(d=window);if(!e||!e.fn.dataTable)e=require("datatables.net")(d,e).$;e.fn.dataTable.Buttons||require("datatables.net-buttons")(d,e);return g(e,d,d.document)}:g(jQuery,window,document)})(function(g,d,e,h){d=g.fn.dataTable;g.extend(d.ext.buttons,{colvis:function(a,b){return{extend: [...]
+text:function(a){return a.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:b.columns}]}},columnsToggle:function(a,b){return a.columns(b.columns).indexes().map(function(a){return{extend:"columnToggle",columns:a}}).toArray()},columnToggle:function(a,b){return{extend:"columnVisibility",columns:b.columns}},columnsVisibility:function(a,b){return a.columns(b.columns).indexes().map(function(a){return{extend:"columnVisibility",column [...]
+columnVisibility:{columns:h,text:function(a,b,c){return c._columnText(a,c.columns)},className:"buttons-columnVisibility",action:function(a,b,c,f){a=b.columns(f.columns);b=a.visible();a.visible(f.visibility!==h?f.visibility:!(b.length&&b[0]))},init:function(a,b,c){var f=this,d=a.column(c.columns);a.on("column-visibility.dt"+c.namespace,function(a,b){b.bDestroying||f.active(d.visible())}).on("column-reorder.dt"+c.namespace,function(b,d,e){1===a.columns(c.columns).count()&&("number"===typeo [...]
+(c.columns=e.mapping[c.columns]),b=a.column(c.columns),f.text(c._columnText(a,c.columns)),f.active(b.visible()))});this.active(d.visible())},destroy:function(a,b,c){a.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(a,b){var c=a.column(b).index();return a.settings()[0].aoColumns[c].sTitle.replace(/\n/g," ").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"")}},colvisRestore:{className:"buttons-colvisRestore",text:function(a){return a.i18n("butt [...]
+"Restore visibility")},init:function(a,b,c){c._visOriginal=a.columns().indexes().map(function(b){return a.column(b).visible()}).toArray()},action:function(a,b,c,d){b.columns().every(function(a){a=b.colReorder&&b.colReorder.transpose?b.colReorder.transpose(a,"toOriginal"):a;this.visible(d._visOriginal[a])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(a,b,c,d){b.columns(d.show).visible(!0,!1);b.columns(d.hide).visible(!1,!1);b.columns.adjust()},show:[],hide:[]}});return  [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.flash.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.flash.min.js
new file mode 100644
index 0000000..82fc495
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.flash.min.js
@@ -0,0 +1,29 @@
+(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(i){return g(i,window,document)}):"object"===typeof exports?module.exports=function(i,k){i||(i=window);if(!k||!k.fn.dataTable)k=require("datatables.net")(i,k).$;k.fn.dataTable.Buttons||require("datatables.net-buttons")(i,k);return g(k,i,i.document)}:g(jQuery,window,document)})(function(g,i,k,o){function l(a,b,d){var c=a.createElement(b);d&&(d.attr&&g(c).attr(d.attr),d.c [...]
+g.each(d.children,function(a,b){c.appendChild(b)}),d.text&&c.appendChild(a.createTextNode(d.text)));return c}function y(a,b){var d=a.header[b].length,c;a.footer&&a.footer[b].length>d&&(d=a.footer[b].length);for(var e=0,f=a.body.length;e<f&&!(c=a.body[e][b].toString().length,c>d&&(d=c),40<d);e++);return 5<d?d:5}function u(a){n===o&&(n=-1===v.serializeToString(g.parseXML(p["xl/worksheets/sheet1.xml"])).indexOf("xmlns:r"));g.each(a,function(b,d){if(g.isPlainObject(d))u(d);else{if(n){var c=d [...]
+e,f,h=[];for(e=c.attributes.length-1;0<=e;e--){f=c.attributes[e].nodeName;var i=c.attributes[e].nodeValue;-1!==f.indexOf(":")&&(h.push({name:f,value:i}),c.removeAttribute(f))}e=0;for(f=h.length;e<f;e++)i=d.createAttribute(h[e].name.replace(":","_dt_b_namespace_token_")),i.value=h[e].value,c.setAttributeNode(i)}c=v.serializeToString(d);n&&(-1===c.indexOf("<?xml")&&(c='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+c),c=c.replace(/_dt_b_namespace_token_/g,":"));c=c.replace(/<row  [...]
+"<row ").replace(/<cols xmlns="">/g,"<cols>");a[b]=c}})}var j=g.fn.dataTable,h={version:"1.0.4-TableTools2",clients:{},moviePath:"",nextId:1,$:function(a){"string"==typeof a&&(a=k.getElementById(a));a.addClass||(a.hide=function(){this.style.display="none"},a.show=function(){this.style.display=""},a.addClass=function(a){this.removeClass(a);this.className+=" "+a},a.removeClass=function(a){this.className=this.className.replace(RegExp("\\s*"+a+"\\s*")," ").replace(/^\s+/,"").replace(/\s+$/," [...]
+function(a){return!!this.className.match(RegExp("\\s*"+a+"\\s*"))});return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,d){(a=this.clients[a])&&a.receiveEvent(b,d)},log:function(a){console.log("Flash: "+a)},register:function(a,b){this.clients[a]=b},getDOMObjectPosition:function(a){var b={left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};""!==a.style.width&&(b.width=a.style.width.replace("px",""));""!==a.style.height&&(b.heigh [...]
+""));for(;a;)b.left+=a.offsetLeft,b.top+=a.offsetTop,a=a.offsetParent;return b},Client:function(a){this.handlers={};this.id=h.nextId++;this.movieId="ZeroClipboard_TableToolsMovie_"+this.id;h.register(this.id,this);a&&this.glue(a)}};h.Client.prototype={id:0,ready:!1,movie:null,clipText:"",fileName:"",action:"copy",handCursorEnabled:!0,cssEffects:!0,handlers:null,sized:!1,sheetName:"",glue:function(a,b){this.domElement=h.$(a);var d=99;this.domElement.style.zIndex&&(d=parseInt(this.domEleme [...]
+10)+1);var c=h.getDOMObjectPosition(this.domElement);this.div=k.createElement("div");var e=this.div.style;e.position="absolute";e.left="0px";e.top="0px";e.width=c.width+"px";e.height=c.height+"px";e.zIndex=d;"undefined"!=typeof b&&""!==b&&(this.div.title=b);0!==c.width&&0!==c.height&&(this.sized=!0);this.domElement&&(this.domElement.appendChild(this.div),this.div.innerHTML=this.getHTML(c.width,c.height).replace(/&/g,"&"))},positionElement:function(){var a=h.getDOMObjectPosition(this. [...]
+b=this.div.style;b.position="absolute";b.width=a.width+"px";b.height=a.height+"px";0!==a.width&&0!==a.height&&(this.sized=!0,b=this.div.childNodes[0],b.width=a.width,b.height=a.height)},getHTML:function(a,b){var d="",c="id="+this.id+"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/))var e=location.href.match(/^https/i)?"https://":"http://",d=d+('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+e+'download.macromedia.com/pub/shockwave/cabs/flash/swflash. [...]
+a+'" height="'+b+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+h.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+c+'"/><param name="wmode" value="transparent"/></object>');else d+='<embed id="'+this.movieId+'" src="'+h.moviePat [...]
+a+'" height="'+b+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+c+'" wmode="transparent" />';return d},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){var a=this;this.domElement&&this.div&&(g(this.div).remove(),this.div=this.domElement=null,g.each(h.clients,function(b,d){d [...]
+reposition:function(a){a&&((this.domElement=h.$(a))||this.hide());if(this.domElement&&this.div){var a=h.getDOMObjectPosition(this.domElement),b=this.div.style;b.left=""+a.left+"px";b.top=""+a.top+"px"}},clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+=a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.set [...]
+setSheetData:function(a){this.ready&&this.movie.setSheetData(JSON.stringify(a))},setAction:function(a){this.action=a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){var d,a=a.toString().toLower [...]
+"");switch(a){case "load":this.movie=k.getElementById(this.movieId);if(!this.movie){d=this;setTimeout(function(){d.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){d=this;setTimeout(function(){d.receiveEvent("load",null)},100);this.ready=!0;return}this.ready=!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setHand [...]
+break;case "mouseover":this.domElement&&this.cssEffects&&this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActi [...]
+0,e=this.handlers[a].length;c<e;c++){var f=this.handlers[a][c];if("function"==typeof f)f(this,b);else if("object"==typeof f&&2==f.length)f[0][f[1]](this,b);else if("string"==typeof f)i[f](this,b)}}};h.hasFlash=function(){try{if(new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))return!0}catch(a){if(navigator.mimeTypes&&navigator.mimeTypes["application/x-shockwave-flash"]!==o&&navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)return!0}return!1};i.ZeroClipboard_TableTools= [...]
+b){b.attr("id");b.parents("html").length?a.glue(b[0],""):setTimeout(function(){w(a,b)},500)},q=function(a,b){var d="*"===a.filename&&"*"!==a.title&&a.title!==o?a.title:a.filename;"function"===typeof d&&(d=d());-1!==d.indexOf("*")&&(d=g.trim(d.replace("*",g("title").text())));d=d.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g,"");return b===o||!0===b?d+a.extension:d},z=function(a){var b="Sheet1";a.sheetName&&(b=a.sheetName.replace(/[\[\]\*\/\\\?\:]/g,""));return b},r=function(a,b){var  [...]
+[];a.clearText();for(var c=0,e=d.length;c<e;c++)a.appendText(d[c])},x=function(a,b){for(var d=b.newline?b.newline:navigator.userAgent.match(/Windows/)?"\r\n":"\n",c=a.buttons.exportData(b.exportOptions),e=b.fieldBoundary,f=b.fieldSeparator,g=RegExp(e,"g"),h=b.escapeChar!==o?b.escapeChar:"\\",i=function(a){for(var b="",c=0,d=a.length;c<d;c++)0<c&&(b+=f),b+=e?e+(""+a[c]).replace(g,h+e)+e:a[c];return b},k=b.header?i(c.header)+d:"",m=b.footer&&c.footer?d+i(c.footer):"",l=[],t=0,A=c.body.leng [...]
+return{str:k+l.join(d)+m,rows:l.length}},s={available:function(){return h.hasFlash()},init:function(a,b,d){h.moviePath=j.Buttons.swfPath;var c=new h.Client;c.setHandCursor(!0);c.addEventListener("mouseDown",function(){d._fromFlash=!0;a.button(b[0]).trigger();d._fromFlash=!1});w(c,b);d._flash=c},destroy:function(a,b,d){d._flash.destroy()},fieldSeparator:",",fieldBoundary:'"',exportOptions:{},title:"*",filename:"*",extension:".csv",header:!0,footer:!1};try{var v=new XMLSerializer,n}catch(B [...]
+{"_rels/.rels":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/></Relationships>',"xl/_rels/workbook.xml.rels":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relations [...]
+"[Content_Types].xml":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="xml" ContentType="application/xml" /><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" /><Default Extension="jpeg" ContentType="image/jpeg" /><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" /> [...]
+"xl/workbook.xml":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="24816"/><workbookPr showInkAnnotation="0" autoCompressPictures="0"/><bookViews><workbookView xWindow="0" yWindow="0" windowWidth="25600" windowHeight="19020" tabRatio="500"/></bookViews><sheets><s [...]
+"xl/worksheets/sheet1.xml":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"><sheetData/></worksheet>',"xl/styles.xml":'<?xml version="1.0" encoding="UTF-8"?><styleS [...]
+j.Buttons.swfPath="//cdn.datatables.net/buttons/1.2.0/swf/flashExport.swf";j.Api.register("buttons.resize()",function(){g.each(h.clients,function(a,b){b.domElement!==o&&b.domElement.parentNode&&b.positionElement()})});j.ext.buttons.copyFlash=g.extend({},s,{className:"buttons-copy buttons-flash",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,d,c){c._fromFlash&&(a=c._flash,d=x(b,c),c=c.customize?c.customize(d.str,c):d.str,a.setAction("copy"),r(a,c),b.buttons.inf [...]
+"Copy to clipboard"),b.i18n("buttons.copySuccess",{_:"Copied %d rows to clipboard",1:"Copied 1 row to clipboard"},d.rows),3E3))},fieldSeparator:"\t",fieldBoundary:""});j.ext.buttons.csvFlash=g.extend({},s,{className:"buttons-csv buttons-flash",text:function(a){return a.i18n("buttons.csv","CSV")},action:function(a,b,d,c){a=c._flash;b=x(b,c);b=c.customize?c.customize(b.str,c):b.str;a.setAction("csv");a.setFileName(q(c));r(a,b)},escapeChar:'"'});j.ext.buttons.excelFlash=g.extend({},s,{class [...]
+text:function(a){return a.i18n("buttons.excel","Excel")},action:function(a,b,d,c){var a=c._flash,e=0,f=g.parseXML(p["xl/worksheets/sheet1.xml"]),h=f.getElementsByTagName("sheetData")[0],d={_rels:{".rels":g.parseXML(p["_rels/.rels"])},xl:{_rels:{"workbook.xml.rels":g.parseXML(p["xl/_rels/workbook.xml.rels"])},"workbook.xml":g.parseXML(p["xl/workbook.xml"]),"styles.xml":g.parseXML(p["xl/styles.xml"]),worksheets:{"sheet1.xml":f}},"[Content_Types].xml":g.parseXML(p["[Content_Types].xml"])},b [...]
+i,k,j=function(a){i=e+1;k=l(f,"row",{attr:{r:i}});for(var b=0,c=a.length;b<c;b++){for(var d=b,j="";0<=d;)j=String.fromCharCode(d%26+65)+j,d=Math.floor(d/26)-1;d=j+""+i;if(null===a[b]||a[b]===o)a[b]="";"number"===typeof a[b]||a[b].match&&g.trim(a[b]).match(/^-?\d+(\.\d+)?$/)&&!g.trim(a[b]).match(/^0\d+/)?d=l(f,"c",{attr:{t:"n",r:d},children:[l(f,"v",{text:a[b]})]}):(j=!a[b].replace?a[b]:a[b].replace(/&(?!amp;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/[\x00-\x09\x0B\x0 [...]
+""),d=l(f,"c",{attr:{t:"inlineStr",r:d},children:{row:l(f,"is",{children:{row:l(f,"t",{text:j})}})}}));k.appendChild(d)}h.appendChild(k);e++};g("sheets sheet",d.xl["workbook.xml"]).attr("name",z(c));c.customizeData&&c.customizeData(b);c.header&&(j(b.header,e),g("row c",f).attr("s","2"));for(var m=0,n=b.body.length;m<n;m++)j(b.body[m],e);c.footer&&b.footer&&(j(b.footer,e),g("row:last c",f).attr("s","2"));j=l(f,"cols");g("worksheet",f).prepend(j);m=0;for(n=b.header.length;m<n;m++)j.appendC [...]
+"col",{attr:{min:m+1,max:m+1,width:y(b,m),customWidth:1}}));c.customize&&c.customize(d);u(d);a.setAction("excel");a.setFileName(q(c));a.setSheetData(d);r(a,"")},extension:".xlsx"});j.ext.buttons.pdfFlash=g.extend({},s,{className:"buttons-pdf buttons-flash",text:function(a){return a.i18n("buttons.pdf","PDF")},action:function(a,b,d,c){var a=c._flash,d=b.buttons.exportData(c.exportOptions),e=b.table().node().offsetWidth,f=b.columns(c.columns).indexes().map(function(a){return b.column(a).hea [...]
+e});a.setAction("pdf");a.setFileName(q(c));r(a,JSON.stringify({title:q(c,!1),message:c.message,colWidth:f.toArray(),orientation:c.orientation,size:c.pageSize,header:c.header?d.header:null,footer:c.footer?d.footer:null,body:d.body}))},extension:".pdf",orientation:"portrait",pageSize:"A4",message:"",newline:"\n"});return j.Buttons});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.foundation.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.foundation.min.js
new file mode 100644
index 0000000..aff0f72
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.foundation.min.js
@@ -0,0 +1,6 @@
+/*!
+ Foundation integration for DataTables' Buttons
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-zf","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-zf")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{tag:"di [...]
+buttonContainer:{tag:null,className:""},button:{tag:"a",className:"button small"},buttonLiner:{tag:null},collection:6===a.ext.foundationVersion?{tag:"div",className:"dt-button-collection dropdown-pane is-open button-group stacked"}:{tag:"ul",className:"dt-button-collection f-dropdown open dropdown-pane is-open",button:{tag:"li",className:"small"},buttonLiner:{tag:"a"}}}});a.ext.buttons.collection.className="buttons-collection dropdown";return a.Buttons});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.html5.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.html5.min.js
new file mode 100644
index 0000000..3fc1341
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.html5.min.js
@@ -0,0 +1,26 @@
+(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(j){return g(j,window,document)}):"object"===typeof exports?module.exports=function(j,i,q,r){j||(j=window);if(!i||!i.fn.dataTable)i=require("datatables.net")(j,i).$;i.fn.dataTable.Buttons||require("datatables.net-buttons")(j,i);return g(i,j,j.document,q,r)}:g(jQuery,window,document)})(function(g,j,i,q,r,m){function E(a,b){v===m&&(v=-1===y.serializeToString(g.parseXML(F[ [...]
+g.each(b,function(b,c){if(g.isPlainObject(c)){var e=a.folder(b);E(e,c)}else{if(v){var e=c.childNodes[0],f,h,n=[];for(f=e.attributes.length-1;0<=f;f--){h=e.attributes[f].nodeName;var k=e.attributes[f].nodeValue;-1!==h.indexOf(":")&&(n.push({name:h,value:k}),e.removeAttribute(h))}f=0;for(h=n.length;f<h;f++)k=c.createAttribute(n[f].name.replace(":","_dt_b_namespace_token_")),k.value=n[f].value,e.setAttributeNode(k)}e=y.serializeToString(c);v&&(-1===e.indexOf("<?xml")&&(e='<?xml version="1.0 [...]
+e),e=e.replace(/_dt_b_namespace_token_/g,":"));e=e.replace(/<row xmlns="" /g,"<row ").replace(/<cols xmlns="">/g,"<cols>");a.file(b,e)}})}function o(a,b,d){var c=a.createElement(b);d&&(d.attr&&g(c).attr(d.attr),d.children&&g.each(d.children,function(a,b){c.appendChild(b)}),d.text&&c.appendChild(a.createTextNode(d.text)));return c}function N(a,b){var d=a.header[b].length,c;a.footer&&a.footer[b].length>d&&(d=a.footer[b].length);for(var e=0,f=a.body.length;e<f&&!(c=a.body[e][b].toString().l [...]
+(d=c),40<d);e++);return 5<d?d:5}var s=g.fn.dataTable;q===m&&(q=j.JSZip);r===m&&(r=j.pdfMake);var p;var h="undefined"!==typeof self&&self||"undefined"!==typeof j&&j||this.content;if("undefined"!==typeof navigator&&/MSIE [1-9]\./.test(navigator.userAgent))p=void 0;else{var w=h.document.createElementNS("http://www.w3.org/1999/xhtml","a"),O="download"in w,G=/Version\/[\d\.]+.*Safari/.test(navigator.userAgent),z=h.webkitRequestFileSystem,H=h.requestFileSystem||z||h.mozRequestFileSystem,P=func [...]
+h.setTimeout)(function(){throw a;},0)},A=0,B=function(a){setTimeout(function(){typeof a==="string"?(h.URL||h.webkitURL||h).revokeObjectURL(a):a.remove()},4E4)},C=function(a,b,d){for(var b=[].concat(b),c=b.length;c--;){var e=a["on"+b[c]];if(typeof e==="function")try{e.call(a,d||a)}catch(f){P(f)}}},I=function(a){return/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["",a],{type:a.type}):a},J=function(a,b,d){d||(a=I(a));var c=this,d=a.type [...]
+f,g,n=function(){C(c,["writestart","progress","write","writeend"])},k=function(){if(g&&G&&typeof FileReader!=="undefined"){var b=new FileReader;b.onloadend=function(){var a=b.result;g.location.href="data:attachment/file"+a.slice(a.search(/[,;]/));c.readyState=c.DONE;n()};b.readAsDataURL(a);c.readyState=c.INIT}else{if(e||!f)f=(h.URL||h.webkitURL||h).createObjectURL(a);if(g)g.location.href=f;else if(h.open(f,"_blank")===m&&G)h.location.href=f;c.readyState=c.DONE;n();B(f)}},t=function(a){re [...]
+c.DONE)return a.apply(this,arguments)}},j={create:true,exclusive:false},u;c.readyState=c.INIT;b||(b="download");if(O){f=(h.URL||h.webkitURL||h).createObjectURL(a);setTimeout(function(){w.href=f;w.download=b;var a=new MouseEvent("click");w.dispatchEvent(a);n();B(f);c.readyState=c.DONE})}else{if(h.chrome&&d&&d!=="application/octet-stream"){u=a.slice||a.webkitSlice;a=u.call(a,0,a.size,"application/octet-stream");e=true}z&&b!=="download"&&(b=b+".download");if(d==="application/octet-stream"|| [...]
+A+a.size;H(h.TEMPORARY,A,t(function(d){d.root.getDirectory("saved",j,t(function(d){var f=function(){d.getFile(b,j,t(function(b){b.createWriter(t(function(d){d.onwriteend=function(a){g.location.href=b.toURL();c.readyState=c.DONE;C(c,"writeend",a);B(b)};d.onerror=function(){var a=d.error;a.code!==a.ABORT_ERR&&k()};["writestart","progress","write","abort"].forEach(function(a){d["on"+a]=c["on"+a]});d.write(a);c.abort=function(){d.abort();c.readyState=c.DONE};c.readyState=c.WRITING}),k)}),k)} [...]
+{create:false},t(function(a){a.remove();f()}),t(function(a){a.code===a.NOT_FOUND_ERR?f():k()}))}),k)}),k)}else k()}},l=J.prototype;"undefined"!==typeof navigator&&navigator.msSaveOrOpenBlob?p=function(a,b,d){d||(a=I(a));return navigator.msSaveOrOpenBlob(a,b||"download")}:(l.abort=function(){this.readyState=this.DONE;C(this,"abort")},l.readyState=l.INIT=0,l.WRITING=1,l.DONE=2,l.error=l.onwritestart=l.onprogress=l.onwrite=l.onabort=l.onerror=l.onwriteend=null,p=function(a,b,d){return new J [...]
+p;var x=function(a,b){var d=a.filename==="*"&&a.title!=="*"&&a.title!==m?a.title:a.filename;typeof d==="function"&&(d=d());d.indexOf("*")!==-1&&(d=g.trim(d.replace("*",g("title").text())));d=d.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g,"");return b===m||b===true?d+a.extension:d},Q=function(a){var b="Sheet1";a.sheetName&&(b=a.sheetName.replace(/[\[\]\*\/\\\?\:]/g,""));return b},R=function(a){a=a.title;typeof a==="function"&&(a=a());return a.indexOf("*")!==-1?a.replace("*",g("title" [...]
+"Exported data"):a},K=function(a){return a.newline?a.newline:navigator.userAgent.match(/Windows/)?"\r\n":"\n"},L=function(a,b){for(var d=K(b),c=a.buttons.exportData(b.exportOptions),e=b.fieldBoundary,f=b.fieldSeparator,g=RegExp(e,"g"),h=b.escapeChar!==m?b.escapeChar:"\\",k=function(a){for(var b="",c=0,d=a.length;c<d;c++){c>0&&(b=b+f);b=b+(e?e+(""+a[c]).replace(g,h+e)+e:a[c])}return b},j=b.header?k(c.header)+d:"",i=b.footer&&c.footer?d+k(c.footer):"",u=[],D=0,l=c.body.length;D<l;D++)u.pus [...]
+return{str:j+u.join(d)+i,rows:u.length}},M=function(){return navigator.userAgent.indexOf("Safari")!==-1&&navigator.userAgent.indexOf("Chrome")===-1&&navigator.userAgent.indexOf("Opera")===-1};try{var y=new XMLSerializer,v}catch(S){}var F={"_rels/.rels":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/o [...]
+"xl/_rels/workbook.xml.rels":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/></Relationships>',"[Content_Types].xml":'<?xml version= [...]
+"xl/workbook.xml":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="24816"/><workbookPr showInkAnnotation="0" autoCompressPictures="0"/><bookViews><workbookView xWindow="0" yWindow="0" windowWidth="25600" windowHeight="19020" tabRatio="500"/></bookViews><sheets><s [...]
+"xl/worksheets/sheet1.xml":'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"><sheetData/></worksheet>',"xl/styles.xml":'<?xml version="1.0" encoding="UTF-8"?><styleS [...]
+s.ext.buttons.copyHtml5={className:"buttons-copy buttons-html5",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,d,c){var a=L(b,c),e=a.str,d=g("<div/>").css({height:1,width:1,overflow:"hidden",position:"fixed",top:0,left:0});c.customize&&(e=c.customize(e,c));c=g("<textarea readonly/>").val(e).appendTo(d);if(i.queryCommandSupported("copy")){d.appendTo(b.table().container());c[0].focus();c[0].select();try{i.execCommand("copy");d.remove();b.buttons.info(b.i18n("but [...]
+"Copy to clipboard"),b.i18n("buttons.copySuccess",{1:"Copied one row to clipboard",_:"Copied %d rows to clipboard"},a.rows),2E3);return}catch(f){}}a=g("<span>"+b.i18n("buttons.copyKeys","Press <i>ctrl</i> or <i>⌘</i> + <i>C</i> to copy the table data<br>to your system clipboard.<br><br>To cancel, click this message or press escape.")+"</span>").append(d);b.buttons.info(b.i18n("buttons.copyTitle","Copy to clipboard"),a,0);c[0].focus();c[0].select();var h=g(a).closest(".dt-button-info"),j= [...]
+g(i).off(".buttons-copy");b.buttons.info(false)};h.on("click.buttons-copy",j);g(i).on("keydown.buttons-copy",function(a){a.keyCode===27&&j()}).on("copy.buttons-copy cut.buttons-copy",function(){j()})},exportOptions:{},fieldSeparator:"\t",fieldBoundary:"",header:!0,footer:!1};s.ext.buttons.csvHtml5={className:"buttons-csv buttons-html5",available:function(){return j.FileReader!==m&&j.Blob},text:function(a){return a.i18n("buttons.csv","CSV")},action:function(a,b,d,c){a=L(b,c).str;b=c.chars [...]
+(a=c.customize(a,c));if(b!==false){b||(b=i.characterSet||i.charset);b&&(b=";charset="+b)}else b="";p(new Blob([a],{type:"text/csv"+b}),x(c))},filename:"*",extension:".csv",exportOptions:{},fieldSeparator:",",fieldBoundary:'"',escapeChar:'"',charset:null,header:!0,footer:!1};s.ext.buttons.excelHtml5={className:"buttons-excel buttons-html5",available:function(){return j.FileReader!==m&&q!==m&&!M()&&y},text:function(a){return a.i18n("buttons.excel","Excel")},action:function(a,b,d,c){var e=0 [...]
+f=a("xl/worksheets/sheet1.xml"),h=f.getElementsByTagName("sheetData")[0],a={_rels:{".rels":a("_rels/.rels")},xl:{_rels:{"workbook.xml.rels":a("xl/_rels/workbook.xml.rels")},"workbook.xml":a("xl/workbook.xml"),"styles.xml":a("xl/styles.xml"),worksheets:{"sheet1.xml":f}},"[Content_Types].xml":a("[Content_Types].xml")},b=b.buttons.exportData(c.exportOptions),j,k,d=function(a){j=e+1;k=o(f,"row",{attr:{r:j}});for(var b=0,c=a.length;b<c;b++){for(var d=b,i="";d>=0;){i=String.fromCharCode(d%26+6 [...]
+26)-1}d=i+""+j;if(a[b]===null||a[b]===m)a[b]="";if(typeof a[b]==="number"||a[b].match&&g.trim(a[b]).match(/^-?\d+(\.\d+)?$/)&&!g.trim(a[b]).match(/^0\d+/))d=o(f,"c",{attr:{t:"n",r:d},children:[o(f,"v",{text:a[b]})]});else{i=!a[b].replace?a[b]:a[b].replace(/&(?!amp;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g,"");d=o(f,"c",{attr:{t:"inlineStr",r:d},children:{row:o(f,"is",{children:{row:o(f,"t",{text:i})}})}})}k.appendChild(d)}h.ap [...]
+e++};g("sheets sheet",a.xl["workbook.xml"]).attr("name",Q(c));c.customizeData&&c.customizeData(b);if(c.header){d(b.header,e);g("row c",f).attr("s","2")}for(var i=0,l=b.body.length;i<l;i++)d(b.body[i],e);if(c.footer&&b.footer){d(b.footer,e);g("row:last c",f).attr("s","2")}d=o(f,"cols");g("worksheet",f).prepend(d);i=0;for(l=b.header.length;i<l;i++)d.appendChild(o(f,"col",{attr:{min:i+1,max:i+1,width:N(b,i),customWidth:1}}));c.customize&&c.customize(a);b=new q;d={type:"blob",mimeType:"appli [...]
+E(b,a);b.generateAsync?b.generateAsync(d).then(function(a){p(a,x(c))}):p(b.generate(d),x(c))},filename:"*",extension:".xlsx",exportOptions:{},header:!0,footer:!1};s.ext.buttons.pdfHtml5={className:"buttons-pdf buttons-html5",available:function(){return j.FileReader!==m&&r},text:function(a){return a.i18n("buttons.pdf","PDF")},action:function(a,b,d,c){K(c);a=b.buttons.exportData(c.exportOptions);b=[];c.header&&b.push(g.map(a.header,function(a){return{text:typeof a==="string"?a:a+"",style:" [...]
+for(var e=0,d=a.body.length;e<d;e++)b.push(g.map(a.body[e],function(a){return{text:typeof a==="string"?a:a+"",style:e%2?"tableBodyEven":"tableBodyOdd"}}));c.footer&&a.footer&&b.push(g.map(a.footer,function(a){return{text:typeof a==="string"?a:a+"",style:"tableFooter"}}));a={pageSize:c.pageSize,pageOrientation:c.orientation,content:[{table:{headerRows:1,body:b},layout:"noBorders"}],styles:{tableHeader:{bold:true,fontSize:11,color:"white",fillColor:"#2d4154",alignment:"center"},tableBodyEv [...]
+tableFooter:{bold:true,fontSize:11,color:"white",fillColor:"#2d4154"},title:{alignment:"center",fontSize:15},message:{}},defaultStyle:{fontSize:10}};c.message&&a.content.unshift({text:c.message,style:"message",margin:[0,0,0,12]});c.title&&a.content.unshift({text:R(c,false),style:"title",margin:[0,0,0,12]});c.customize&&c.customize(a,c);a=r.createPdf(a);c.download==="open"&&!M()?a.open():a.getBuffer(function(a){a=new Blob([a],{type:"application/pdf"});p(a,x(c))})},title:"*",filename:"*",e [...]
+exportOptions:{},orientation:"portrait",pageSize:"A4",header:!0,footer:!1,message:null,customize:null,download:"download"};return s.Buttons});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.jqueryui.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.jqueryui.min.js
new file mode 100644
index 0000000..e33da98
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.jqueryui.min.js
@@ -0,0 +1,6 @@
+/*!
+ jQuery UI integration for DataTables' Buttons
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-jqui","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-jqui")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{cla [...]
+button:{className:"dt-button ui-button ui-state-default ui-button-text-only",disabled:"ui-state-disabled",active:"ui-state-active"},buttonLiner:{tag:"span",className:"ui-button-text"}}});a.ext.buttons.collection.text=function(a){return a.i18n("buttons.collection",'Collection <span class="ui-button-icon-primary ui-icon ui-icon-triangle-1-s"/>')};return a.Buttons});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.print.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.print.min.js
new file mode 100644
index 0000000..06a16d5
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.print.min.js
@@ -0,0 +1,4 @@
+(function(e){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(d){return e(d,window,document)}):"object"===typeof exports?module.exports=function(d,a){d||(d=window);if(!a||!a.fn.dataTable)a=require("datatables.net")(d,a).$;a.fn.dataTable.Buttons||require("datatables.net-buttons")(d,a);return e(a,d,d.document)}:e(jQuery,window,document)})(function(e,d,a){var i=e.fn.dataTable,g=a.createElement("a");i.ext.buttons.print={className:"bu [...]
+text:function(c){return c.i18n("buttons.print","Print")},action:function(c,b,a,f){c=b.buttons.exportData(f.exportOptions);a=function(c,a){for(var b="<tr>",d=0,e=c.length;d<e;d++)b+="<"+a+">"+c[d]+"</"+a+">";return b+"</tr>"};b='<table class="'+b.table().node().className+'">';f.header&&(b+="<thead>"+a(c.header,"th")+"</thead>");for(var b=b+"<tbody>",j=0,i=c.body.length;j<i;j++)b+=a(c.body[j],"td");b+="</tbody>";f.footer&&c.footer&&(b+="<tfoot>"+a(c.footer,"th")+"</tfoot>");var h=d.open("" [...]
+"function"===typeof c&&(c=c());-1!==c.indexOf("*")&&(c=c.replace("*",e("title").text()));h.document.close();var k="<title>"+c+"</title>";e("style, link").each(function(){var c=k,b=e(this).clone()[0],a;"link"===b.nodeName.toLowerCase()&&(g.href=b.href,a=g.host,-1===a.indexOf("/")&&0!==g.pathname.indexOf("/")&&(a+="/"),b.href=g.protocol+"//"+a+g.pathname+g.search);k=c+b.outerHTML});h.document.head.innerHTML=k;h.document.body.innerHTML="<h1>"+c+"</h1><div>"+f.message+"</div>"+b;f.customize& [...]
+setTimeout(function(){f.autoPrint&&(h.print(),h.close())},250)},title:"*",message:"",exportOptions:{},header:!0,footer:!1,autoPrint:!0,customize:null};return i.Buttons});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.semanticui.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.semanticui.min.js
new file mode 100644
index 0000000..936c99f
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/buttons.semanticui.min.js
@@ -0,0 +1,6 @@
+/*!
+ Bootstrap integration for DataTables' Buttons
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-se","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-se")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{classNa [...]
+button:{tag:"button",className:"ui button"},collection:{tag:"div",className:"dt-button-collection ui basic vertical buttons"}}});return a.Buttons});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/dataTables.buttons.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/dataTables.buttons.min.js
new file mode 100644
index 0000000..f79d0bb
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/dataTables.buttons.min.js
@@ -0,0 +1,35 @@
+/*!
+ Buttons for DataTables 1.2.0
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(o){return d(o,window,document)}):"object"===typeof exports?module.exports=function(o,n){o||(o=window);if(!n||!n.fn.dataTable)n=require("datatables.net")(o,n).$;return d(n,o,o.document)}:d(jQuery,window,document)})(function(d,o,n,l){var i=d.fn.dataTable,u=0,v=0,k=i.ext.buttons,m=function(a,b){!0===b&&(b={});d.isArray(b)&&(b={buttons:b});this.c=d.extend(!0,{},m.defaults,b);b.buttons&&(this.c.but [...]
+this.s={dt:new i.Api(a),buttons:[],listenKeys:"",namespace:"dtb"+u++};this.dom={container:d("<"+this.c.dom.container.tag+"/>").addClass(this.c.dom.container.className)};this._constructor()};d.extend(m.prototype,{action:function(a,b){var c=this._nodeToButton(a);if(b===l)return c.conf.action;c.conf.action=b;return this},active:function(a,b){var c=this._nodeToButton(a),e=this.c.dom.button.active,c=d(c.node);if(b===l)return c.hasClass(e);c.toggleClass(e,b===l?!0:b);return this},add:function( [...]
+this.s.buttons;if("string"===typeof b){for(var e=b.split("-"),c=this.s,d=0,h=e.length-1;d<h;d++)c=c.buttons[1*e[d]];c=c.buttons;b=1*e[e.length-1]}this._expandButton(c,a,!1,b);this._draw();return this},container:function(){return this.dom.container},disable:function(a){a=this._nodeToButton(a);d(a.node).addClass(this.c.dom.button.disabled);return this},destroy:function(){d("body").off("keyup."+this.s.namespace);var a=this.s.buttons,b,c;b=0;for(c=a.length;b<c;b++)this.remove(a[b].node);this [...]
+a=this.s.dt.settings()[0];b=0;for(c=a.length;b<c;b++)if(a.inst===this){a.splice(b,1);break}return this},enable:function(a,b){if(!1===b)return this.disable(a);var c=this._nodeToButton(a);d(c.node).removeClass(this.c.dom.button.disabled);return this},name:function(){return this.c.name},node:function(a){a=this._nodeToButton(a);return d(a.node)},remove:function(a){var b=this._nodeToButton(a),c=this._nodeToHost(a),e=this.s.dt;if(b.buttons.length)for(var g=b.buttons.length-1;0<=g;g--)this.remo [...]
+b.conf.destroy&&b.conf.destroy.call(e.button(a),e,d(a),b.conf);this._removeKey(b.conf);d(b.node).remove();a=d.inArray(b,c);c.splice(a,1);return this},text:function(a,b){var c=this._nodeToButton(a),e=this.c.dom.collection.buttonLiner,e=c.inCollection&&e&&e.tag?e.tag:this.c.dom.buttonLiner.tag,g=this.s.dt,h=d(c.node),f=function(a){return"function"===typeof a?a(g,h,c.conf):a};if(b===l)return f(c.conf.text);c.conf.text=b;e?h.children(e).html(f(b)):h.html(f(b));return this},_constructor:funct [...]
+this,b=this.s.dt,c=b.settings()[0],e=this.c.buttons;c._buttons||(c._buttons=[]);c._buttons.push({inst:this,name:this.c.name});for(var c=0,g=e.length;c<g;c++)this.add(e[c]);b.on("destroy",function(){a.destroy()});d("body").on("keyup."+this.s.namespace,function(b){if(!n.activeElement||n.activeElement===n.body){var c=String.fromCharCode(b.keyCode).toLowerCase();a.s.listenKeys.toLowerCase().indexOf(c)!==-1&&a._keypress(c,b)}})},_addKey:function(a){a.key&&(this.s.listenKeys+=d.isPlainObject(a [...]
+a.key)},_draw:function(a,b){a||(a=this.dom.container,b=this.s.buttons);a.children().detach();for(var c=0,d=b.length;c<d;c++)a.append(b[c].inserter),b[c].buttons&&b[c].buttons.length&&this._draw(b[c].collection,b[c].buttons)},_expandButton:function(a,b,c,e){for(var g=this.s.dt,h=0,b=!d.isArray(b)?[b]:b,f=0,q=b.length;f<q;f++){var j=this._resolveExtends(b[f]);if(j)if(d.isArray(j))this._expandButton(a,j,c,e);else{var p=this._buildButton(j,c);if(p){e!==l?(a.splice(e,0,p),e++):a.push(p);if(p. [...]
+this.c.dom.collection;p.collection=d("<"+s.tag+"/>").addClass(s.className);p.conf._collection=p.collection;this._expandButton(p.buttons,p.conf.buttons,!0,e)}j.init&&j.init.call(g.button(p.node),g,d(p.node),j);h++}}}},_buildButton:function(a,b){var c=this.c.dom.button,e=this.c.dom.buttonLiner,g=this.c.dom.collection,h=this.s.dt,f=function(b){return"function"===typeof b?b(h,j,a):b};b&&g.button&&(c=g.button);b&&g.buttonLiner&&(e=g.buttonLiner);if(a.available&&!a.available(h,a))return!1;var  [...]
+b,c,e){e.action.call(b.button(c),a,b,c,e);d(b.table().node()).triggerHandler("buttons-action.dt",[b.button(c),b,c,e])},j=d("<"+c.tag+"/>").addClass(c.className).attr("tabindex",this.s.dt.settings()[0].iTabIndex).attr("aria-controls",this.s.dt.table().node().id).on("click.dtb",function(b){b.preventDefault();!j.hasClass(c.disabled)&&a.action&&q(b,h,j,a);j.blur()}).on("keyup.dtb",function(b){b.keyCode===13&&!j.hasClass(c.disabled)&&a.action&&q(b,h,j,a)});"a"===c.tag.toLowerCase()&&j.attr("h [...]
+e.tag?(g=d("<"+e.tag+"/>").html(f(a.text)).addClass(e.className),"a"===e.tag.toLowerCase()&&g.attr("href","#"),j.append(g)):j.html(f(a.text));!1===a.enabled&&j.addClass(c.disabled);a.className&&j.addClass(a.className);a.titleAttr&&j.attr("title",a.titleAttr);a.namespace||(a.namespace=".dt-button-"+v++);e=(e=this.c.dom.buttonContainer)&&e.tag?d("<"+e.tag+"/>").addClass(e.className).append(j):j;this._addKey(a);return{conf:a,node:j.get(0),inserter:e,buttons:[],inCollection:b,collection:null [...]
+b){b||(b=this.s.buttons);for(var c=0,d=b.length;c<d;c++){if(b[c].node===a)return b[c];if(b[c].buttons.length){var g=this._nodeToButton(a,b[c].buttons);if(g)return g}}},_nodeToHost:function(a,b){b||(b=this.s.buttons);for(var c=0,d=b.length;c<d;c++){if(b[c].node===a)return b;if(b[c].buttons.length){var g=this._nodeToHost(a,b[c].buttons);if(g)return g}}},_keypress:function(a,b){var c=function(e){for(var g=0,h=e.length;g<h;g++){var f=e[g].conf,q=e[g].node;if(f.key)if(f.key===a)d(q).click();e [...]
+f.key.key===a&&(!f.key.shiftKey||b.shiftKey))if(!f.key.altKey||b.altKey)if(!f.key.ctrlKey||b.ctrlKey)(!f.key.metaKey||b.metaKey)&&d(q).click();e[g].buttons.length&&c(e[g].buttons)}};c(this.s.buttons)},_removeKey:function(a){if(a.key){var b=d.isPlainObject(a.key)?a.key.key:a.key,a=this.s.listenKeys.split(""),b=d.inArray(b,a);a.splice(b,1);this.s.listenKeys=a.join("")}},_resolveExtends:function(a){for(var b=this.s.dt,c,e,g=function(c){for(var e=0;!d.isPlainObject(c)&&!d.isArray(c);){if(c== [...]
+if("function"===typeof c){if(c=c(b,a),!c)return!1}else if("string"===typeof c){if(!k[c])throw"Unknown button type: "+c;c=k[c]}e++;if(30<e)throw"Buttons: Too many iterations";}return d.isArray(c)?c:d.extend({},c)},a=g(a);a&&a.extend;){if(!k[a.extend])throw"Cannot extend unknown button type: "+a.extend;var h=g(k[a.extend]);if(d.isArray(h))return h;if(!h)return!1;c=h.className;a=d.extend({},h,a);c&&a.className!==c&&(a.className=c+" "+a.className);var f=a.postfixButtons;if(f){a.buttons||(a.b [...]
+c=0;for(e=f.length;c<e;c++)a.buttons.push(f[c]);a.postfixButtons=null}if(f=a.prefixButtons){a.buttons||(a.buttons=[]);c=0;for(e=f.length;c<e;c++)a.buttons.splice(c,0,f[c]);a.prefixButtons=null}a.extend=h.extend}return a}});m.background=function(a,b,c){c===l&&(c=400);a?d("<div/>").addClass(b).css("display","none").appendTo("body").fadeIn(c):d("body > div."+b).fadeOut(c,function(){d(this).remove()})};m.instanceSelector=function(a,b){if(!a)return d.map(b,function(a){return a.inst});var c=[] [...]
+function(a){return a.name}),g=function(a){if(d.isArray(a))for(var f=0,q=a.length;f<q;f++)g(a[f]);else"string"===typeof a?-1!==a.indexOf(",")?g(a.split(",")):(a=d.inArray(d.trim(a),e),-1!==a&&c.push(b[a].inst)):"number"===typeof a&&c.push(b[a].inst)};g(a);return c};m.buttonSelector=function(a,b){for(var c=[],e=function(a,b,c){for(var d,g,f=0,h=b.length;f<h;f++)if(d=b[f])g=c!==l?c+f:f+"",a.push({node:d.node,name:d.conf.name,idx:g}),d.buttons&&e(a,d.buttons,g+"-")},g=function(a,b){var f,h,i [...]
+f=d.map(i,function(a){return a.node});if(d.isArray(a)||a instanceof d){f=0;for(h=a.length;f<h;f++)g(a[f],b)}else if(null===a||a===l||"*"===a){f=0;for(h=i.length;f<h;f++)c.push({inst:b,node:i[f].node})}else if("number"===typeof a)c.push({inst:b,node:b.s.buttons[a].node});else if("string"===typeof a)if(-1!==a.indexOf(",")){i=a.split(",");f=0;for(h=i.length;f<h;f++)g(d.trim(i[f]),b)}else if(a.match(/^\d+(\-\d+)*$/))f=d.map(i,function(a){return a.idx}),c.push({inst:b,node:i[d.inArray(a,f)].n [...]
+a.indexOf(":name")){var k=a.replace(":name","");f=0;for(h=i.length;f<h;f++)i[f].name===k&&c.push({inst:b,node:i[f].node})}else d(f).filter(a).each(function(){c.push({inst:b,node:this})});else"object"===typeof a&&a.nodeName&&(i=d.inArray(a,f),-1!==i&&c.push({inst:b,node:f[i]}))},h=0,f=a.length;h<f;h++)g(b,a[h]);return c};m.defaults={buttons:["copy","excel","csv","pdf","print"],name:"main",tabIndex:0,dom:{container:{tag:"div",className:"dt-buttons"},collection:{tag:"div",className:"dt-butt [...]
+button:{tag:"a",className:"dt-button",active:"active",disabled:"disabled"},buttonLiner:{tag:"span",className:""}}};m.version="1.2.0";d.extend(k,{collection:{text:function(a){return a.i18n("buttons.collection","Collection")},className:"buttons-collection",action:function(a,b,c,e){var a=c.offset(),g=d(b.table().container()),h=!1;d("div.dt-button-background").length&&(h=d("div.dt-button-collection").offset(),d("body").trigger("click.dtb-collection"));e._collection.addClass(e.collectionLayou [...]
+"none").appendTo("body").fadeIn(e.fade);var f=e._collection.css("position");h&&"absolute"===f?e._collection.css({top:h.top+5,left:h.left+5}):"absolute"===f?(e._collection.css({top:a.top+c.outerHeight(),left:a.left}),c=a.left+e._collection.outerWidth(),g=g.offset().left+g.width(),c>g&&e._collection.css("left",a.left-(c-g))):(a=e._collection.height()/2,a>d(o).height()/2&&(a=d(o).height()/2),e._collection.css("marginTop",-1*a));e.background&&m.background(!0,e.backgroundClassName,e.fade);set [...]
+function(){});d("body").on("click.dtb-collection",function(a){if(!d(a.target).parents().andSelf().filter(e._collection).length){e._collection.fadeOut(e.fade,function(){e._collection.detach()});d("div.dt-button-background").off("click.dtb-collection");m.background(false,e.backgroundClassName,e.fade);d("body").off("click.dtb-collection");b.off("buttons-action.b-internal")}})},10);if(e.autoClose)b.on("buttons-action.b-internal",function(){d("div.dt-button-background").click()})},background: [...]
+backgroundClassName:"dt-button-background",autoClose:!1,fade:400},copy:function(a,b){if(k.copyHtml5)return"copyHtml5";if(k.copyFlash&&k.copyFlash.available(a,b))return"copyFlash"},csv:function(a,b){if(k.csvHtml5&&k.csvHtml5.available(a,b))return"csvHtml5";if(k.csvFlash&&k.csvFlash.available(a,b))return"csvFlash"},excel:function(a,b){if(k.excelHtml5&&k.excelHtml5.available(a,b))return"excelHtml5";if(k.excelFlash&&k.excelFlash.available(a,b))return"excelFlash"},pdf:function(a,b){if(k.pdfHt [...]
+b))return"pdfHtml5";if(k.pdfFlash&&k.pdfFlash.available(a,b))return"pdfFlash"},pageLength:function(a){var a=a.settings()[0].aLengthMenu,b=d.isArray(a[0])?a[0]:a,c=d.isArray(a[0])?a[1]:a,e=function(a){return a.i18n("buttons.pageLength",{"-1":"Show all rows",_:"Show %d rows"},a.page.len())};return{extend:"collection",text:e,className:"buttons-page-length",autoClose:!0,buttons:d.map(b,function(a,b){return{text:c[b],action:function(b,c){c.page.len(a).draw()},init:function(b,c,d){var e=this,c [...]
+a)};b.on("length.dt"+d.namespace,c);c()},destroy:function(a,b,c){a.off("length.dt"+c.namespace)}}}),init:function(a,b,c){var d=this;a.on("length.dt"+c.namespace,function(){d.text(e(a))})},destroy:function(a,b,c){a.off("length.dt"+c.namespace)}}}});i.Api.register("buttons()",function(a,b){b===l&&(b=a,a=l);return this.iterator(!0,"table",function(c){if(c._buttons)return m.buttonSelector(m.instanceSelector(a,c._buttons),b)},!0)});i.Api.register("button()",function(a,b){var c=this.buttons(a, [...]
+c.splice(1,c.length);return c});i.Api.registerPlural("buttons().active()","button().active()",function(a){return a===l?this.map(function(a){return a.inst.active(a.node)}):this.each(function(b){b.inst.active(b.node,a)})});i.Api.registerPlural("buttons().action()","button().action()",function(a){return a===l?this.map(function(a){return a.inst.action(a.node)}):this.each(function(b){b.inst.action(b.node,a)})});i.Api.register(["buttons().enable()","button().enable()"],function(a){return this. [...]
+a)})});i.Api.register(["buttons().disable()","button().disable()"],function(){return this.each(function(a){a.inst.disable(a.node)})});i.Api.registerPlural("buttons().nodes()","button().node()",function(){var a=d();d(this.each(function(b){a=a.add(b.inst.node(b.node))}));return a});i.Api.registerPlural("buttons().text()","button().text()",function(a){return a===l?this.map(function(a){return a.inst.text(a.node)}):this.each(function(b){b.inst.text(b.node,a)})});i.Api.registerPlural("buttons( [...]
+"button().trigger()",function(){return this.each(function(a){a.inst.node(a.node).trigger("click")})});i.Api.registerPlural("buttons().containers()","buttons().container()",function(){var a=d();d(this.each(function(b){a=a.add(b.inst.container())}));return a});i.Api.register("button().add()",function(a,b){1===this.length&&this[0].inst.add(b,a);return this.button(a)});i.Api.register("buttons().destroy()",function(){this.pluck("inst").unique().each(function(a){a.destroy()});return this});i.A [...]
+"buttons().remove()",function(){this.each(function(a){a.inst.remove(a.node)});return this});var r;i.Api.register("buttons.info()",function(a,b,c){var e=this;if(!1===a)return d("#datatables_buttons_info").fadeOut(function(){d(this).remove()}),clearTimeout(r),r=null,this;r&&clearTimeout(r);d("#datatables_buttons_info").length&&d("#datatables_buttons_info").remove();d('<div id="datatables_buttons_info" class="dt-button-info"/>').html(a?"<h2>"+a+"</h2>":"").append(d("<div/>")["string"===type [...]
+"append"](b)).css("display","none").appendTo("body").fadeIn();c!==l&&0!==c&&(r=setTimeout(function(){e.buttons.info(!1)},c));return this});i.Api.register("buttons.exportData()",function(a){if(this.context.length){for(var b=new i.Api(this.context[0]),c=d.extend(!0,{},{rows:null,columns:"",modifier:{search:"applied",order:"applied"},orthogonal:"display",stripHtml:!0,stripNewlines:!0,decodeEntities:!0,trim:!0,format:{header:function(a){return e(a)},footer:function(a){return e(a)},body:funct [...]
+a),e=function(a){if("string"!==typeof a)return a;c.stripHtml&&(a=a.replace(/<[^>]*>/g,""));c.trim&&(a=a.replace(/^\s+|\s+$/g,""));c.stripNewlines&&(a=a.replace(/\n/g," "));c.decodeEntities&&(t.innerHTML=a,a=t.value);return a},a=b.columns(c.columns).indexes().map(function(a){return c.format.header(b.column(a).header().innerHTML,a)}).toArray(),g=b.table().footer()?b.columns(c.columns).indexes().map(function(a){var d=b.column(a).footer();return c.format.footer(d?d.innerHTML:"",a)}).toArray( [...]
+b.rows(c.rows,c.modifier).indexes().toArray(),h=b.cells(h,c.columns).render(c.orthogonal).toArray(),f=a.length,k=0<f?h.length/f:0,j=Array(k),m=0,l=0;l<k;l++){for(var o=Array(f),n=0;n<f;n++)o[n]=c.format.body(h[m],n,l),m++;j[l]=o}return{header:a,footer:g,body:j}}});var t=d("<textarea/>")[0];d.fn.dataTable.Buttons=m;d.fn.DataTable.Buttons=m;d(n).on("init.dt plugin-init.dt",function(a,b){if("dt"===a.namespace){var c=b.oInit.buttons||i.defaults.buttons;c&&!b._buttons&&(new m(b,c)).container( [...]
+new i.Api(a),b=a.init().buttons||i.defaults.buttons;return(new m(a,b)).container()},cFeature:"B"});return m});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/jszip.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/jszip.min.js
new file mode 100644
index 0000000..a09f35b
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/jszip.min.js
@@ -0,0 +1,14 @@
+/*!
+
+JSZip - A Javascript class for generating and reading zip files
+<http://stuartk.com/jszip>
+
+(c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>
+Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
+
+JSZip uses the library pako released under the MIT license :
+https://github.com/nodeca/pako/blob/master/LICENSE
+*/
+!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g [...]
+}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileComment)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null}},b.exports=c},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(a,b){"use strict";var c=a("./lib/utils/common").assign,d=a("./lib/deflate"),e=a("./lib/inflate"),f=a("./lib/zlib/constants"),g={};c(g,d,e,f),b.exports=g}, [...]
+break}for(c.back=0;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(rb&&0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.lencode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,c.length=sb,0===rb){c.mode=hb;break}if(32&rb){c.back=-1,c.mode=V;break}if(64&rb){a.msg="invalid literal/length code",c.mode=l [...]
\ No newline at end of file
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/pdfmake.min.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/pdfmake.min.js
new file mode 100644
index 0000000..b798b26
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/pdfmake.min.js
@@ -0,0 +1,22 @@
+!function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){(function(e){t.exports=e.pdfMake=n(1)}).call(e,function(){return this}())},function(t,e,n){(function(e){"use strict";function r(t,e,n){this.docDefinition=t,this.fonts=e||a,this.vfs=n}var i=n(2),o=n(3),a={Roboto:{normal:"Roboto-Regular.ttf",bold:"Roboto-Medium.ttf",italics:"Ro [...]
+var o=o||"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob&&navigator.msSaveOrOpenBlob.bind(navigator)||function(t){"use strict";if("undefined"==typeof navigator||!/MSIE [1-9]\./.test(navigator.userAgent)){var e=t.document,n=function(){return t.URL||t.webkitURL||t},r=e.createElementNS("http://www.w3.org/1999/xhtml","a"),i="download"in r,o=function(n){var r=e.createEvent("MouseEvents");r.initMouseEvent("click",!0,!1,t,0,0,0,0,0,!1,!1,!1,!1,0,null),n.dispatchEvent(r)},a=t.webkitReq [...]
+	 * The buffer module from node.js, for the browser.
+	 *
+	 * @author   Feross Aboukhadijeh <feross at feross.org> <http://feross.org>
+	 * @license  MIT
+	 */
+var H=n(31),Z=n(29),G=n(30);e.Buffer=t,e.SlowBuffer=d,e.INSPECT_MAX_BYTES=50,t.poolSize=8192;var q=1073741823,Y={};t.TYPED_ARRAY_SUPPORT=function(){try{var t=new ArrayBuffer(0),e=new Uint8Array(t);return e.foo=function(){return 42},42===e.foo()&&"function"==typeof e.subarray&&0===new Uint8Array(1).subarray(1,1).byteLength}catch(n){return!1}}(),t.isBuffer=function(t){return!(null==t||!t._isBuffer)},t.compare=function(e,n){if(!t.isBuffer(e)||!t.isBuffer(n))throw new TypeError("Arguments mu [...]
+var o=i?e:null!=t&&t[e];a[++r]=o?o.apply(t,n):C}),a}function Be(t,e,n,r,i,o){if(t===e)return 0!==t||1/t==1/e;var a=typeof t,s=typeof e;return"function"!=a&&"object"!=a&&"function"!=s&&"object"!=s||null==t||null==e?t!==t&&e!==e:Te(t,e,Be,n,r,i,o)}function Te(t,e,n,r,i,o,a){var s=ja(t),h=ja(e),u=Y,l=Y;s||(u=Ko.call(t),u==q?u=tt:u!=tt&&(s=Ai(t))),h||(l=Ko.call(e),l==q?l=tt:l!=tt&&(h=Ai(e)));var c=u==tt,f=l==tt,d=u==l;if(d&&!s&&!c)return cn(t,e,u);var p=c&&qo.call(t,"__wrapped__"),g=f&&qo.ca [...]
+e.pluck=Tr,e.property=Co,e.propertyOf=Io,e.pull=Vn,e.pullAt=$n,e.range=Ao,e.rearg=si,e.reject=Dr,e.remove=Jn,e.rest=Qn,e.shuffle=Pr,e.slice=tr,e.sortBy=Wr,e.sortByAll=Nr,e.take=rr,e.takeRight=ir,e.takeRightWhile=or,e.takeWhile=ar,e.tap=gr,e.throttle=hi,e.thru=vr,e.times=Lo,e.toArray=Ri,e.toPlainObject=Bi,e.transform=Xi,e.union=sr,e.uniq=hr,e.unzip=ur,e.values=Vi,e.valuesIn=$i,e.where=jr,e.without=lr,e.wrap=ui,e.xor=cr,e.zip=fr,e.zipObject=dr,e.backflow=ei,e.collect=Br,e.compose=ei,e.each [...]
+
+}e.context().page=s,e.context().y=h;var C=this.tableNode.table.body[t];for(o=0,i=C.length;i>o;o++){if(C[o].rowSpan&&(this.rowSpanData[o].rowSpan=C[o].rowSpan,C[o].colSpan&&C[o].colSpan>1))for(var I=1;I<C[o].rowSpan;I++)this.tableNode.table.body[t+I][o]._colSpan=C[o].colSpan;this.rowSpanData[o].rowSpan>0&&this.rowSpanData[o].rowSpan--}this.drawHorizontalLine(t+1,e),this.headerRows&&t===this.headerRows-1&&(this.headerRepeatable=e.currentBlockToRepeatable()),this.dontBreakRows&&e.tracker.au [...]
+var e;return null!=(e=t.resources.data).Font?e.Font:e.Font={}}}(this)},xobjects:{get:function(t){return function(){var e;return null!=(e=t.resources.data).XObject?e.XObject:e.XObject={}}}(this)},ext_gstates:{get:function(t){return function(){var e;return null!=(e=t.resources.data).ExtGState?e.ExtGState:e.ExtGState={}}}(this)},patterns:{get:function(t){return function(){var e;return null!=(e=t.resources.data).Pattern?e.Pattern:e.Pattern={}}}(this)},annotations:{get:function(t){return func [...]
+t};e=n(54).EventEmitter,r=n(66),i=function(t){function e(t,e){var n;this.document=t,this.indent=e.indent||0,this.characterSpacing=e.characterSpacing||0,this.wordSpacing=0===e.wordSpacing,this.columns=e.columns||1,this.columnGap=null!=(n=e.columnGap)?n:18,this.lineWidth=(e.width-this.columnGap*(this.columns-1))/this.columns,this.spaceLeft=this.lineWidth,this.startX=this.document.x,this.startY=this.document.y,this.column=1,this.ellipsis=e.ellipsis,this.continuedX=0,null!=e.height?(this.hei [...]
+
+};if(r.noDeprecation===!0)return n;var a=!1;return o};var B,T={};e.debuglog=function(t){if(b(B)&&(B=r.env.NODE_DEBUG||""),t=t.toUpperCase(),!T[t])if(new RegExp("\\b"+t+"\\b","i").test(B)){{r.pid}T[t]=function(){e.format.apply(e,arguments)}}else T[t]=function(){};return T[t]},e.inspect=i,i.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},i.styles={s [...]
+t.strstart=r,s(t,!1),0===t.strm.avail_out))return yt;if(t.strstart-t.block_start>=t.w_size-ut&&(s(t,!1),0===t.strm.avail_out))return yt}return t.insert=0,e===U?(s(t,!0),0===t.strm.avail_out?_t:bt):t.strstart>t.block_start&&(s(t,!1),0===t.strm.avail_out)?yt:yt}function p(t,e){for(var n,r;;){if(t.lookahead<ut){if(f(t),t.lookahead<ut&&e===M)return yt;if(0===t.lookahead)break}if(n=0,t.lookahead>=st&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+st-1])&t.hash_mask,n=t.prev[t.strstart&t. [...]
+B.writeUInt16(262),B.writeUInt16(0),B.write(v),k={charMap:o,subtable:B.data,maxGlyphID:g+1};case"unicode":for(L=[],c=[],w=0,y={},n={},m=u=null,M=0,P=a.length;P>M;M++)i=a[M],b=t[i],null==y[b]&&(y[b]=++w),n[i]={old:b,"new":y[b]},s=y[b]-i,(null==m||s!==u)&&(m&&c.push(m),L.push(i),u=s),m=i;for(m&&c.push(m),c.push(65535),L.push(65535),C=L.length,I=2*C,E=2*Math.pow(Math.log(C)/Math.LN2,2),f=Math.log(E/2)/Math.LN2,S=2*C-E,h=[],x=[],d=[],p=O=0,F=L.length;F>O;p=++O){if(A=L[p],l=c[p],65535===A){h. [...]
+
+t.exports=function(t,e,n,p,g,v,m,y){var w,_,b,x,S,k,E,C,I,A=y.bits,L=0,R=0,B=0,T=0,M=0,O=0,D=0,U=0,P=0,F=0,z=null,W=0,N=new r.Buf16(i+1),j=new r.Buf16(i+1),H=null,Z=0;for(L=0;i>=L;L++)N[L]=0;for(R=0;p>R;R++)N[e[n+R]]++;for(M=A,T=i;T>=1&&0===N[T];T--);if(M>T&&(M=T),0===T)return g[v++]=20971520,g[v++]=20971520,y.bits=1,0;for(B=1;T>B&&0===N[B];B++);for(B>M&&(M=B),U=1,L=1;i>=L;L++)if(U<<=1,U-=N[L],0>U)return-1;if(U>0&&(t===s||1!==T))return-1;for(j[1]=0,L=1;i>L;L++)j[L+1]=j[L]+N[L];for(R=0;p> [...]
+highStart:919552,errorValue:0}},function(t,e,n){t.exports=Array.isArray||function(t){return"[object Array]"==Object.prototype.toString.call(t)}}]);
+//# sourceMappingURL=pdfmake.min.js.map
\ No newline at end of file
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/vfs_fonts.js b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/vfs_fonts.js
new file mode 100644
index 0000000..f5fd30a
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Buttons/js/vfs_fonts.js
@@ -0,0 +1 @@
+window.pdfMake = window.pdfMake || {}; window.pdfMake.vfs = {"LICENSE.txt":"DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KDQogICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCg0KICAgMS4gRGVmaW5pdGlvbnMuDQoNCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNl [...]
\ No newline at end of file
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Buttons/swf/flashExport.swf b/inst/htmlwidgets/lib/datatables-extensions/Buttons/swf/flashExport.swf
new file mode 100644
index 0000000..5a01312
Binary files /dev/null and b/inst/htmlwidgets/lib/datatables-extensions/Buttons/swf/flashExport.swf differ
diff --git a/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.bootstrap.min.css
new file mode 100644
index 0000000..5a84d69
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.bootstrap.min.css
@@ -0,0 +1 @@
+table.DTCR_clonedTable.dataTable{position:absolute !important;background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#337ab7;z-index:201}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.bootstrap4.min.css
new file mode 100644
index 0000000..cc3fd60
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.bootstrap4.min.css
@@ -0,0 +1 @@
+table.DTCR_clonedTable.dataTable{position:absolute !important;background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0275d8;z-index:201}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.dataTables.min.css
new file mode 100644
index 0000000..4f83a40
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.dataTables.min.css
@@ -0,0 +1 @@
+table.DTCR_clonedTable.dataTable{position:absolute !important;background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0259C4;z-index:201}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.foundation.min.css
new file mode 100644
index 0000000..36f780e
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.foundation.min.css
@@ -0,0 +1 @@
+table.DTCR_clonedTable.dataTable{position:absolute !important;background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#008CBA;z-index:201}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.jqueryui.min.css
new file mode 100644
index 0000000..4f83a40
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.jqueryui.min.css
@@ -0,0 +1 @@
+table.DTCR_clonedTable.dataTable{position:absolute !important;background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0259C4;z-index:201}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.semanticui.min.css
new file mode 100644
index 0000000..0e37cd9
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/css/colReorder.semanticui.min.css
@@ -0,0 +1 @@
+table.DTCR_clonedTable.dataTable{position:absolute !important;background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#888;z-index:201}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/ColReorder/js/dataTables.colReorder.min.js b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/js/dataTables.colReorder.min.js
new file mode 100644
index 0000000..48aa8a9
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/ColReorder/js/dataTables.colReorder.min.js
@@ -0,0 +1,27 @@
+/*!
+ ColReorder 1.3.2
+ ©2010-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(f){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(o){return f(o,window,document)}):"object"===typeof exports?module.exports=function(o,l){o||(o=window);if(!l||!l.fn.dataTable)l=require("datatables.net")(o,l).$;return f(l,o,o.document)}:f(jQuery,window,document)})(function(f,o,l,r){function q(a){for(var b=[],d=0,e=a.length;d<e;d++)b[a[d]]=d;return b}function p(a,b,d){b=a.splice(b,1)[0];a.splice(d,0,b)}function s(a,b,d){for(var e=[],f=0,c=a.chi [...]
+c;f++)1==a.childNodes[f].nodeType&&e.push(a.childNodes[f]);b=e[b];null!==d?a.insertBefore(b,e[d]):a.appendChild(b)}var t=f.fn.dataTable;f.fn.dataTableExt.oApi.fnColReorder=function(a,b,d,e,g){var c,h,j,m,i,l=a.aoColumns.length,k;i=function(a,b,c){if(a[b]&&"function"!==typeof a[b]){var d=a[b].split("."),e=d.shift();isNaN(1*e)||(a[b]=c[1*e]+"."+d.join("."))}};if(b!=d)if(0>b||b>=l)this.oApi._fnLog(a,1,"ColReorder 'from' index is out of bounds: "+b);else if(0>d||d>=l)this.oApi._fnLog(a,1,"Co [...]
+d);else{j=[];c=0;for(h=l;c<h;c++)j[c]=c;p(j,b,d);var n=q(j);c=0;for(h=a.aaSorting.length;c<h;c++)a.aaSorting[c][0]=n[a.aaSorting[c][0]];if(null!==a.aaSortingFixed){c=0;for(h=a.aaSortingFixed.length;c<h;c++)a.aaSortingFixed[c][0]=n[a.aaSortingFixed[c][0]]}c=0;for(h=l;c<h;c++){k=a.aoColumns[c];j=0;for(m=k.aDataSort.length;j<m;j++)k.aDataSort[j]=n[k.aDataSort[j]];k.idx=n[k.idx]}f.each(a.aLastSort,function(b,c){a.aLastSort[b].src=n[c.src]});c=0;for(h=l;c<h;c++)k=a.aoColumns[c],"number"==type [...]
+k.mData=n[k.mData]:f.isPlainObject(k.mData)&&(i(k.mData,"_",n),i(k.mData,"filter",n),i(k.mData,"sort",n),i(k.mData,"type",n));if(a.aoColumns[b].bVisible){i=this.oApi._fnColumnIndexToVisible(a,b);m=null;for(c=d<b?d:d+1;null===m&&c<l;)m=this.oApi._fnColumnIndexToVisible(a,c),c++;j=a.nTHead.getElementsByTagName("tr");c=0;for(h=j.length;c<h;c++)s(j[c],i,m);if(null!==a.nTFoot){j=a.nTFoot.getElementsByTagName("tr");c=0;for(h=j.length;c<h;c++)s(j[c],i,m)}c=0;for(h=a.aoData.length;c<h;c++)null!= [...]
+s(a.aoData[c].nTr,i,m)}p(a.aoColumns,b,d);c=0;for(h=l;c<h;c++)a.oApi._fnColumnOptions(a,c,{});p(a.aoPreSearchCols,b,d);c=0;for(h=a.aoData.length;c<h;c++){m=a.aoData[c];if(k=m.anCells){p(k,b,d);j=0;for(i=k.length;j<i;j++)k[j]&&k[j]._DT_CellIndex&&(k[j]._DT_CellIndex.column=j)}"dom"!==m.src&&f.isArray(m._aData)&&p(m._aData,b,d)}c=0;for(h=a.aoHeader.length;c<h;c++)p(a.aoHeader[c],b,d);if(null!==a.aoFooter){c=0;for(h=a.aoFooter.length;c<h;c++)p(a.aoFooter[c],b,d)}(g||g===r)&&f.fn.dataTable.A [...]
+c=0;for(h=l;c<h;c++)f(a.aoColumns[c].nTh).off("click.DT"),this.oApi._fnSortAttachListener(a,a.aoColumns[c].nTh,c);f(a.oInstance).trigger("column-reorder.dt",[a,{from:b,to:d,mapping:n,drop:e,iFrom:b,iTo:d,aiInvertMapping:n}])}};var i=function(a,b){var d=(new f.fn.dataTable.Api(a)).settings()[0];if(d._colReorder)return d._colReorder;!0===b&&(b={});var e=f.fn.dataTable.camelToHungarian;e&&(e(i.defaults,i.defaults,!0),e(i.defaults,b||{}));this.s={dt:null,init:f.extend(!0,{},i.defaults,b),fix [...]
+reorderCallback:null,mouse:{startX:-1,startY:-1,offsetX:-1,offsetY:-1,target:-1,targetIndex:-1,fromIndex:-1},aoTargets:[]};this.dom={drag:null,pointer:null};this.s.dt=d;this.s.dt._colReorder=this;this._fnConstruct();return this};f.extend(i.prototype,{fnReset:function(){this._fnOrderColumns(this.fnOrder());return this},fnGetCurrentOrder:function(){return this.fnOrder()},fnOrder:function(a,b){var d=[],e,g,c=this.s.dt.aoColumns;if(a===r){e=0;for(g=c.length;e<g;e++)d.push(c[e]._ColReorder_iO [...]
+this.fnOrder();e=0;for(g=a.length;e<g;e++)d.push(f.inArray(a[e],c));a=d}this._fnOrderColumns(q(a));return this},fnTranspose:function(a,b){b||(b="toCurrent");var d=this.fnOrder(),e=this.s.dt.aoColumns;return"toCurrent"===b?!f.isArray(a)?f.inArray(a,d):f.map(a,function(a){return f.inArray(a,d)}):!f.isArray(a)?e[a]._ColReorder_iOrigCol:f.map(a,function(a){return e[a]._ColReorder_iOrigCol})},_fnConstruct:function(){var a=this,b=this.s.dt.aoColumns.length,d=this.s.dt.nTable,e;this.s.init.iFix [...]
+(this.s.fixed=this.s.init.iFixedColumns);this.s.init.iFixedColumnsLeft&&(this.s.fixed=this.s.init.iFixedColumnsLeft);this.s.fixedRight=this.s.init.iFixedColumnsRight?this.s.init.iFixedColumnsRight:0;this.s.init.fnReorderCallback&&(this.s.reorderCallback=this.s.init.fnReorderCallback);for(e=0;e<b;e++)e>this.s.fixed-1&&e<b-this.s.fixedRight&&this._fnMouseListener(e,this.s.dt.aoColumns[e].nTh),this.s.dt.aoColumns[e]._ColReorder_iOrigCol=e;this.s.dt.oApi._fnCallbackReg(this.s.dt,"aoStateSave [...]
+c){a._fnStateSave.call(a,c)},"ColReorder_State");var g=null;this.s.init.aiOrder&&(g=this.s.init.aiOrder.slice());this.s.dt.oLoadedState&&("undefined"!=typeof this.s.dt.oLoadedState.ColReorder&&this.s.dt.oLoadedState.ColReorder.length==this.s.dt.aoColumns.length)&&(g=this.s.dt.oLoadedState.ColReorder);if(g)if(a.s.dt._bInitComplete)b=q(g),a._fnOrderColumns.call(a,b);else{var c=!1;f(d).on("draw.dt.colReorder",function(){if(!a.s.dt._bInitComplete&&!c){c=true;var b=q(g);a._fnOrderColumns.call [...]
+f(d).on("destroy.dt.colReorder",function(){f(d).off("destroy.dt.colReorder draw.dt.colReorder");f(a.s.dt.nTHead).find("*").off(".ColReorder");f.each(a.s.dt.aoColumns,function(a,b){f(b.nTh).removeAttr("data-column-index")});a.s.dt._colReorder=null;a.s=null})},_fnOrderColumns:function(a){var b=!1;if(a.length!=this.s.dt.aoColumns.length)this.s.dt.oInstance.oApi._fnLog(this.s.dt,1,"ColReorder - array reorder does not match known number of columns. Skipping.");else{for(var d=0,e=a.length;d<e; [...]
+f.inArray(d,a);d!=g&&(p(a,g,d),this.s.dt.oInstance.fnColReorder(g,d,!0,!1),b=!0)}f.fn.dataTable.Api(this.s.dt).rows().invalidate();this._fnSetColumnIndexes();b&&((""!==this.s.dt.oScroll.sX||""!==this.s.dt.oScroll.sY)&&this.s.dt.oInstance.fnAdjustColumnSizing(!1),this.s.dt.oInstance.oApi._fnSaveState(this.s.dt),null!==this.s.reorderCallback&&this.s.reorderCallback.call(this))}},_fnStateSave:function(a){var b,d,e,g=this.s.dt.aoColumns;a.ColReorder=[];if(a.aaSorting){for(b=0;b<a.aaSorting.l [...]
+g[a.aaSorting[b][0]]._ColReorder_iOrigCol;var c=f.extend(!0,[],a.aoSearchCols);b=0;for(d=g.length;b<d;b++)e=g[b]._ColReorder_iOrigCol,a.aoSearchCols[e]=c[b],a.abVisCols[e]=g[b].bVisible,a.ColReorder.push(e)}else if(a.order){for(b=0;b<a.order.length;b++)a.order[b][0]=g[a.order[b][0]]._ColReorder_iOrigCol;c=f.extend(!0,[],a.columns);b=0;for(d=g.length;b<d;b++)e=g[b]._ColReorder_iOrigCol,a.columns[e]=c[b],a.ColReorder.push(e)}},_fnMouseListener:function(a,b){var d=this;f(b).on("mousedown.Co [...]
+function(a){a.preventDefault();d._fnMouseDown.call(d,a,b)})},_fnMouseDown:function(a,b){var d=this,e=f(a.target).closest("th, td").offset(),g=parseInt(f(b).attr("data-column-index"),10);g!==r&&(this.s.mouse.startX=a.pageX,this.s.mouse.startY=a.pageY,this.s.mouse.offsetX=a.pageX-e.left,this.s.mouse.offsetY=a.pageY-e.top,this.s.mouse.target=this.s.dt.aoColumns[g].nTh,this.s.mouse.targetIndex=g,this.s.mouse.fromIndex=g,this._fnRegions(),f(l).on("mousemove.ColReorder",function(a){d._fnMouseM [...]
+a)}).on("mouseup.ColReorder",function(a){d._fnMouseUp.call(d,a)}))},_fnMouseMove:function(a){if(null===this.dom.drag){if(5>Math.pow(Math.pow(a.pageX-this.s.mouse.startX,2)+Math.pow(a.pageY-this.s.mouse.startY,2),0.5))return;this._fnCreateDragNode()}this.dom.drag.css({left:a.pageX-this.s.mouse.offsetX,top:a.pageY-this.s.mouse.offsetY});for(var b=!1,d=this.s.mouse.toIndex,e=1,f=this.s.aoTargets.length;e<f;e++)if(a.pageX<this.s.aoTargets[e-1].x+(this.s.aoTargets[e].x-this.s.aoTargets[e-1].x [...]
+this.s.aoTargets[e-1].x);this.s.mouse.toIndex=this.s.aoTargets[e-1].to;b=!0;break}b||(this.dom.pointer.css("left",this.s.aoTargets[this.s.aoTargets.length-1].x),this.s.mouse.toIndex=this.s.aoTargets[this.s.aoTargets.length-1].to);this.s.init.bRealtime&&d!==this.s.mouse.toIndex&&(this.s.dt.oInstance.fnColReorder(this.s.mouse.fromIndex,this.s.mouse.toIndex,!1),this.s.mouse.fromIndex=this.s.mouse.toIndex,this._fnRegions())},_fnMouseUp:function(){f(l).off("mousemove.ColReorder mouseup.ColReo [...]
+this.dom.drag&&(this.dom.drag.remove(),this.dom.pointer.remove(),this.dom.drag=null,this.dom.pointer=null,this.s.dt.oInstance.fnColReorder(this.s.mouse.fromIndex,this.s.mouse.toIndex,!0),this._fnSetColumnIndexes(),(""!==this.s.dt.oScroll.sX||""!==this.s.dt.oScroll.sY)&&this.s.dt.oInstance.fnAdjustColumnSizing(!1),this.s.dt.oInstance.oApi._fnSaveState(this.s.dt),null!==this.s.reorderCallback&&this.s.reorderCallback.call(this))},_fnRegions:function(){var a=this.s.dt.aoColumns;this.s.aoTarg [...]
+this.s.aoTargets.length);this.s.aoTargets.push({x:f(this.s.dt.nTable).offset().left,to:0});for(var b=0,d=this.s.aoTargets[0].x,e=0,g=a.length;e<g;e++)e!=this.s.mouse.fromIndex&&b++,a[e].bVisible&&"none"!==a[e].nTh.style.display&&(d+=f(a[e].nTh).outerWidth(),this.s.aoTargets.push({x:d,to:b}));0!==this.s.fixedRight&&this.s.aoTargets.splice(this.s.aoTargets.length-this.s.fixedRight);0!==this.s.fixed&&this.s.aoTargets.splice(0,this.s.fixed)},_fnCreateDragNode:function(){var a=""!==this.s.dt. [...]
+""!==this.s.dt.oScroll.sY,b=this.s.dt.aoColumns[this.s.mouse.targetIndex].nTh,d=b.parentNode,e=d.parentNode,g=e.parentNode,c=f(b).clone();this.dom.drag=f(g.cloneNode(!1)).addClass("DTCR_clonedTable").append(f(e.cloneNode(!1)).append(f(d.cloneNode(!1)).append(c[0]))).css({position:"absolute",top:0,left:0,width:f(b).outerWidth(),height:f(b).outerHeight()}).appendTo("body");this.dom.pointer=f("<div></div>").addClass("DTCR_pointer").css({position:"absolute",top:a?f("div.dataTables_scroll",th [...]
+f(this.s.dt.nTable).offset().top,height:a?f("div.dataTables_scroll",this.s.dt.nTableWrapper).height():f(this.s.dt.nTable).height()}).appendTo("body")},_fnSetColumnIndexes:function(){f.each(this.s.dt.aoColumns,function(a,b){f(b.nTh).attr("data-column-index",a)})}});i.defaults={aiOrder:null,bRealtime:!0,iFixedColumnsLeft:0,iFixedColumnsRight:0,fnReorderCallback:null};i.version="1.3.2";f.fn.dataTable.ColReorder=i;f.fn.DataTable.ColReorder=i;"function"==typeof f.fn.dataTable&&"function"==typ [...]
+f.fn.dataTableExt.fnVersionCheck("1.10.8")?f.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInstance;a._colReorder?b.oApi._fnLog(a,1,"ColReorder attempted to initialise twice. Ignoring second"):(b=a.oInit,new i(a,b.colReorder||b.oColReorder||{}));return null},cFeature:"R",sFeature:"ColReorder"}):alert("Warning: ColReorder requires DataTables 1.10.8 or greater - www.datatables.net/download");f(l).on("preInit.dt.colReorder",function(a,b){if("dt"===a.namespace){var d=b.oInit.c [...]
+e=t.defaults.colReorder;if(d||e)e=f.extend({},d,e),!1!==d&&new i(b,e)}});f.fn.dataTable.Api.register("colReorder.reset()",function(){return this.iterator("table",function(a){a._colReorder.fnReset()})});f.fn.dataTable.Api.register("colReorder.order()",function(a,b){return a?this.iterator("table",function(d){d._colReorder.fnOrder(a,b)}):this.context.length?this.context[0]._colReorder.fnOrder():null});f.fn.dataTable.Api.register("colReorder.transpose()",function(a,b){return this.context.len [...]
+this.context[0]._colReorder.fnTranspose(a,b):a});return i});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.bootstrap.min.css
new file mode 100644
index 0000000..d85ab4d
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.bootstrap.min.css
@@ -0,0 +1 @@
+table.DTFC_Cloned tr{background-color:white;margin-bottom:0}div.DTFC_LeftHeadWrapper table,div.DTFC_RightHeadWrapper table{border-bottom:none !important;margin-bottom:0 !important;background-color:white}div.DTFC_LeftBodyWrapper table,div.DTFC_RightBodyWrapper table{border-top:none;margin:0 !important}div.DTFC_LeftBodyWrapper table thead .sorting:after,div.DTFC_LeftBodyWrapper table thead .sorting_asc:after,div.DTFC_LeftBodyWrapper table thead .sorting_desc:after,div.DTFC_LeftBodyWrapper  [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.bootstrap4.min.css
new file mode 100644
index 0000000..d85ab4d
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.bootstrap4.min.css
@@ -0,0 +1 @@
+table.DTFC_Cloned tr{background-color:white;margin-bottom:0}div.DTFC_LeftHeadWrapper table,div.DTFC_RightHeadWrapper table{border-bottom:none !important;margin-bottom:0 !important;background-color:white}div.DTFC_LeftBodyWrapper table,div.DTFC_RightBodyWrapper table{border-top:none;margin:0 !important}div.DTFC_LeftBodyWrapper table thead .sorting:after,div.DTFC_LeftBodyWrapper table thead .sorting_asc:after,div.DTFC_LeftBodyWrapper table thead .sorting_desc:after,div.DTFC_LeftBodyWrapper  [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.dataTables.min.css
new file mode 100644
index 0000000..71e801b
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.dataTables.min.css
@@ -0,0 +1 @@
+table.DTFC_Cloned thead,table.DTFC_Cloned tfoot{background-color:white}div.DTFC_Blocker{background-color:white}div.DTFC_LeftWrapper table.dataTable,div.DTFC_RightWrapper table.dataTable{margin-bottom:0;z-index:2}div.DTFC_LeftWrapper table.dataTable.no-footer,div.DTFC_RightWrapper table.dataTable.no-footer{border-bottom:none}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.foundation.min.css
new file mode 100644
index 0000000..c9937f8
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.foundation.min.css
@@ -0,0 +1 @@
+div.DTFC_LeftHeadWrapper table,div.DTFC_LeftBodyWrapper table,div.DTFC_LeftFootWrapper table{border-right-width:0}div.DTFC_RightHeadWrapper table,div.DTFC_RightBodyWrapper table,div.DTFC_RightFootWrapper table{border-left-width:0}div.DTFC_LeftHeadWrapper table,div.DTFC_RightHeadWrapper table{margin-bottom:0 !important}div.DTFC_LeftBodyWrapper table,div.DTFC_RightBodyWrapper table{border-top:none;margin:0 !important}div.DTFC_LeftFootWrapper table,div.DTFC_RightFootWrapper table{margin-top [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.jqueryui.min.css
new file mode 100644
index 0000000..9926742
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.jqueryui.min.css
@@ -0,0 +1 @@
+div.DTFC_LeftWrapper table.dataTable,div.DTFC_RightWrapper table.dataTable{z-index:2}div.DTFC_LeftWrapper table.dataTable.no-footer,div.DTFC_RightWrapper table.dataTable.no-footer{border-bottom:none}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.semanticui.min.css
new file mode 100644
index 0000000..1beccac
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/css/fixedColumns.semanticui.min.css
@@ -0,0 +1 @@
+div.DTFC_LeftWrapper table.ui.table.dataTable{border-right:none}div.DTFC_RightWrapper table.ui.table.dataTable{border-left:none}div.DTFC_Blocker{background-color:white}div.DTFC_LeftWrapper table.dataTable,div.DTFC_RightWrapper table.dataTable{z-index:2}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/js/dataTables.fixedColumns.min.js b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/js/dataTables.fixedColumns.min.js
new file mode 100644
index 0000000..6e3a593
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedColumns/js/dataTables.fixedColumns.min.js
@@ -0,0 +1,35 @@
+/*!
+ FixedColumns 3.2.2
+ ©2010-2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(q){return d(q,window,document)}):"object"===typeof exports?module.exports=function(q,r){q||(q=window);if(!r||!r.fn.dataTable)r=require("datatables.net")(q,r).$;return d(r,q,q.document)}:d(jQuery,window,document)})(function(d,q,r,t){var s=d.fn.dataTable,u,m=function(a,b){var c=this;if(this instanceof m){if(b===t||!0===b)b={};var e=d.fn.dataTable.camelToHungarian;e&&(e(m.defaults,m.defaults,!0), [...]
+b));e=(new d.fn.dataTable.Api(a)).settings()[0];this.s={dt:e,iTableColumns:e.aoColumns.length,aiOuterWidths:[],aiInnerWidths:[],rtl:"rtl"===d(e.nTable).css("direction")};this.dom={scroller:null,header:null,body:null,footer:null,grid:{wrapper:null,dt:null,left:{wrapper:null,head:null,body:null,foot:null},right:{wrapper:null,head:null,body:null,foot:null}},clone:{left:{header:null,body:null,footer:null},right:{header:null,body:null,footer:null}}};if(e._oFixedColumns)throw"FixedColumns alre [...]
+e._oFixedColumns=this;e._bInitComplete?this._fnConstruct(b):e.oApi._fnCallbackReg(e,"aoInitComplete",function(){c._fnConstruct(b)},"FixedColumns")}else alert("FixedColumns warning: FixedColumns must be initialised with the 'new' keyword.")};d.extend(m.prototype,{fnUpdate:function(){this._fnDraw(!0)},fnRedrawLayout:function(){this._fnColCalc();this._fnGridLayout();this.fnUpdate()},fnRecalculateHeight:function(a){delete a._DTTC_iHeight;a.style.height="auto"},fnSetRowHeight:function(a,b){a. [...]
+b+"px"},fnGetPosition:function(a){var b=this.s.dt.oInstance;if(d(a).parents(".DTFC_Cloned").length){if("tr"===a.nodeName.toLowerCase())return a=d(a).index(),b.fnGetPosition(d("tr",this.s.dt.nTBody)[a]);var c=d(a).index(),a=d(a.parentNode).index();return[b.fnGetPosition(d("tr",this.s.dt.nTBody)[a]),c,b.oApi._fnVisibleToColumnIndex(this.s.dt,c)]}return b.fnGetPosition(a)},_fnConstruct:function(a){var b=this;if("function"!=typeof this.s.dt.oInstance.fnVersionCheck||!0!==this.s.dt.oInstance. [...]
+m.VERSION+" required DataTables 1.8.0 or later. Please upgrade your DataTables installation");else if(""===this.s.dt.oScroll.sX)this.s.dt.oInstance.oApi._fnLog(this.s.dt,1,"FixedColumns is not needed (no x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for column fixing when scrolling is not enabled");else{this.s=d.extend(!0,this.s,m.defaults,a);a=this.s.dt.oClasses;this.dom.grid.dt=d(this.s.dt.nTable).parents("div."+a.sScrollWrapper)[0];this.dom.scroller [...]
+a.sScrollBody,this.dom.grid.dt)[0];this._fnColCalc();this._fnGridSetup();var c,e=!1;d(this.s.dt.nTableWrapper).on("mousedown.DTFC",function(){e=!0;d(r).one("mouseup",function(){e=!1})});d(this.dom.scroller).on("mouseover.DTFC touchstart.DTFC",function(){e||(c="main")}).on("scroll.DTFC",function(a){!c&&a.originalEvent&&(c="main");if("main"===c&&(0<b.s.iLeftColumns&&(b.dom.grid.left.liner.scrollTop=b.dom.scroller.scrollTop),0<b.s.iRightColumns))b.dom.grid.right.liner.scrollTop=b.dom.scroll [...]
+var f="onwheel"in r.createElement("div")?"wheel.DTFC":"mousewheel.DTFC";if(0<b.s.iLeftColumns)d(b.dom.grid.left.liner).on("mouseover.DTFC touchstart.DTFC",function(){e||(c="left")}).on("scroll.DTFC",function(a){!c&&a.originalEvent&&(c="left");"left"===c&&(b.dom.scroller.scrollTop=b.dom.grid.left.liner.scrollTop,0<b.s.iRightColumns&&(b.dom.grid.right.liner.scrollTop=b.dom.grid.left.liner.scrollTop))}).on(f,function(a){b.dom.scroller.scrollLeft-="wheel"===a.type?-a.originalEvent.deltaX:a.o [...]
+if(0<b.s.iRightColumns)d(b.dom.grid.right.liner).on("mouseover.DTFC touchstart.DTFC",function(){e||(c="right")}).on("scroll.DTFC",function(a){!c&&a.originalEvent&&(c="right");"right"===c&&(b.dom.scroller.scrollTop=b.dom.grid.right.liner.scrollTop,0<b.s.iLeftColumns&&(b.dom.grid.left.liner.scrollTop=b.dom.grid.right.liner.scrollTop))}).on(f,function(a){b.dom.scroller.scrollLeft-="wheel"===a.type?-a.originalEvent.deltaX:a.originalEvent.wheelDeltaX});d(q).on("resize.DTFC",function(){b._fnGr [...]
+var g=!0,h=d(this.s.dt.nTable);h.on("draw.dt.DTFC",function(){b._fnColCalc();b._fnDraw.call(b,g);g=!1}).on("column-sizing.dt.DTFC",function(){b._fnColCalc();b._fnGridLayout(b)}).on("column-visibility.dt.DTFC",function(a,c,d,e,f){if(f===t||f)b._fnColCalc(),b._fnGridLayout(b),b._fnDraw(!0)}).on("select.dt.DTFC deselect.dt.DTFC",function(a){"dt"===a.namespace&&b._fnDraw(!1)}).on("destroy.dt.DTFC",function(){h.off(".DTFC");d(b.dom.scroller).off(".DTFC");d(q).off(".DTFC");d(b.s.dt.nTableWrapp [...]
+d(b.dom.grid.left.liner).off(".DTFC "+f);d(b.dom.grid.left.wrapper).remove();d(b.dom.grid.right.liner).off(".DTFC "+f);d(b.dom.grid.right.wrapper).remove()});this._fnGridLayout();this.s.dt.oInstance.fnDraw(!1)}},_fnColCalc:function(){var a=this,b=0,c=0;this.s.aiInnerWidths=[];this.s.aiOuterWidths=[];d.each(this.s.dt.aoColumns,function(e,f){var g=d(f.nTh),h;if(g.filter(":visible").length){var i=g.outerWidth();0===a.s.aiOuterWidths.length&&(h=d(a.s.dt.nTable).css("border-left-width"),i+="s [...]
+typeof h?1:parseInt(h,10));a.s.aiOuterWidths.length===a.s.dt.aoColumns.length-1&&(h=d(a.s.dt.nTable).css("border-right-width"),i+="string"===typeof h?1:parseInt(h,10));a.s.aiOuterWidths.push(i);a.s.aiInnerWidths.push(g.width());e<a.s.iLeftColumns&&(b+=i);a.s.iTableColumns-a.s.iRightColumns<=e&&(c+=i)}else a.s.aiInnerWidths.push(0),a.s.aiOuterWidths.push(0)});this.s.iLeftWidth=b;this.s.iRightWidth=c},_fnGridSetup:function(){var a=this._fnDTOverflow(),b;this.dom.body=this.s.dt.nTable;this. [...]
+this.s.dt.nTHead.parentNode;this.dom.header.parentNode.parentNode.style.position="relative";var c=d('<div class="DTFC_ScrollWrapper" style="position:relative; clear:both;"><div class="DTFC_LeftWrapper" style="position:absolute; top:0; left:0;"><div class="DTFC_LeftHeadWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div><div class="DTFC_LeftBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;"><div class="DTFC_LeftBodyLiner" style="position:relative [...]
+e=c.childNodes[0],f=c.childNodes[1];this.dom.grid.dt.parentNode.insertBefore(c,this.dom.grid.dt);c.appendChild(this.dom.grid.dt);this.dom.grid.wrapper=c;0<this.s.iLeftColumns&&(this.dom.grid.left.wrapper=e,this.dom.grid.left.head=e.childNodes[0],this.dom.grid.left.body=e.childNodes[1],this.dom.grid.left.liner=d("div.DTFC_LeftBodyLiner",c)[0],c.appendChild(e));0<this.s.iRightColumns&&(this.dom.grid.right.wrapper=f,this.dom.grid.right.head=f.childNodes[0],this.dom.grid.right.body=f.childNo [...]
+d("div.DTFC_RightBodyLiner",c)[0],f.style.right=a.bar+"px",b=d("div.DTFC_RightHeadBlocker",c)[0],b.style.width=a.bar+"px",b.style.right=-a.bar+"px",this.dom.grid.right.headBlock=b,b=d("div.DTFC_RightFootBlocker",c)[0],b.style.width=a.bar+"px",b.style.right=-a.bar+"px",this.dom.grid.right.footBlock=b,c.appendChild(f));if(this.s.dt.nTFoot&&(this.dom.footer=this.s.dt.nTFoot.parentNode,0<this.s.iLeftColumns&&(this.dom.grid.left.foot=e.childNodes[2]),0<this.s.iRightColumns))this.dom.grid.righ [...]
+this.s.rtl&&d("div.DTFC_RightHeadBlocker",c).css({left:-a.bar+"px",right:""})},_fnGridLayout:function(){var a=this,b=this.dom.grid;d(b.wrapper).width();var c=d(this.s.dt.nTable.parentNode).outerHeight(),e=d(this.s.dt.nTable.parentNode.parentNode).outerHeight(),f=this._fnDTOverflow(),g=this.s.iLeftWidth,h=this.s.iRightWidth,i="rtl"===d(this.dom.body).css("direction"),j=function(b,c){f.bar?a._firefoxScrollError()?34<d(b).height()&&(b.style.width=c+f.bar+"px"):b.style.width=c+f.bar+"px":(b. [...]
+c+20+"px",b.style.paddingRight="20px",b.style.boxSizing="border-box")};f.x&&(c-=f.bar);b.wrapper.style.height=e+"px";0<this.s.iLeftColumns&&(e=b.left.wrapper,e.style.width=g+"px",e.style.height="1px",i?(e.style.left="",e.style.right=0):(e.style.left=0,e.style.right=""),b.left.body.style.height=c+"px",b.left.foot&&(b.left.foot.style.top=(f.x?f.bar:0)+"px"),j(b.left.liner,g),b.left.liner.style.height=c+"px");0<this.s.iRightColumns&&(e=b.right.wrapper,e.style.width=h+"px",e.style.height="1p [...]
+(e.style.left=f.y?f.bar+"px":0,e.style.right=""):(e.style.left="",e.style.right=f.y?f.bar+"px":0),b.right.body.style.height=c+"px",b.right.foot&&(b.right.foot.style.top=(f.x?f.bar:0)+"px"),j(b.right.liner,h),b.right.liner.style.height=c+"px",b.right.headBlock.style.display=f.y?"block":"none",b.right.footBlock.style.display=f.y?"block":"none")},_fnDTOverflow:function(){var a=this.s.dt.nTable,b=a.parentNode,c={x:!1,y:!1,bar:this.s.dt.oScroll.iBarWidth};a.offsetWidth>b.clientWidth&&(c.x=!0) [...]
+b.clientHeight&&(c.y=!0);return c},_fnDraw:function(a){this._fnGridLayout();this._fnCloneLeft(a);this._fnCloneRight(a);null!==this.s.fnDrawCallback&&this.s.fnDrawCallback.call(this,this.dom.clone.left,this.dom.clone.right);d(this).trigger("draw.dtfc",{leftClone:this.dom.clone.left,rightClone:this.dom.clone.right})},_fnCloneRight:function(a){if(!(0>=this.s.iRightColumns)){var b,c=[];for(b=this.s.iTableColumns-this.s.iRightColumns;b<this.s.iTableColumns;b++)this.s.dt.aoColumns[b].bVisible& [...]
+this._fnClone(this.dom.clone.right,this.dom.grid.right,c,a)}},_fnCloneLeft:function(a){if(!(0>=this.s.iLeftColumns)){var b,c=[];for(b=0;b<this.s.iLeftColumns;b++)this.s.dt.aoColumns[b].bVisible&&c.push(b);this._fnClone(this.dom.clone.left,this.dom.grid.left,c,a)}},_fnCopyLayout:function(a,b,c){for(var e=[],f=[],g=[],h=0,i=a.length;h<i;h++){var j=[];j.nTr=d(a[h].nTr).clone(c,!1)[0];for(var l=0,o=this.s.iTableColumns;l<o;l++)if(-1!==d.inArray(l,b)){var p=d.inArray(a[h][l].cell,g);-1===p?(p [...]
+!1)[0],f.push(p),g.push(a[h][l].cell),j.push({cell:p,unique:a[h][l].unique})):j.push({cell:f[p],unique:a[h][l].unique})}e.push(j)}return e},_fnClone:function(a,b,c,e){var f=this,g,h,i,j,l,o,p,n,m,k=this.s.dt;if(e){d(a.header).remove();a.header=d(this.dom.header).clone(!0,!1)[0];a.header.className+=" DTFC_Cloned";a.header.style.width="100%";b.head.appendChild(a.header);n=this._fnCopyLayout(k.aoHeader,c,!0);j=d(">thead",a.header);j.empty();g=0;for(h=n.length;g<h;g++)j[0].appendChild(n[g].n [...]
+n,!0)}else{n=this._fnCopyLayout(k.aoHeader,c,!1);m=[];k.oApi._fnDetectHeader(m,d(">thead",a.header)[0]);g=0;for(h=n.length;g<h;g++){i=0;for(j=n[g].length;i<j;i++)m[g][i].cell.className=n[g][i].cell.className,d("span.DataTables_sort_icon",m[g][i].cell).each(function(){this.className=d("span.DataTables_sort_icon",n[g][i].cell)[0].className})}}this._fnEqualiseHeights("thead",this.dom.header,a.header);"auto"==this.s.sHeightMatch&&d(">tbody>tr",f.dom.body).css("height","auto");null!==a.body&& [...]
+a.body=null);a.body=d(this.dom.body).clone(!0)[0];a.body.className+=" DTFC_Cloned";a.body.style.paddingBottom=k.oScroll.iBarWidth+"px";a.body.style.marginBottom=2*k.oScroll.iBarWidth+"px";null!==a.body.getAttribute("id")&&a.body.removeAttribute("id");d(">thead>tr",a.body).empty();d(">tfoot",a.body).remove();var q=d("tbody",a.body)[0];d(q).empty();if(0<k.aiDisplay.length){h=d(">thead>tr",a.body)[0];for(p=0;p<c.length;p++)l=c[p],o=d(k.aoColumns[l].nTh).clone(!0)[0],o.innerHTML="",j=o.style [...]
+"0",j.paddingBottom="0",j.borderTopWidth="0",j.borderBottomWidth="0",j.height=0,j.width=f.s.aiInnerWidths[l]+"px",h.appendChild(o);d(">tbody>tr",f.dom.body).each(function(a){var a=f.s.dt.oFeatures.bServerSide===false?f.s.dt.aiDisplay[f.s.dt._iDisplayStart+a]:a,b=f.s.dt.aoData[a].anCells||d(this).children("td, th"),e=this.cloneNode(false);e.removeAttribute("id");e.setAttribute("data-dt-row",a);for(p=0;p<c.length;p++){l=c[p];if(b.length>0){o=d(b[l]).clone(true,true)[0];o.setAttribute("data [...]
+a);o.setAttribute("data-dt-column",p);e.appendChild(o)}}q.appendChild(e)})}else d(">tbody>tr",f.dom.body).each(function(){o=this.cloneNode(true);o.className=o.className+" DTFC_NoData";d("td",o).html("");q.appendChild(o)});a.body.style.width="100%";a.body.style.margin="0";a.body.style.padding="0";k.oScroller!==t&&(h=k.oScroller.dom.force,b.forcer?b.forcer.style.height=h.style.height:(b.forcer=h.cloneNode(!0),b.liner.appendChild(b.forcer)));b.liner.appendChild(a.body);this._fnEqualiseHeigh [...]
+f.dom.body,a.body);if(null!==k.nTFoot){if(e){null!==a.footer&&a.footer.parentNode.removeChild(a.footer);a.footer=d(this.dom.footer).clone(!0,!0)[0];a.footer.className+=" DTFC_Cloned";a.footer.style.width="100%";b.foot.appendChild(a.footer);n=this._fnCopyLayout(k.aoFooter,c,!0);b=d(">tfoot",a.footer);b.empty();g=0;for(h=n.length;g<h;g++)b[0].appendChild(n[g].nTr);k.oApi._fnDrawHead(k,n,!0)}else{n=this._fnCopyLayout(k.aoFooter,c,!1);b=[];k.oApi._fnDetectHeader(b,d(">tfoot",a.footer)[0]);g= [...]
+h;g++){i=0;for(j=n[g].length;i<j;i++)b[g][i].cell.className=n[g][i].cell.className}}this._fnEqualiseHeights("tfoot",this.dom.footer,a.footer)}b=k.oApi._fnGetUniqueThs(k,d(">thead",a.header)[0]);d(b).each(function(a){l=c[a];this.style.width=f.s.aiInnerWidths[l]+"px"});null!==f.s.dt.nTFoot&&(b=k.oApi._fnGetUniqueThs(k,d(">tfoot",a.footer)[0]),d(b).each(function(a){l=c[a];this.style.width=f.s.aiInnerWidths[l]+"px"}))},_fnGetTrNodes:function(a){for(var b=[],c=0,d=a.childNodes.length;c<d;c++) [...]
+b.push(a.childNodes[c]);return b},_fnEqualiseHeights:function(a,b,c){if(!("none"==this.s.sHeightMatch&&"thead"!==a&&"tfoot"!==a)){var e,f,g=b.getElementsByTagName(a)[0],c=c.getElementsByTagName(a)[0],a=d(">"+a+">tr:eq(0)",b).children(":first");a.outerHeight();a.height();for(var g=this._fnGetTrNodes(g),b=this._fnGetTrNodes(c),h=[],c=0,a=b.length;c<a;c++)e=g[c].offsetHeight,f=b[c].offsetHeight,e=f>e?f:e,"semiauto"==this.s.sHeightMatch&&(g[c]._DTTC_iHeight=e),h.push(e);c=0;for(a=b.length;c< [...]
+h[c]+"px",g[c].style.height=h[c]+"px"}},_firefoxScrollError:function(){if(u===t){var a=d("<div/>").css({position:"absolute",top:0,left:0,height:10,width:50,overflow:"scroll"}).appendTo("body");u=a[0].clientWidth===a[0].offsetWidth&&0!==this._fnDTOverflow().bar;a.remove()}return u}});m.defaults={iLeftColumns:1,iRightColumns:0,fnDrawCallback:null,sHeightMatch:"semiauto"};m.version="3.2.2";s.Api.register("fixedColumns()",function(){return this});s.Api.register("fixedColumns().update()",func [...]
+function(a){a._oFixedColumns&&a._oFixedColumns.fnUpdate()})});s.Api.register("fixedColumns().relayout()",function(){return this.iterator("table",function(a){a._oFixedColumns&&a._oFixedColumns.fnRedrawLayout()})});s.Api.register("rows().recalcHeight()",function(){return this.iterator("row",function(a,b){a._oFixedColumns&&a._oFixedColumns.fnRecalculateHeight(this.row(b).node())})});s.Api.register("fixedColumns().rowIndex()",function(a){a=d(a);return a.parents(".DTFC_Cloned").length?this.ro [...]
+this.row(a).index()});s.Api.register("fixedColumns().cellIndex()",function(a){a=d(a);if(a.parents(".DTFC_Cloned").length){var b=a.parent().index(),b=this.rows({page:"current"}).indexes()[b],a=a.parents(".DTFC_LeftWrapper").length?a.index():this.columns().flatten().length-this.context[0]._oFixedColumns.s.iRightColumns+a.index();return{row:b,column:this.column.index("toData",a),columnVisible:a}}return this.cell(a).index()});d(r).on("init.dt.fixedColumns",function(a,b){if("dt"===a.namespace [...]
+e=s.defaults.fixedColumns;if(c||e)e=d.extend({},c,e),!1!==c&&new m(b,e)}});d.fn.dataTable.FixedColumns=m;return d.fn.DataTable.FixedColumns=m});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.bootstrap.min.css
new file mode 100644
index 0000000..68f8167
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.bootstrap.min.css
@@ -0,0 +1 @@
+table.dataTable.fixedHeader-floating,table.dataTable.fixedHeader-locked{background-color:white;margin-top:0 !important;margin-bottom:0 !important}table.dataTable.fixedHeader-floating{position:fixed !important}table.dataTable.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.bootstrap4.min.css
new file mode 100644
index 0000000..68f8167
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.bootstrap4.min.css
@@ -0,0 +1 @@
+table.dataTable.fixedHeader-floating,table.dataTable.fixedHeader-locked{background-color:white;margin-top:0 !important;margin-bottom:0 !important}table.dataTable.fixedHeader-floating{position:fixed !important}table.dataTable.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.min.css
new file mode 100644
index 0000000..7113963
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.min.css
@@ -0,0 +1 @@
+table.fixedHeader-floating{position:fixed !important;background-color:white}table.fixedHeader-floating.no-footer{border-bottom-width:0}table.fixedHeader-locked{position:absolute !important;background-color:white}@media print{table.fixedHeader-floating{display:none}}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.foundation.min.css
new file mode 100644
index 0000000..68f8167
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.foundation.min.css
@@ -0,0 +1 @@
+table.dataTable.fixedHeader-floating,table.dataTable.fixedHeader-locked{background-color:white;margin-top:0 !important;margin-bottom:0 !important}table.dataTable.fixedHeader-floating{position:fixed !important}table.dataTable.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.jqueryui.min.css
new file mode 100644
index 0000000..c89d814
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.jqueryui.min.css
@@ -0,0 +1 @@
+table.fixedHeader-floating{position:fixed !important;background-color:white}table.fixedHeader-locked{position:absolute !important;background-color:white}@media print{table.fixedHeader-floating{display:none}}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.semanticui.min.css
new file mode 100644
index 0000000..eaa3fcb
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/css/fixedHeader.semanticui.min.css
@@ -0,0 +1 @@
+table.fixedHeader-floating{position:fixed !important;border-bottom-width:0 !important}table.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.min.js b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.min.js
new file mode 100644
index 0000000..80a8a4c
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.min.js
@@ -0,0 +1,17 @@
+/*!
+ FixedHeader 3.1.2
+ ©2009-2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(g){return d(g,window,document)}):"object"===typeof exports?module.exports=function(g,h){g||(g=window);if(!h||!h.fn.dataTable)h=require("datatables.net")(g,h).$;return d(h,g,g.document)}:d(jQuery,window,document)})(function(d,g,h,k){var j=d.fn.dataTable,l=0,i=function(b,a){if(!(this instanceof i))throw"FixedHeader must be initialised with the 'new' keyword.";!0===a&&(a={});b=new j.Api(b);this.c [...]
+{},i.defaults,a);this.s={dt:b,position:{theadTop:0,tbodyTop:0,tfootTop:0,tfootBottom:0,width:0,left:0,tfootHeight:0,theadHeight:0,windowHeight:d(g).height(),visible:!0},headerMode:null,footerMode:null,autoWidth:b.settings()[0].oFeatures.bAutoWidth,namespace:".dtfc"+l++,scrollLeft:{header:-1,footer:-1},enable:!0};this.dom={floatingHeader:null,thead:d(b.table().header()),tbody:d(b.table().body()),tfoot:d(b.table().footer()),header:{host:null,floating:null,placeholder:null},footer:{host:nul [...]
+placeholder:null}};this.dom.header.host=this.dom.thead.parent();this.dom.footer.host=this.dom.tfoot.parent();var e=b.settings()[0];if(e._fixedHeader)throw"FixedHeader already initialised on table "+e.nTable.id;e._fixedHeader=this;this._constructor()};d.extend(i.prototype,{enable:function(b){this.s.enable=b;this.c.header&&this._modeChange("in-place","header",!0);this.c.footer&&this.dom.tfoot.length&&this._modeChange("in-place","footer",!0);this.update()},headerOffset:function(b){b!==k&&(t [...]
+b,this.update());return this.c.headerOffset},footerOffset:function(b){b!==k&&(this.c.footerOffset=b,this.update());return this.c.footerOffset},update:function(){this._positions();this._scroll(!0)},_constructor:function(){var b=this,a=this.s.dt;d(g).on("scroll"+this.s.namespace,function(){b._scroll()}).on("resize"+this.s.namespace,function(){b.s.position.windowHeight=d(g).height();b.update()});var e=d(".fh-fixedHeader");!this.c.headerOffset&&e.length&&(this.c.headerOffset=e.outerHeight()) [...]
+!this.c.footerOffset&&e.length&&(this.c.footerOffset=e.outerHeight());a.on("column-reorder.dt.dtfc column-visibility.dt.dtfc draw.dt.dtfc column-sizing.dt.dtfc",function(){b.update()});a.on("destroy.dtfc",function(){a.off(".dtfc");d(g).off(b.s.namespace)});this._positions();this._scroll()},_clone:function(b,a){var e=this.s.dt,c=this.dom[b],f="header"===b?this.dom.thead:this.dom.tfoot;!a&&c.floating?c.floating.removeClass("fixedHeader-floating fixedHeader-locked"):(c.floating&&(c.placehol [...]
+this._unsize(b),c.floating.children().detach(),c.floating.remove()),c.floating=d(e.table().node().cloneNode(!1)).css("table-layout","fixed").removeAttr("id").append(f).appendTo("body"),c.placeholder=f.clone(!1),c.host.prepend(c.placeholder),this._matchWidths(c.placeholder,c.floating))},_matchWidths:function(b,a){var e=function(a){return d(a,b).map(function(){return d(this).width()}).toArray()},c=function(b,c){d(b,a).each(function(a){d(this).css({width:c[a],minWidth:c[a]})})},f=e("th"),e= [...]
+f);c("td",e)},_unsize:function(b){var a=this.dom[b].floating;a&&("footer"===b||"header"===b&&!this.s.autoWidth)?d("th, td",a).css({width:"",minWidth:""}):a&&"header"===b&&d("th, td",a).css("min-width","")},_horizontal:function(b,a){var e=this.dom[b],c=this.s.position,d=this.s.scrollLeft;e.floating&&d[b]!==a&&(e.floating.css("left",c.left-a),d[b]=a)},_modeChange:function(b,a,e){var c=this.dom[a],f=this.s.position,g=d.contains(this.dom["footer"===a?"tfoot":"thead"][0],h.activeElement)?h.ac [...]
+null;if("in-place"===b){if(c.placeholder&&(c.placeholder.remove(),c.placeholder=null),this._unsize(a),"header"===a?c.host.prepend(this.dom.thead):c.host.append(this.dom.tfoot),c.floating)c.floating.remove(),c.floating=null}else"in"===b?(this._clone(a,e),c.floating.addClass("fixedHeader-floating").css("header"===a?"top":"bottom",this.c[a+"Offset"]).css("left",f.left+"px").css("width",f.width+"px"),"footer"===a&&c.floating.css("top","")):"below"===b?(this._clone(a,e),c.floating.addClass("f [...]
+f.tfootTop-f.theadHeight).css("left",f.left+"px").css("width",f.width+"px")):"above"===b&&(this._clone(a,e),c.floating.addClass("fixedHeader-locked").css("top",f.tbodyTop).css("left",f.left+"px").css("width",f.width+"px"));g&&g!==h.activeElement&&g.focus();this.s.scrollLeft.header=-1;this.s.scrollLeft.footer=-1;this.s[a+"Mode"]=b},_positions:function(){var b=this.s.dt.table(),a=this.s.position,e=this.dom,b=d(b.node()),c=b.children("thead"),f=b.children("tfoot"),e=e.tbody;a.visible=b.is(" [...]
+a.width=b.outerWidth();a.left=b.offset().left;a.theadTop=c.offset().top;a.tbodyTop=e.offset().top;a.theadHeight=a.tbodyTop-a.theadTop;f.length?(a.tfootTop=f.offset().top,a.tfootBottom=a.tfootTop+f.outerHeight(),a.tfootHeight=a.tfootBottom-a.tfootTop):(a.tfootTop=a.tbodyTop+e.outerHeight(),a.tfootBottom=a.tfootTop,a.tfootHeight=a.tfootTop)},_scroll:function(b){var a=d(h).scrollTop(),e=d(h).scrollLeft(),c=this.s.position,f;if(this.s.enable&&(this.c.header&&(f=!c.visible||a<=c.theadTop-this [...]
+"in-place":a<=c.tfootTop-c.theadHeight-this.c.headerOffset?"in":"below",(b||f!==this.s.headerMode)&&this._modeChange(f,"header",b),this._horizontal("header",e)),this.c.footer&&this.dom.tfoot.length))a=!c.visible||a+c.windowHeight>=c.tfootBottom+this.c.footerOffset?"in-place":c.windowHeight+a>c.tbodyTop+c.tfootHeight+this.c.footerOffset?"in":"above",(b||a!==this.s.footerMode)&&this._modeChange(a,"footer",b),this._horizontal("footer",e)}});i.version="3.1.2";i.defaults={header:!0,footer:!1, [...]
+footerOffset:0};d.fn.dataTable.FixedHeader=i;d.fn.DataTable.FixedHeader=i;d(h).on("init.dt.dtfh",function(b,a){if("dt"===b.namespace){var e=a.oInit.fixedHeader,c=j.defaults.fixedHeader;if((e||c)&&!a._fixedHeader)c=d.extend({},c,e),!1!==e&&new i(a,c)}});j.Api.register("fixedHeader()",function(){});j.Api.register("fixedHeader.adjust()",function(){return this.iterator("table",function(b){(b=b._fixedHeader)&&b.update()})});j.Api.register("fixedHeader.enable()",function(b){return this.iterato [...]
+function(a){(a=a._fixedHeader)&&a.enable(b!==k?b:!0)})});j.Api.register("fixedHeader.disable()",function(){return this.iterator("table",function(b){(b=b._fixedHeader)&&b.enable(!1)})});d.each(["header","footer"],function(b,a){j.Api.register("fixedHeader."+a+"Offset()",function(b){var c=this.context;return b===k?c.length&&c[0]._fixedHeader?c[0]._fixedHeader[a+"Offset"]():k:this.iterator("table",function(c){if(c=c._fixedHeader)c[a+"Offset"](b)})})});return i});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.bootstrap.min.css
new file mode 100644
index 0000000..21fc947
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.bootstrap.min.css
@@ -0,0 +1 @@
+table.dataTable th.focus,table.dataTable td.focus{outline:3px solid #337ab7;outline-offset:-1px}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.bootstrap4.min.css
new file mode 100644
index 0000000..d8ecb58
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.bootstrap4.min.css
@@ -0,0 +1 @@
+table.dataTable th.focus,table.dataTable td.focus{outline:3px solid #0275d8;outline-offset:-1px}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.dataTables.min.css
new file mode 100644
index 0000000..6f60353
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable th.focus,table.dataTable td.focus{outline:3px solid #3366FF;outline-offset:-1px}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.foundation.min.css
new file mode 100644
index 0000000..5aa7144
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.foundation.min.css
@@ -0,0 +1 @@
+table.dataTable th.focus,table.dataTable td.focus{outline:3px solid #008CBA;outline-offset:-1px}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.jqueryui.min.css
new file mode 100644
index 0000000..6f60353
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.jqueryui.min.css
@@ -0,0 +1 @@
+table.dataTable th.focus,table.dataTable td.focus{outline:3px solid #3366FF;outline-offset:-1px}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.semanticui.min.css
new file mode 100644
index 0000000..463b424
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/css/keyTable.semanticui.min.css
@@ -0,0 +1 @@
+table.dataTable th.focus,table.dataTable td.focus{outline:3px solid #888;outline-offset:-1px}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/KeyTable/js/dataTables.keyTable.min.js b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/js/dataTables.keyTable.min.js
new file mode 100644
index 0000000..f4714aa
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/KeyTable/js/dataTables.keyTable.min.js
@@ -0,0 +1,18 @@
+/*!
+ KeyTable 2.1.2
+ ©2009-2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(e){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(k){return e(k,window,document)}):"object"===typeof exports?module.exports=function(k,g){k||(k=window);if(!g||!g.fn.dataTable)g=require("datatables.net")(k,g).$;return e(g,k,k.document)}:e(jQuery,window,document)})(function(e,k,g,n){var h=e.fn.dataTable,l=function(a,b){if(!h.versionCheck||!h.versionCheck("1.10.8"))throw"KeyTable requires DataTables 1.10.8 or newer";this.c=e.extend(!0,{},h.defau [...]
+l.defaults,b);this.s={dt:new h.Api(a),enable:!0,focusDraw:!1};this.dom={};var d=this.s.dt.settings()[0],c=d.keytable;if(c)return c;d.keytable=this;this._constructor()};e.extend(l.prototype,{blur:function(){this._blur()},enable:function(a){this.s.enable=a},focus:function(a,b){this._focus(this.s.dt.cell(a,b))},focused:function(a){if(!this.s.lastFocus)return!1;var b=this.s.lastFocus.index();return a.row===b.row&&a.column===b.column},_constructor:function(){this._tabInput();var a=this,b=this [...]
+"static"===d.css("position")&&d.css("position","relative");e(b.table().body()).on("click.keyTable","th, td",function(){if(!1!==a.s.enable){var c=b.cell(this);c.any()&&a._focus(c,null,!1)}});e(g).on("keydown.keyTable",function(b){a._key(b)});if(this.c.blurable)e(g).on("click.keyTable",function(c){e(c.target).parents(".dataTables_filter").length&&a._blur();e(c.target).parents().filter(b.table().container()).length||e(c.target).parents("div.DTE").length||a._blur()});if(this.c.editor)b.on("k [...]
+function(b,c,d,e,g){a._editor(d,g)});if(b.settings()[0].oFeatures.bStateSave)b.on("stateSaveParams.keyTable",function(b,c,d){d.keyTable=a.s.lastFocus?a.s.lastFocus.index():null});b.on("xhr.keyTable",function(){if(!a.s.focusDraw){var c=a.s.lastFocus;c&&(a.s.lastFocus=null,b.one("draw",function(){a._focus(c)}))}});b.on("destroy.keyTable",function(){b.off(".keyTable");e(b.table().body()).off("click.keyTable","th, td");e(g.body).off("keydown.keyTable").off("click.keyTable")});var c=b.state.l [...]
+c.keyTable)b.one("init",function(){var a=b.cell(c.keyTable);a.any()&&a.focus()});else this.c.focus&&b.cell(this.c.focus).focus()},_blur:function(){if(this.s.enable&&this.s.lastFocus){var a=this.s.lastFocus;e(a.node()).removeClass(this.c.className);this.s.lastFocus=null;this._emitEvent("key-blur",[this.s.dt,a])}},_columns:function(){var a=this.s.dt,b=a.columns(this.c.columns).indexes(),d=[];a.columns(":visible").every(function(a){-1!==b.indexOf(a)&&d.push(a)});return d},_editor:function(a [...]
+this.s.dt,c=this.c.editor;b.stopPropagation();13===a&&b.preventDefault();c.inline(this.s.lastFocus.index());var f=e("div.DTE input, div.DTE textarea");f.length&&f[0].select();d.keys.enable("navigation-only");d.one("key-blur.editor",function(){c.displayed()&&c.submit()});c.one("close",function(){d.keys.enable(!0);d.off("key-blur.editor")})},_emitEvent:function(a,b){this.s.dt.iterator("table",function(d){e(d.nTable).triggerHandler(a,b)})},_focus:function(a,b,d){var c=this,f=this.s.dt,i=f.p [...]
+m=this.s.lastFocus;if(this.s.enable){if("number"!==typeof a){var j=a.index(),b=j.column,a=f.rows({filter:"applied",order:"applied"}).indexes().indexOf(j.row);i.serverSide&&(a+=i.start)}if(-1!==i.length&&(a<i.start||a>=i.start+i.length))this.s.focusDraw=!0,f.one("draw",function(){c.s.focusDraw=!1;c._focus(a,b)}).page(Math.floor(a/i.length)).draw(!1);else if(-1!==e.inArray(b,this._columns())){i.serverSide&&(a-=i.start);i=f.cell(":eq("+a+")",b,{search:"applied"});if(m){if(m.node()===i.node( [...]
+this._blur()}m=e(i.node());m.addClass(this.c.className);if(d===n||!0===d)this._scroll(e(k),e(g.body),m,"offset"),d=f.table().body().parentNode,d!==f.table().header().parentNode&&(d=e(d.parentNode),this._scroll(d,d,m,"position"));this.s.lastFocus=i;this._emitEvent("key-focus",[this.s.dt,i]);f.state.save()}}},_key:function(a){if(this.s.enable&&!(0===a.keyCode||a.ctrlKey||a.metaKey||a.altKey)){var b=this.s.lastFocus;if(b){var d=this,c=this.s.dt;if(!(this.c.keys&&-1===e.inArray(a.keyCode,thi [...]
+a.shiftKey?"left":"right",!0);break;case 27:this.s.blurable&&!0===this.s.enable&&this._blur();break;case 33:case 34:a.preventDefault();var f=c.cells({page:"current"}).nodes().indexOf(b.node());c.one("draw",function(){var a=c.cells({page:"current"}).nodes();d._focus(c.cell(f<a.length?a[f]:a[a.length-1]))}).page(33===a.keyCode?"previous":"next").draw(!1);break;case 35:case 36:a.preventDefault();b=c.cells({page:"current"}).indexes();this._focus(c.cell(b[35===a.keyCode?b.length-1:0]));break; [...]
+"left");break;case 38:this._shift(a,"up");break;case 39:this._shift(a,"right");break;case 40:this._shift(a,"down");break;default:!0===this.s.enable&&this._emitEvent("key",[c,a.keyCode,this.s.lastFocus,a])}}}},_scroll:function(a,b,d,c){var c=d[c](),f=d.outerHeight(),d=d.outerWidth(),e=b.scrollTop(),g=b.scrollLeft(),j=a.height(),a=a.width();c.top<e&&b.scrollTop(c.top);c.left<g&&b.scrollLeft(c.left);c.top+f>e+j&&f<j&&b.scrollTop(c.top+f-j);c.left+d>g+a&&d<a&&b.scrollLeft(c.left+d-a)},_shift [...]
+b,d){var c=this.s.dt,f=c.page.info(),i=f.recordsDisplay,g=this.s.lastFocus,j=this._columns();if(g){var h=c.rows({filter:"applied",order:"applied"}).indexes().indexOf(g.index().row);f.serverSide&&(h+=f.start);c=c.columns(j).indexes().indexOf(g.index().column);f=j[c];"right"===b?c>=j.length-1?(h++,f=j[0]):f=j[c+1]:"left"===b?0===c?(h--,f=j[j.length-1]):f=j[c-1]:"up"===b?h--:"down"===b&&h++;0<=h&&h<i&&-1!==e.inArray(f,j)?(a.preventDefault(),this._focus(h,f)):!d||!this.c.blurable?a.preventDe [...]
+_tabInput:function(){var a=this,b=this.s.dt,d=null!==this.c.tabIndex?this.c.tabIndex:b.settings()[0].iTabIndex;if(-1!=d)e('<div><input type="text" tabindex="'+d+'"/></div>').css({position:"absolute",height:1,width:0,overflow:"hidden"}).insertBefore(b.table().node()).children().on("focus",function(){a._focus(b.cell(":eq(0)","0:visible",{page:"current"}))})}});l.defaults={blurable:!0,className:"focus",columns:"",editor:null,focus:null,keys:null,tabIndex:null};l.version="2.1.2";e.fn.dataTab [...]
+l;e.fn.DataTable.KeyTable=l;h.Api.register("cell.blur()",function(){return this.iterator("table",function(a){a.keytable&&a.keytable.blur()})});h.Api.register("cell().focus()",function(){return this.iterator("cell",function(a,b,d){a.keytable&&a.keytable.focus(b,d)})});h.Api.register("keys.disable()",function(){return this.iterator("table",function(a){a.keytable&&a.keytable.enable(!1)})});h.Api.register("keys.enable()",function(a){return this.iterator("table",function(b){b.keytable&&b.keyt [...]
+n?!0:a)})});h.ext.selector.cell.push(function(a,b,d){var b=b.focused,a=a.keytable,c=[];if(!a||b===n)return d;for(var e=0,g=d.length;e<g;e++)(!0===b&&a.focused(d[e])||!1===b&&!a.focused(d[e]))&&c.push(d[e]);return c});e(g).on("preInit.dt.dtk",function(a,b){if("dt"===a.namespace){var d=b.oInit.keys,c=h.defaults.keys;if(d||c)c=e.extend({},d,c),!1!==d&&new l(b,c)}});return l});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.bootstrap.min.css
new file mode 100644
index 0000000..ae9e839
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.bootstrap.min.css
@@ -0,0 +1 @@
+table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.da [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.bootstrap4.min.css
new file mode 100644
index 0000000..a36bf9d
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.bootstrap4.min.css
@@ -0,0 +1 @@
+table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.da [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.dataTables.min.css
new file mode 100644
index 0000000..b04102b
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.da [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.foundation.min.css
new file mode 100644
index 0000000..caed892
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.foundation.min.css
@@ -0,0 +1 @@
+table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.da [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.jqueryui.min.css
new file mode 100644
index 0000000..b04102b
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.jqueryui.min.css
@@ -0,0 +1 @@
+table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.da [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.semanticui.min.css
new file mode 100644
index 0000000..9664fb4
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/css/responsive.semanticui.min.css
@@ -0,0 +1 @@
+table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.da [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/dataTables.responsive.min.js b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/dataTables.responsive.min.js
new file mode 100644
index 0000000..a8ee879
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/dataTables.responsive.min.js
@@ -0,0 +1,26 @@
+/*!
+ Responsive 2.1.0
+ 2014-2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(l){return c(l,window,document)}):"object"===typeof exports?module.exports=function(l,k){l||(l=window);if(!k||!k.fn.dataTable)k=require("datatables.net")(l,k).$;return c(k,l,l.document)}:c(jQuery,window,document)})(function(c,l,k,p){var m=c.fn.dataTable,j=function(a,b){if(!m.versionCheck||!m.versionCheck("1.10.3"))throw"DataTables Responsive requires DataTables 1.10.3 or newer";this.s={dt:new m [...]
+current:[]};this.s.dt.settings()[0].responsive||(b&&"string"===typeof b.details?b.details={type:b.details}:b&&!1===b.details?b.details={type:!1}:b&&!0===b.details&&(b.details={type:"inline"}),this.c=c.extend(!0,{},j.defaults,m.defaults.responsive,b),a.responsive=this,this._constructor())};c.extend(j.prototype,{_constructor:function(){var a=this,b=this.s.dt,d=b.settings()[0],e=c(l).width();b.settings()[0]._responsive=this;c(l).on("resize.dtr orientationchange.dtr",m.util.throttle(function [...]
+c(l).width();b!==e&&(a._resize(),e=b)}));d.oApi._fnCallbackReg(d,"aoRowCreatedCallback",function(e){-1!==c.inArray(!1,a.s.current)&&c("td, th",e).each(function(e){e=b.column.index("toData",e);!1===a.s.current[e]&&c(this).css("display","none")})});b.on("destroy.dtr",function(){b.off(".dtr");c(b.table().body()).off(".dtr");c(l).off("resize.dtr orientationchange.dtr");c.each(a.s.current,function(b,e){!1===e&&a._setColumnVis(b,!0)})});this.c.breakpoints.sort(function(a,b){return a.width<b.wi [...]
+b.width?-1:0});this._classLogic();this._resizeAuto();d=this.c.details;!1!==d.type&&(a._detailsInit(),b.on("column-visibility.dtr",function(){a._classLogic();a._resizeAuto();a._resize()}),b.on("draw.dtr",function(){a._redrawChildren()}),c(b.table().node()).addClass("dtr-"+d.type));b.on("column-reorder.dtr",function(){a._classLogic();a._resizeAuto();a._resize()});b.on("column-sizing.dtr",function(){a._resizeAuto();a._resize()});b.on("init.dtr",function(){a._resizeAuto();a._resize();c.inArr [...]
+a.s.current)&&b.columns.adjust()});this._resize()},_columnsVisiblity:function(a){var b=this.s.dt,d=this.s.columns,e,f,g=d.map(function(a,b){return{columnIdx:b,priority:a.priority}}).sort(function(a,b){return a.priority!==b.priority?a.priority-b.priority:a.columnIdx-b.columnIdx}),h=c.map(d,function(b){return b.auto&&null===b.minWidth?!1:!0===b.auto?"-":-1!==c.inArray(a,b.includeIn)}),n=0;e=0;for(f=h.length;e<f;e++)!0===h[e]&&(n+=d[e].minWidth);e=b.settings()[0].oScroll;e=e.sY||e.sX?e.iBar [...]
+b.table().container().offsetWidth-e-n;e=0;for(f=h.length;e<f;e++)d[e].control&&(b-=d[e].minWidth);n=!1;e=0;for(f=g.length;e<f;e++){var i=g[e].columnIdx;"-"===h[i]&&(!d[i].control&&d[i].minWidth)&&(n||0>b-d[i].minWidth?(n=!0,h[i]=!1):h[i]=!0,b-=d[i].minWidth)}g=!1;e=0;for(f=d.length;e<f;e++)if(!d[e].control&&!d[e].never&&!h[e]){g=!0;break}e=0;for(f=d.length;e<f;e++)d[e].control&&(h[e]=g);-1===c.inArray(!0,h)&&(h[0]=!0);return h},_classLogic:function(){var a=this,b=this.c.breakpoints,d=thi [...]
+d.columns().eq(0).map(function(a){var b=this.column(a),e=b.header().className,a=d.settings()[0].aoColumns[a].responsivePriority;a===p&&(b=c(b.header()).data("priority"),a=b!==p?1*b:1E4);return{className:e,includeIn:[],auto:!1,control:!1,never:e.match(/\bnever\b/)?!0:!1,priority:a}}),f=function(a,b){var d=e[a].includeIn;-1===c.inArray(b,d)&&d.push(b)},g=function(c,d,i,g){if(i)if("max-"===i){g=a._find(d).width;d=0;for(i=b.length;d<i;d++)b[d].width<=g&&f(c,b[d].name)}else if("min-"===i){g=a [...]
+d=0;for(i=b.length;d<i;d++)b[d].width>=g&&f(c,b[d].name)}else{if("not-"===i){d=0;for(i=b.length;d<i;d++)-1===b[d].name.indexOf(g)&&f(c,b[d].name)}}else e[c].includeIn.push(d)};e.each(function(a,e){for(var d=a.className.split(" "),f=!1,j=0,l=d.length;j<l;j++){var k=c.trim(d[j]);if("all"===k){f=!0;a.includeIn=c.map(b,function(a){return a.name});return}if("none"===k||a.never){f=!0;return}if("control"===k){f=!0;a.control=!0;return}c.each(b,function(a,b){var d=b.name.split("-"),c=k.match(RegE [...]
+d[0]+")(\\-[_a-zA-Z0-9])?"));c&&(f=!0,c[2]===d[0]&&c[3]==="-"+d[1]?g(e,b.name,c[1],c[2]+c[3]):c[2]===d[0]&&!c[3]&&g(e,b.name,c[1],c[2]))})}f||(a.auto=!0)});this.s.columns=e},_detailsDisplay:function(a,b){var d=this,e=this.s.dt,f=this.c.details;if(f&&!1!==f.type){var g=f.display(a,b,function(){return f.renderer(e,a[0],d._detailsObj(a[0]))});(!0===g||!1===g)&&c(e.table().node()).triggerHandler("responsive-display.dt",[e,a,g,b])}},_detailsInit:function(){var a=this,b=this.s.dt,d=this.c.deta [...]
+d.type&&(d.target="td:first-child, th:first-child");b.on("draw.dtr",function(){a._tabIndexes()});a._tabIndexes();c(b.table().body()).on("keyup.dtr","td, th",function(a){a.keyCode===13&&c(this).data("dtr-keyboard")&&c(this).click()});var e=d.target;c(b.table().body()).on("click.dtr mousedown.dtr mouseup.dtr","string"===typeof e?e:"td, th",function(d){if(c(b.table().node()).hasClass("collapsed")&&b.row(c(this).closest("tr")).length){if(typeof e==="number"){var g=e<0?b.columns().eq(0).lengt [...]
+g)return}g=b.row(c(this).closest("tr"));d.type==="click"?a._detailsDisplay(g,false):d.type==="mousedown"?c(this).css("outline","none"):d.type==="mouseup"&&c(this).blur().css("outline","")}})},_detailsObj:function(a){var b=this,d=this.s.dt;return c.map(this.s.columns,function(e,c){if(!e.never&&!e.control)return{title:d.settings()[0].aoColumns[c].sTitle,data:d.cell(a,c).render(b.c.orthogonal),hidden:d.column(c).visible()&&!b.s.current[c],columnIndex:c,rowIndex:a}})},_find:function(a){for(v [...]
+d=0,c=b.length;d<c;d++)if(b[d].name===a)return b[d]},_redrawChildren:function(){var a=this,b=this.s.dt;b.rows({page:"current"}).iterator("row",function(c,e){b.row(e);a._detailsDisplay(b.row(e),!0)})},_resize:function(){var a=this,b=this.s.dt,d=c(l).width(),e=this.c.breakpoints,f=e[0].name,g=this.s.columns,h,j=this.s.current.slice();for(h=e.length-1;0<=h;h--)if(d<=e[h].width){f=e[h].name;break}var i=this._columnsVisiblity(f);this.s.current=i;e=!1;h=0;for(d=g.length;h<d;h++)if(!1===i[h]&&! [...]
+!g[h].control){e=!0;break}c(b.table().node()).toggleClass("collapsed",e);var k=!1;b.columns().eq(0).each(function(b,c){i[c]!==j[c]&&(k=!0,a._setColumnVis(b,i[c]))});k&&(this._redrawChildren(),c(b.table().node()).trigger("responsive-resize.dt",[b,this.s.current]))},_resizeAuto:function(){var a=this.s.dt,b=this.s.columns;if(this.c.auto&&-1!==c.inArray(!0,c.map(b,function(a){return a.auto}))){a.table().node();var d=a.table().node().cloneNode(!1),e=c(a.table().header().cloneNode(!1)).appendT [...]
+!1).empty().appendTo(d),g=a.columns().header().filter(function(b){return a.column(b).visible()}).to$().clone(!1).css("display","table-cell");c(f).append(c(a.rows({page:"current"}).nodes()).clone(!1)).find("th, td").css("display","");if(f=a.table().footer()){var f=c(f.cloneNode(!1)).appendTo(d),h=a.columns().footer().filter(function(b){return a.column(b).visible()}).to$().clone(!1).css("display","table-cell");c("<tr/>").append(h).appendTo(f)}c("<tr/>").append(g).appendTo(e);"inline"===thi [...]
+c(d).addClass("dtr-inline collapsed");c(d).find("[name]").removeAttr("name");d=c("<div/>").css({width:1,height:1,overflow:"hidden"}).append(d);d.insertBefore(a.table().node());g.each(function(c){c=a.column.index("fromVisible",c);b[c].minWidth=this.offsetWidth||0});d.remove()}},_setColumnVis:function(a,b){var d=this.s.dt,e=b?"":"none";c(d.column(a).header()).css("display",e);c(d.column(a).footer()).css("display",e);d.column(a).nodes().to$().css("display",e)},_tabIndexes:function(){var a=t [...]
+b=a.cells({page:"current"}).nodes().to$(),d=a.settings()[0],e=this.c.details.target;b.filter("[data-dtr-keyboard]").removeData("[data-dtr-keyboard]");c("number"===typeof e?":eq("+e+")":e,a.rows({page:"current"}).nodes()).attr("tabIndex",d.iTabIndex).data("dtr-keyboard",1)}});j.breakpoints=[{name:"desktop",width:Infinity},{name:"tablet-l",width:1024},{name:"tablet-p",width:768},{name:"mobile-l",width:480},{name:"mobile-p",width:320}];j.display={childRow:function(a,b,d){if(b){if(c(a.node() [...]
+"child").show(),!0}else{if(a.child.isShown())return a.child(!1),c(a.node()).removeClass("parent"),!1;a.child(d(),"child").show();c(a.node()).addClass("parent");return!0}},childRowImmediate:function(a,b,d){if(!b&&a.child.isShown()||!a.responsive.hasHidden())return a.child(!1),c(a.node()).removeClass("parent"),!1;a.child(d(),"child").show();c(a.node()).addClass("parent");return!0},modal:function(a){return function(b,d,e){if(d)c("div.dtr-modal-content").empty().append(e());else{var f=functi [...]
+c(k).off("keypress.dtr")},g=c('<div class="dtr-modal"/>').append(c('<div class="dtr-modal-display"/>').append(c('<div class="dtr-modal-content"/>').append(e())).append(c('<div class="dtr-modal-close">×</div>').click(function(){f()}))).append(c('<div class="dtr-modal-background"/>').click(function(){f()})).appendTo("body");c(k).on("keyup.dtr",function(a){27===a.keyCode&&(a.stopPropagation(),f())})}a&&a.header&&c("div.dtr-modal-content").prepend("<h2>"+a.header(b)+"</h2>")}}};j.rende [...]
+b,d){return(a=c.map(d,function(a){return a.hidden?'<li data-dtr-index="'+a.columnIndex+'" data-dt-row="'+a.rowIndex+'" data-dt-column="'+a.columnIndex+'"><span class="dtr-title">'+a.title+'</span> <span class="dtr-data">'+a.data+"</span></li>":""}).join(""))?c('<ul data-dtr-index="'+b+'"/>').append(a):!1}},tableAll:function(a){a=c.extend({tableClass:""},a);return function(b,d,e){b=c.map(e,function(a){return'<tr data-dt-row="'+a.rowIndex+'" data-dt-column="'+a.columnIndex+'"><td>'+a.title [...]
+a.data+"</td></tr>"}).join("");return c('<table class="'+a.tableClass+'" width="100%"/>').append(b)}}};j.defaults={breakpoints:j.breakpoints,auto:!0,details:{display:j.display.childRow,renderer:j.renderer.listHidden(),target:0,type:"inline"},orthogonal:"display"};var o=c.fn.dataTable.Api;o.register("responsive()",function(){return this});o.register("responsive.index()",function(a){a=c(a);return{column:a.data("dtr-index"),row:a.parent().data("dtr-index")}});o.register("responsive.rebuild( [...]
+function(a){a._responsive&&a._responsive._classLogic()})});o.register("responsive.recalc()",function(){return this.iterator("table",function(a){a._responsive&&(a._responsive._resizeAuto(),a._responsive._resize())})});o.register("responsive.hasHidden()",function(){var a=this.context[0];return a._responsive?-1!==c.inArray(!1,a._responsive.s.current):!1});j.version="2.1.0";c.fn.dataTable.Responsive=j;c.fn.DataTable.Responsive=j;c(k).on("preInit.dt.dtr",function(a,b){if("dt"===a.namespace&&( [...]
+c(b.nTable).hasClass("dt-responsive")||b.oInit.responsive||m.defaults.responsive)){var d=b.oInit.responsive;!1!==d&&new j(b,c.isPlainObject(d)?d:{})}});return j});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.bootstrap.min.js b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.bootstrap.min.js
new file mode 100644
index 0000000..3761c3c
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+ Bootstrap integration for DataTables' Responsive
+ ©2015-2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-responsive"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs")(a,b).$;b.fn.dataTable.Responsive||require("datatables.net-responsive")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable,b=a.Responsive.display,g=b.modal,d=c('<div cla [...]
+b.modal=function(a){return function(b,e,f){c.fn.modal?e||(a&&a.header&&d.find("div.modal-header").empty().append('<h4 class="modal-title">'+a.header(b)+"</h4>"),d.find("div.modal-body").empty().append(f()),d.appendTo("body").modal()):g(b,e,f)}};return a.Responsive});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.bootstrap4.min.js b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.bootstrap4.min.js
new file mode 100644
index 0000000..6c0c24d
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.bootstrap4.min.js
@@ -0,0 +1,6 @@
+/*!
+ Bootstrap 4 integration for DataTables' Responsive
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs4","datatables.net-responsive"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs4")(a,b).$;b.fn.dataTable.Responsive||require("datatables.net-responsive")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable,b=a.Responsive.display,g=b.modal,d=c('<div c [...]
+b.modal=function(a){return function(b,e,f){c.fn.modal?e||(a&&a.header&&d.find("div.modal-header").empty().append('<h4 class="modal-title">'+a.header(b)+"</h4>"),d.find("div.modal-body").empty().append(f()),d.appendTo("body").modal()):g(b,e,f)}};return a.Responsive});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.foundation.min.js b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.foundation.min.js
new file mode 100644
index 0000000..e48fea2
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.foundation.min.js
@@ -0,0 +1,6 @@
+/*!
+ Foundation integration for DataTables' Responsive
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-zf","datatables.net-responsive"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-zf")(a,b).$;b.fn.dataTable.Responsive||require("datatables.net-responsive")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable,b=a.Responsive.display,f=b.modal;b.modal=funct [...]
+d,e){c.fn.foundation?d||c('<div class="reveal-modal" data-reveal/>').append('<a class="close-reveal-modal" aria-label="Close">×</a>').append(a&&a.header?"<h4>"+a.header(b)+"</h4>":null).append(e()).appendTo("body").foundation("reveal","open"):f(b,d,e)}};return a.Responsive});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.jqueryui.min.js b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.jqueryui.min.js
new file mode 100644
index 0000000..e8f98dd
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.jqueryui.min.js
@@ -0,0 +1,6 @@
+/*!
+ jQuery UI integration for DataTables' Responsive
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-jqui","datatables.net-responsive"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-jqui")(a,b).$;b.fn.dataTable.Responsive||require("datatables.net-responsive")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable,b=a.Responsive.display,f=b.modal;b.modal=f [...]
+d,e){c.fn.dialog?d||c("<div/>").append(e()).appendTo("body").dialog(c.extend(!0,{title:a&&a.header?a.header(b):"",width:500},a.dialog)):f(b,d,e)}};return a.Responsive});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.semanticui.min.js b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.semanticui.min.js
new file mode 100644
index 0000000..42978b1
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Responsive/js/responsive.semanticui.min.js
@@ -0,0 +1,6 @@
+/*!
+ Bootstrap integration for DataTables' Responsive
+ ©2015-2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-se","datatables.net-responsive"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-se")(a,b).$;b.fn.dataTable.Responsive||require("datatables.net-responsive")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable,b=a.Responsive.display,g=b.modal,d=c('<div cla [...]
+b.modal=function(a){return function(b,e,f){c.fn.modal?e||(a&&a.header&&d.find("div.header").empty().append('<h4 class="title">'+a.header(b)+"</h4>"),d.find("div.content").empty().append(f()),d.appendTo("body").modal("show")):g(b,e,f)}};return a.Responsive});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.bootstrap.min.css
new file mode 100644
index 0000000..f68eb4a
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.bootstrap.min.css
@@ -0,0 +1 @@
+table.dt-rowReorder-float{position:absolute !important;opacity:0.8;table-layout:fixed;outline:2px solid #337ab7;outline-offset:-2px;z-index:2001}tr.dt-rowReorder-moving{outline:2px solid #888;outline-offset:-2px}body.dt-rowReorder-noOverflow{overflow-x:hidden}table.dataTable td.reorder{text-align:center;cursor:move}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.bootstrap4.min.css
new file mode 100644
index 0000000..01e223b
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.bootstrap4.min.css
@@ -0,0 +1 @@
+table.dt-rowReorder-float{position:absolute !important;opacity:0.8;table-layout:fixed;outline:2px solid #0275d8;outline-offset:-2px;z-index:2001}tr.dt-rowReorder-moving{outline:2px solid #888;outline-offset:-2px}body.dt-rowReorder-noOverflow{overflow-x:hidden}table.dataTable td.reorder{text-align:center;cursor:move}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.dataTables.min.css
new file mode 100644
index 0000000..81d2833
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.dataTables.min.css
@@ -0,0 +1 @@
+table.dt-rowReorder-float{position:absolute !important;opacity:0.8;table-layout:fixed;outline:2px solid #888;outline-offset:-2px;z-index:2001}tr.dt-rowReorder-moving{outline:2px solid #555;outline-offset:-2px}body.dt-rowReorder-noOverflow{overflow-x:hidden}table.dataTable td.reorder{text-align:center;cursor:move}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.foundation.min.css
new file mode 100644
index 0000000..f68eb4a
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.foundation.min.css
@@ -0,0 +1 @@
+table.dt-rowReorder-float{position:absolute !important;opacity:0.8;table-layout:fixed;outline:2px solid #337ab7;outline-offset:-2px;z-index:2001}tr.dt-rowReorder-moving{outline:2px solid #888;outline-offset:-2px}body.dt-rowReorder-noOverflow{overflow-x:hidden}table.dataTable td.reorder{text-align:center;cursor:move}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.jqueryui.min.css
new file mode 100644
index 0000000..81d2833
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.jqueryui.min.css
@@ -0,0 +1 @@
+table.dt-rowReorder-float{position:absolute !important;opacity:0.8;table-layout:fixed;outline:2px solid #888;outline-offset:-2px;z-index:2001}tr.dt-rowReorder-moving{outline:2px solid #555;outline-offset:-2px}body.dt-rowReorder-noOverflow{overflow-x:hidden}table.dataTable td.reorder{text-align:center;cursor:move}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.semanticui.min.css
new file mode 100644
index 0000000..fba9be4
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/css/rowReorder.semanticui.min.css
@@ -0,0 +1 @@
+table.dt-rowReorder-float{position:absolute !important;opacity:0.8;table-layout:fixed;outline:2px solid rgba(0,0,0,0.05);outline-offset:-2px;z-index:2001}tr.dt-rowReorder-moving{outline:2px solid #888;outline-offset:-2px}body.dt-rowReorder-noOverflow{overflow-x:hidden}table.dataTable td.reorder{text-align:center;cursor:move}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/RowReorder/js/dataTables.rowReorder.min.js b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/js/dataTables.rowReorder.min.js
new file mode 100644
index 0000000..7f8c2fd
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/RowReorder/js/dataTables.rowReorder.min.js
@@ -0,0 +1,16 @@
+/*!
+ RowReorder 1.1.2
+ 2015-2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(e){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(f){return e(f,window,document)}):"object"===typeof exports?module.exports=function(f,g){f||(f=window);if(!g||!g.fn.dataTable)g=require("datatables.net")(f,g).$;return e(g,f,f.document)}:e(jQuery,window,document)})(function(e,f,g){var j=e.fn.dataTable,i=function(b,a){if(!j.versionCheck||!j.versionCheck("1.10.8"))throw"DataTables RowReorder requires DataTables 1.10.8 or newer";this.c=e.extend(!0 [...]
+i.defaults,a);this.s={bodyTop:null,dt:new j.Api(b),getDataFn:j.ext.oApi._fnGetObjectDataFn(this.c.dataSrc),middles:null,scroll:{},scrollInterval:null,setDataFn:j.ext.oApi._fnSetObjectDataFn(this.c.dataSrc),start:{top:0,left:0,offsetTop:0,offsetLeft:0,nodes:[]},windowHeight:0};this.dom={clone:null,dtScroll:e("div.dataTables_scrollBody",this.s.dt.table().container())};var c=this.s.dt.settings()[0],d=c.rowreorder;if(d)return d;c.rowreorder=this;this._constructor()};e.extend(i.prototype,{_co [...]
+this,a=this.s.dt,c=e(a.table().node());"static"===c.css("position")&&c.css("position","relative");e(a.table().container()).on("mousedown.rowReorder touchstart.rowReorder",this.c.selector,function(d){var c=e(this).closest("tr");if(a.row(c).any())return b._mouseDown(d,c),!1});a.on("destroy.rowReorder",function(){e(a.table().container()).off(".rowReorder");a.off(".rowReorder")})},_cachePositions:function(){var b=this.s.dt,a=e(b.table().node()).find("thead").outerHeight(),c=e.unique(b.rows({ [...]
+d=e.map(c,function(b){return e(b).position().top-a}),c=e.map(d,function(a,c){return d.length<c-1?(a+d[c+1])/2:(a+a+e(b.row(":last-child").node()).outerHeight())/2});this.s.middles=c;this.s.bodyTop=e(b.table().body()).offset().top;this.s.windowHeight=e(f).height()},_clone:function(b){var a=e(this.s.dt.table().node().cloneNode(!1)).addClass("dt-rowReorder-float").append("<tbody/>").append(b.clone(!1)),c=b.outerWidth(),d=b.outerHeight(),h=b.children().map(function(){return e(this).width()}) [...]
+h[a]+"px"});a.appendTo("body");this.dom.clone=a},_clonePosition:function(b){var a=this.s.start,c=this._eventToPage(b,"Y")-a.top,b=this._eventToPage(b,"X")-a.left,d=this.c.snapX;this.dom.clone.css({top:c+a.offsetTop,left:!0===d?a.offsetLeft:"number"===typeof d?a.offsetLeft+d:b+a.offsetLeft})},_emitEvent:function(b,a){this.s.dt.iterator("table",function(c){e(c.nTable).triggerHandler(b+".dt",a)})},_eventToPage:function(b,a){return-1!==b.type.indexOf("touch")?b.originalEvent.touches[0]["page [...]
+a]},_mouseDown:function(b,a){var c=this,d=this.s.dt,h=this.s.start,k=a.offset();h.top=this._eventToPage(b,"Y");h.left=this._eventToPage(b,"X");h.offsetTop=k.top;h.offsetLeft=k.left;h.nodes=e.unique(d.rows({page:"current"}).nodes().toArray());this._cachePositions();this._clone(a);this._clonePosition(b);this.dom.target=a;a.addClass("dt-rowReorder-moving");e(g).on("mouseup.rowReorder touchend.rowReorder",function(a){c._mouseUp(a)}).on("mousemove.rowReorder touchmove.rowReorder",function(a){ [...]
+e(f).width()===e(g).width()&&e(g.body).addClass("dt-rowReorder-noOverflow");d=this.dom.dtScroll;this.s.scroll={windowHeight:e(f).height(),windowWidth:e(f).width(),dtTop:d.length?d.offset().top:null,dtLeft:d.length?d.offset().left:null,dtHeight:d.length?d.outerHeight():null,dtWidth:d.length?d.outerWidth():null}},_mouseMove:function(b){this._clonePosition(b);for(var a=this._eventToPage(b,"Y")-this.s.bodyTop,c=this.s.middles,d=null,h=this.s.dt,k=h.table().body(),g=0,f=c.length;g<f;g++)if(a< [...]
+break}null===d&&(d=c.length);if(null===this.s.lastInsert||this.s.lastInsert!==d)0===d?this.dom.target.prependTo(k):(a=e.unique(h.rows({page:"current"}).nodes().toArray()),d>this.s.lastInsert?this.dom.target.insertAfter(a[d-1]):this.dom.target.insertBefore(a[d])),this._cachePositions(),this.s.lastInsert=d;this._shiftScroll(b)},_mouseUp:function(){var b=this.s.dt,a,c,d=this.c.dataSrc;this.dom.clone.remove();this.dom.clone=null;this.dom.target.removeClass("dt-rowReorder-moving");e(g).off(". [...]
+e(g.body).removeClass("dt-rowReorder-noOverflow");clearInterval(this.s.scrollInterval);this.s.scrollInterval=null;var h=this.s.start.nodes,k=e.unique(b.rows({page:"current"}).nodes().toArray()),f={},l=[],i=[],j=this.s.getDataFn,o=this.s.setDataFn;a=0;for(c=h.length;a<c;a++)if(h[a]!==k[a]){var m=b.row(k[a]).id(),p=b.row(k[a]).data(),n=b.row(h[a]).data();m&&(f[m]=j(n));l.push({node:k[a],oldData:j(p),newData:j(n),newPosition:a,oldPosition:e.inArray(k[a],h)});i.push(k[a])}h=[l,{dataSrc:d,nod [...]
+triggerRow:b.row(this.dom.target)}];this._emitEvent("row-reorder",h);this.c.editor&&this.c.editor.edit(i,!1,{submit:"changed"}).multiSet(d,f).submit();if(this.c.update){a=0;for(c=l.length;a<c;a++)f=b.row(l[a].node).data(),o(f,l[a].newData),b.columns().every(function(){this.dataSrc()===d&&b.cell(l[a].node,this.index()).invalidate("data")});this._emitEvent("row-reordered",h);b.draw(!1)}},_shiftScroll:function(b){var a=this,c=this.s.scroll,d=!1,e=b.pageY-g.body.scrollTop,f,i;65>e?f=-5:e>c.w [...]
+65&&(f=5);null!==c.dtTop&&b.pageY<c.dtTop+65?i=-5:null!==c.dtTop&&b.pageY>c.dtTop+c.dtHeight-65&&(i=5);f||i?(c.windowVert=f,c.dtVert=i,d=!0):this.s.scrollInterval&&(clearInterval(this.s.scrollInterval),this.s.scrollInterval=null);!this.s.scrollInterval&&d&&(this.s.scrollInterval=setInterval(function(){if(c.windowVert)g.body.scrollTop=g.body.scrollTop+c.windowVert;if(c.dtVert){var b=a.dom.dtScroll[0];if(c.dtVert)b.scrollTop=b.scrollTop+c.dtVert}},20))}});i.defaults={dataSrc:0,editor:null, [...]
+snapX:!1,update:!0};i.version="1.1.2";e.fn.dataTable.RowReorder=i;e.fn.DataTable.RowReorder=i;e(g).on("init.dt.dtr",function(b,a){if("dt"===b.namespace){var c=a.oInit.rowReorder,d=j.defaults.rowReorder;if(c||d)d=e.extend({},c,d),!1!==c&&new i(a,d)}});return i});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.bootstrap.min.css
new file mode 100644
index 0000000..dceb355
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.bootstrap.min.css
@@ -0,0 +1 @@
+div.DTS{display:block !important}div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS div.DTS_Loading{z-index:1}div.DTS div.dataTables_scrollBody{background:repeating-linear-gradient(45deg, #edeeff, #edeeff 10px, #fff 10px, #fff 20px)}div.DTS div.dataTables_scrollBody table{z-index:2}div.DTS div.dataTables_paginate,div.DTS div.dataTables_length{display:none}div.DTS tbody tr.even{background-color:white}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.bootstrap4.min.css
new file mode 100644
index 0000000..dceb355
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.bootstrap4.min.css
@@ -0,0 +1 @@
+div.DTS{display:block !important}div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS div.DTS_Loading{z-index:1}div.DTS div.dataTables_scrollBody{background:repeating-linear-gradient(45deg, #edeeff, #edeeff 10px, #fff 10px, #fff 20px)}div.DTS div.dataTables_scrollBody table{z-index:2}div.DTS div.dataTables_paginate,div.DTS div.dataTables_length{display:none}div.DTS tbody tr.even{background-color:white}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.dataTables.min.css
new file mode 100644
index 0000000..4707c70
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.dataTables.min.css
@@ -0,0 +1 @@
+div.DTS{display:block !important}div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS div.DTS_Loading{z-index:1}div.DTS div.dataTables_scrollBody{background:repeating-linear-gradient(45deg, #edeeff, #edeeff 10px, #fff 10px, #fff 20px)}div.DTS div.dataTables_scrollBody table{z-index:2}div.DTS div.dataTables_paginate,div.DTS div.dataTables_length{display:none}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.foundation.min.css
new file mode 100644
index 0000000..1058d64
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.foundation.min.css
@@ -0,0 +1 @@
+div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS div.DTS_Loading{z-index:1}div.DTS div.dataTables_scrollBody{background:repeating-linear-gradient(45deg, #edeeff, #edeeff 10px, #fff 10px, #fff 20px)}div.DTS div.dataTables_scrollBody table{z-index:2}div.DTS div.dataTables_paginate,div.DTS div.dataTables_length{display:none}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.jqueryui.min.css
new file mode 100644
index 0000000..4707c70
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.jqueryui.min.css
@@ -0,0 +1 @@
+div.DTS{display:block !important}div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS div.DTS_Loading{z-index:1}div.DTS div.dataTables_scrollBody{background:repeating-linear-gradient(45deg, #edeeff, #edeeff 10px, #fff 10px, #fff 20px)}div.DTS div.dataTables_scrollBody table{z-index:2}div.DTS div.dataTables_paginate,div.DTS div.dataTables_length{display:none}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.semanticui.min.css
new file mode 100644
index 0000000..4707c70
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Scroller/css/scroller.semanticui.min.css
@@ -0,0 +1 @@
+div.DTS{display:block !important}div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS div.DTS_Loading{z-index:1}div.DTS div.dataTables_scrollBody{background:repeating-linear-gradient(45deg, #edeeff, #edeeff 10px, #fff 10px, #fff 20px)}div.DTS div.dataTables_scrollBody table{z-index:2}div.DTS div.dataTables_paginate,div.DTS div.dataTables_length{display:none}
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Scroller/js/dataTables.scroller.min.js b/inst/htmlwidgets/lib/datatables-extensions/Scroller/js/dataTables.scroller.min.js
new file mode 100644
index 0000000..8326ab2
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Scroller/js/dataTables.scroller.min.js
@@ -0,0 +1,27 @@
+/*!
+ Scroller 1.4.2
+ ©2011-2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(e){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(h){return e(h,window,document)}):"object"===typeof exports?module.exports=function(h,j){h||(h=window);if(!j||!j.fn.dataTable)j=require("datatables.net")(h,j).$;return e(j,h,h.document)}:e(jQuery,window,document)})(function(e,h,j,l){var m=e.fn.dataTable,g=function(a,b){this instanceof g?(b===l&&(b={}),this.s={dt:e.fn.dataTable.Api(a).settings()[0],tableTop:0,tableBottom:0,redrawTop:0,redrawBott [...]
+viewportRows:0,stateTO:null,drawTO:null,heights:{jump:null,page:null,virtual:null,scroll:null,row:null,viewport:null},topRowFloat:0,scrollDrawDiff:null,loaderVisible:!1},this.s=e.extend(this.s,g.oDefaults,b),this.s.heights.row=this.s.rowHeight,this.dom={force:j.createElement("div"),scroller:null,table:null,loader:null},this.s.dt.oScroller||(this.s.dt.oScroller=this,this._fnConstruct())):alert("Scroller warning: Scroller must be initialised with the 'new' keyword.")};e.extend(g.prototype, [...]
+b,c){a=c?this._domain("virtualToPhysical",a*this.s.heights.row):this.s.baseScrollTop+(a-this.s.baseRowTop)*this.s.heights.row;return b||b===l?parseInt(a,10):a},fnPixelsToRow:function(a,b,c){var d=a-this.s.baseScrollTop,a=c?this._domain("physicalToVirtual",a)/this.s.heights.row:d/this.s.heights.row+this.s.baseRowTop;return b||b===l?parseInt(a,10):a},fnScrollToRow:function(a,b){var c=this,d=!1,f=this.fnRowToPixels(a),i=a-(this.s.displayBuffer-1)/2*this.s.viewportRows;0>i&&(i=0);if((f>this. [...]
+f<this.s.redrawTop)&&this.s.dt._iDisplayStart!==i)d=!0,f=this.fnRowToPixels(a,!1,!0);"undefined"==typeof b||b?(this.s.ani=d,e(this.dom.scroller).animate({scrollTop:f},function(){setTimeout(function(){c.s.ani=!1},25)})):e(this.dom.scroller).scrollTop(f)},fnMeasure:function(a){this.s.autoHeight&&this._fnCalcRowHeight();var b=this.s.heights;b.row&&(b.viewport=e(this.dom.scroller).height(),this.s.viewportRows=parseInt(b.viewport/b.row,10)+1,this.s.dt._iDisplayLength=this.s.viewportRows*this. [...]
+(a===l||a)&&this.s.dt.oInstance.fnDraw(!1)},fnPageInfo:function(){var a=this.dom.scroller.scrollTop,b=this.s.dt.fnRecordsDisplay(),c=Math.ceil(this.fnPixelsToRow(a+this.s.heights.viewport,!1,this.s.ani));return{start:Math.floor(this.fnPixelsToRow(a,!1,this.s.ani)),end:b<c?b-1:c-1}},_fnConstruct:function(){var a=this;if(this.s.dt.oFeatures.bPaginate){this.dom.force.style.position="relative";this.dom.force.style.top="0px";this.dom.force.style.left="0px";this.dom.force.style.width="1px";thi [...]
+e("div."+this.s.dt.oClasses.sScrollBody,this.s.dt.nTableWrapper)[0];this.dom.scroller.appendChild(this.dom.force);this.dom.scroller.style.position="relative";this.dom.table=e(">table",this.dom.scroller)[0];this.dom.table.style.position="absolute";this.dom.table.style.top="0px";this.dom.table.style.left="0px";e(this.s.dt.nTableWrapper).addClass("DTS");this.s.loadingIndicator&&(this.dom.loader=e('<div class="dataTables_processing DTS_Loading">'+this.s.dt.oLanguage.sLoadingRecords+"</div>") [...]
+"none"),e(this.dom.scroller.parentNode).css("position","relative").append(this.dom.loader));this.s.heights.row&&"auto"!=this.s.heights.row&&(this.s.autoHeight=!1);this.fnMeasure(!1);this.s.ingnoreScroll=!0;this.s.stateSaveThrottle=this.s.dt.oApi._fnThrottle(function(){a.s.dt.oApi._fnSaveState(a.s.dt)},500);e(this.dom.scroller).on("scroll.DTS",function(){a._fnScroll.call(a)});e(this.dom.scroller).on("touchstart.DTS",function(){a._fnScroll.call(a)});this.s.dt.aoDrawCallback.push({fn:functi [...]
+a._fnDrawCallback.call(a)},sName:"Scroller"});e(h).on("resize.DTS",function(){a.fnMeasure(false);a._fnInfo()});var b=!0;this.s.dt.oApi._fnCallbackReg(this.s.dt,"aoStateSaveParams",function(c,d){if(b&&a.s.dt.oLoadedState){d.iScroller=a.s.dt.oLoadedState.iScroller;d.iScrollerTopRow=a.s.dt.oLoadedState.iScrollerTopRow;b=false}else{d.iScroller=a.dom.scroller.scrollTop;d.iScrollerTopRow=a.s.topRowFloat}},"Scroller_State");this.s.dt.oLoadedState&&(this.s.topRowFloat=this.s.dt.oLoadedState.iScr [...]
+0);e(this.s.dt.nTable).one("init.dt",function(){a.fnMeasure()});this.s.dt.aoDestroyCallback.push({sName:"Scroller",fn:function(){e(h).off("resize.DTS");e(a.dom.scroller).off("touchstart.DTS scroll.DTS");e(a.s.dt.nTableWrapper).removeClass("DTS");e("div.DTS_Loading",a.dom.scroller.parentNode).remove();e(a.s.dt.nTable).off("init.dt");a.dom.table.style.position="";a.dom.table.style.top="";a.dom.table.style.left=""}})}else this.s.dt.oApi._fnLog(this.s.dt,0,"Pagination must be enabled for Scr [...]
+_fnScroll:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d;if(!this.s.skip&&!this.s.ingnoreScroll)if(this.s.dt.bFiltered||this.s.dt.bSorted)this.s.lastScrollTop=0;else{this._fnInfo();clearTimeout(this.s.stateTO);this.s.stateTO=setTimeout(function(){a.s.dt.oApi._fnSaveState(a.s.dt)},250);if(c<this.s.redrawTop||c>this.s.redrawBottom){var f=Math.ceil((this.s.displayBuffer-1)/2*this.s.viewportRows);Math.abs(c-this.s.lastScrollTop)>b.viewport||this.s.ani?(d=parseInt(this [...]
+c)/b.row,10)-f,this.s.topRowFloat=this._domain("physicalToVirtual",c)/b.row):(d=this.fnPixelsToRow(c)-f,this.s.topRowFloat=this.fnPixelsToRow(c,!1));0>=d?d=0:d+this.s.dt._iDisplayLength>this.s.dt.fnRecordsDisplay()?(d=this.s.dt.fnRecordsDisplay()-this.s.dt._iDisplayLength,0>d&&(d=0)):0!==d%2&&d++;if(d!=this.s.dt._iDisplayStart&&(this.s.tableTop=e(this.s.dt.nTable).offset().top,this.s.tableBottom=e(this.s.dt.nTable).height()+this.s.tableTop,b=function(){if(a.s.scrollDrawReq===null)a.s.scr [...]
+c;a.s.dt._iDisplayStart=d;a.s.dt.oApi._fnDraw(a.s.dt)},this.s.dt.oFeatures.bServerSide?(clearTimeout(this.s.drawTO),this.s.drawTO=setTimeout(b,this.s.serverWait)):b(),this.dom.loader&&!this.s.loaderVisible))this.dom.loader.css("display","block"),this.s.loaderVisible=!0}else this.s.topRowFloat=this._domain("physicalToVirtual",c)/b.row;this.s.lastScrollTop=c;this.s.stateSaveThrottle()}},_domain:function(a,b){var c=this.s.heights,d;if(c.virtual===c.scroll)return b;var e=(c.scroll-c.viewport [...]
+c.viewport)/2;d=i/(e*e);if("virtualToPhysical"===a){if(b<i)return Math.pow(b/d,0.5);b=2*i-b;return 0>b?c.scroll:2*e-Math.pow(b/d,0.5)}if("physicalToVirtual"===a){if(b<e)return b*b*d;b=2*e-b;return 0>b?c.virtual:2*i-b*b*d}},_fnDrawCallback:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d=e(this.s.dt.nTable).height(),f=this.s.dt._iDisplayStart,i=this.s.dt._iDisplayLength,g=this.s.dt.fnRecordsDisplay();this.s.skip=!0;this._fnScrollForce();c=0===f?this.s.topRowFloat*b.r [...]
+b.scroll-(g-this.s.topRowFloat)*b.row:this._domain("virtualToPhysical",this.s.topRowFloat*b.row);this.dom.scroller.scrollTop=c;this.s.baseScrollTop=c;this.s.baseRowTop=this.s.topRowFloat;var h=c-(this.s.topRowFloat-f)*b.row;0===f?h=0:f+i>=g&&(h=b.scroll-d);this.dom.table.style.top=h+"px";this.s.tableTop=h;this.s.tableBottom=d+this.s.tableTop;d=(c-this.s.tableTop)*this.s.boundaryScale;this.s.redrawTop=c-d;this.s.redrawBottom=c+d;this.s.skip=!1;this.s.dt.oFeatures.bStateSave&&null!==this.s [...]
+"undefined"!=typeof this.s.dt.oLoadedState.iScroller?((c=(this.s.dt.sAjaxSource||a.s.dt.ajax)&&!this.s.dt.oFeatures.bServerSide?!0:!1)&&2==this.s.dt.iDraw||!c&&1==this.s.dt.iDraw)&&setTimeout(function(){e(a.dom.scroller).scrollTop(a.s.dt.oLoadedState.iScroller);a.s.redrawTop=a.s.dt.oLoadedState.iScroller-b.viewport/2;setTimeout(function(){a.s.ingnoreScroll=!1},0)},0):a.s.ingnoreScroll=!1;this.s.dt.oFeatures.bInfo&&setTimeout(function(){a._fnInfo.call(a)},0);this.dom.loader&&this.s.loader [...]
+(this.dom.loader.css("display","none"),this.s.loaderVisible=!1)},_fnScrollForce:function(){var a=this.s.heights;a.virtual=a.row*this.s.dt.fnRecordsDisplay();a.scroll=a.virtual;1E6<a.scroll&&(a.scroll=1E6);this.dom.force.style.height=a.scroll>this.s.heights.row?a.scroll+"px":this.s.heights.row+"px"},_fnCalcRowHeight:function(){var a=this.s.dt,b=a.nTable,c=b.cloneNode(!1),d=e("<tbody/>").appendTo(c),f=e('<div class="'+a.oClasses.sWrapper+' DTS"><div class="'+a.oClasses.sScrollWrapper+'"><d [...]
+a.oClasses.sScrollBody+'"></div></div></div>');for(e("tbody tr:lt(4)",b).clone().appendTo(d);3>e("tr",d).length;)d.append("<tr><td> </td></tr>");e("div."+a.oClasses.sScrollBody,f).append(c);a=this.s.dt.nHolding||b.parentNode;e(a).is(":visible")||(a="body");f.appendTo(a);this.s.heights.row=e("tr",d).eq(1).outerHeight();f.remove()},_fnInfo:function(){if(this.s.dt.oFeatures.bInfo){var a=this.s.dt,b=a.oLanguage,c=this.dom.scroller.scrollTop,d=Math.floor(this.fnPixelsToRow(c,!1,this.s.an [...]
+i=a.fnRecordsDisplay(),c=Math.ceil(this.fnPixelsToRow(c+this.s.heights.viewport,!1,this.s.ani)),c=i<c?i:c,g=a.fnFormatNumber(d),h=a.fnFormatNumber(c),j=a.fnFormatNumber(f),k=a.fnFormatNumber(i),g=0===a.fnRecordsDisplay()&&a.fnRecordsDisplay()==a.fnRecordsTotal()?b.sInfoEmpty+b.sInfoPostFix:0===a.fnRecordsDisplay()?b.sInfoEmpty+" "+b.sInfoFiltered.replace("_MAX_",j)+b.sInfoPostFix:a.fnRecordsDisplay()==a.fnRecordsTotal()?b.sInfo.replace("_START_",g).replace("_END_",h).replace("_MAX_",j).r [...]
+k)+b.sInfoPostFix:b.sInfo.replace("_START_",g).replace("_END_",h).replace("_MAX_",j).replace("_TOTAL_",k)+" "+b.sInfoFiltered.replace("_MAX_",a.fnFormatNumber(a.fnRecordsTotal()))+b.sInfoPostFix;(b=b.fnInfoCallback)&&(g=b.call(a.oInstance,a,d,c,f,i,g));d=a.aanFeatures.i;if("undefined"!=typeof d){f=0;for(i=d.length;f<i;f++)e(d[f]).html(g)}e(a.nTable).triggerHandler("info.dt")}}});g.defaults={trace:!1,rowHeight:"auto",serverWait:200,displayBuffer:9,boundaryScale:0.5,loadingIndicator:!1};g. [...]
+g.defaults;g.version="1.4.2";"function"==typeof e.fn.dataTable&&"function"==typeof e.fn.dataTableExt.fnVersionCheck&&e.fn.dataTableExt.fnVersionCheck("1.10.0")?e.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInit;new g(a,b.scroller||b.oScroller||{})},cFeature:"S",sFeature:"Scroller"}):alert("Warning: Scroller requires DataTables 1.10.0 or greater - www.datatables.net/download");e(j).on("preInit.dt.dtscroller",function(a,b){if("dt"===a.namespace){var c=b.oInit.scroller,d=m. [...]
+if(c||d)d=e.extend({},c,d),!1!==c&&new g(b,d)}});e.fn.dataTable.Scroller=g;e.fn.DataTable.Scroller=g;var k=e.fn.dataTable.Api;k.register("scroller()",function(){return this});k.register("scroller().rowToPixels()",function(a,b,c){var d=this.context;if(d.length&&d[0].oScroller)return d[0].oScroller.fnRowToPixels(a,b,c)});k.register("scroller().pixelsToRow()",function(a,b,c){var d=this.context;if(d.length&&d[0].oScroller)return d[0].oScroller.fnPixelsToRow(a,b,c)});k.register("scroller().sc [...]
+function(a,b){this.iterator("table",function(c){c.oScroller&&c.oScroller.fnScrollToRow(a,b)});return this});k.register("row().scrollTo()",function(a){var b=this;this.iterator("row",function(c,d){if(c.oScroller){var e=b.rows({order:"applied",search:"applied"}).indexes().indexOf(d);c.oScroller.fnScrollToRow(e,a)}});return this});k.register("scroller.measure()",function(a){this.iterator("table",function(b){b.oScroller&&b.oScroller.fnMeasure(a)});return this});k.register("scroller.page()",fu [...]
+this.context;if(a.length&&a[0].oScroller)return a[0].oScroller.fnPageInfo()});return g});
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.bootstrap.min.css b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.bootstrap.min.css
new file mode 100644
index 0000000..65243f8
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.bootstrap.min.css
@@ -0,0 +1 @@
+table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#08C}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#0085c7}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{ba [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.bootstrap4.min.css
new file mode 100644
index 0000000..8c6b2fd
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.bootstrap4.min.css
@@ -0,0 +1 @@
+table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#0275d8}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#0272d3}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.dataTables.min.css b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.dataTables.min.css
new file mode 100644
index 0000000..59d808a
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#B0BED9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.foundation.min.css b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.foundation.min.css
new file mode 100644
index 0000000..3bf1aa3
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.foundation.min.css
@@ -0,0 +1 @@
+table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#008cba}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#0089b6}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.jqueryui.min.css b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.jqueryui.min.css
new file mode 100644
index 0000000..59d808a
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.jqueryui.min.css
@@ -0,0 +1 @@
+table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#B0BED9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.semanticui.min.css b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.semanticui.min.css
new file mode 100644
index 0000000..4b46710
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Select/css/select.semanticui.min.css
@@ -0,0 +1 @@
+table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:rgba(0,0,0,0.05)}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:rgba(0,0,0,0.07233)}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbo [...]
diff --git a/inst/htmlwidgets/lib/datatables-extensions/Select/js/dataTables.select.min.js b/inst/htmlwidgets/lib/datatables-extensions/Select/js/dataTables.select.min.js
new file mode 100644
index 0000000..898eeb9
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-extensions/Select/js/dataTables.select.min.js
@@ -0,0 +1,26 @@
+/*!
+ Select for DataTables 1.2.0
+ 2015-2016 SpryMedia Ltd - datatables.net/license/mit
+*/
+(function(e){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(i){return e(i,window,document)}):"object"===typeof exports?module.exports=function(i,l){i||(i=window);if(!l||!l.fn.dataTable)l=require("datatables.net")(i,l).$;return e(l,i,i.document)}:e(jQuery,window,document)})(function(e,i,l,h){function t(b,a,c){var d;d=function(c,a){if(c>a)var d=a,a=c,c=d;var f=!1;return b.columns(":visible").indexes().filter(function(b){b===c&&(f=!0);return b===a?(f=!1,! [...]
+function(c,a){var d=b.rows({search:"applied"}).indexes();if(d.indexOf(c)>d.indexOf(a))var f=a,a=c,c=f;var e=!1;return d.filter(function(b){b===c&&(e=!0);return b===a?(e=!1,!0):e})};!b.cells({selected:!0}).any()&&!c?(d=d(0,a.column),c=f(0,a.row)):(d=d(c.column,a.column),c=f(c.row,a.row));c=b.cells(c,d).flatten();b.cells(a,{selected:!0}).any()?b.cells(c).deselect():b.cells(c).select()}function r(b){var a=b.settings()[0]._select.selector;e(b.table().body()).off("mousedown.dtSelect",a).off(" [...]
+a).off("click.dtSelect",a);e("body").off("click.dtSelect")}function v(b){var a=e(b.table().body()),c=b.settings()[0],d=c._select.selector;a.on("mousedown.dtSelect",d,function(c){if(c.shiftKey||c.metaKey||c.ctrlKey)a.css("-moz-user-select","none").one("selectstart.dtSelect",d,function(){return!1})}).on("mouseup.dtSelect",d,function(){a.css("-moz-user-select","")}).on("click.dtSelect",d,function(c){var a=b.select.items();if(!i.getSelection||!i.getSelection().toString()){var d=b.settings()[ [...]
+b.table().container()){var g=b.cell(e(c.target).closest("td, th"));if(g.any()){var h=e.Event("user-select.dt");k(b,h,[a,g,c]);h.isDefaultPrevented()||(h=g.index(),"row"===a?(a=h.row,s(c,b,d,"row",a)):"column"===a?(a=g.index().column,s(c,b,d,"column",a)):"cell"===a&&(a=g.index(),s(c,b,d,"cell",a)),d._select_lastCell=h)}}}});e("body").on("click.dtSelect",function(a){c._select.blurable&&!e(a.target).parents().filter(b.table().container()).length&&(e(a.target).parents("div.DTE").length||p(c, [...]
+a,c,d){if(!d||b.flatten().length)"string"===typeof a&&(a+=".dt"),c.unshift(b),e(b.table().node()).triggerHandler(a,c)}function w(b){var a=b.settings()[0];if(a._select.info&&a.aanFeatures.i){var c=e('<span class="select-info"/>'),d=function(a,d){c.append(e('<span class="select-item"/>').append(b.i18n("select."+a+"s",{_:"%d "+a+"s selected","0":"",1:"1 "+a+" selected"},d)))};d("row",b.rows({selected:!0}).flatten().length);d("column",b.columns({selected:!0}).flatten().length);d("cell",b.cel [...]
+e.each(a.aanFeatures.i,function(a,b){var b=e(b),d=b.children("span.select-info");d.length&&d.remove();""!==c.text()&&b.append(c)})}}function x(b,a,c,d){var f=b[a+"s"]({search:"applied"}).indexes(),d=e.inArray(d,f),m=e.inArray(c,f);if(!b[a+"s"]({selected:!0}).any()&&-1===d)f.splice(e.inArray(c,f)+1,f.length);else{if(d>m)var j=m,m=d,d=j;f.splice(m+1,f.length);f.splice(0,d)}b[a](c,{selected:!0}).any()?(f.splice(e.inArray(c,f),1),b[a+"s"](f).deselect()):b[a+"s"](f).select()}function p(b,a){i [...]
+b._select.style){var c=new g.Api(b);c.rows({selected:!0}).deselect();c.columns({selected:!0}).deselect();c.cells({selected:!0}).deselect()}}function s(b,a,c,d,f){var e=a.select.style(),j=a[d](f,{selected:!0}).any();"os"===e?b.ctrlKey||b.metaKey?a[d](f).select(!j):b.shiftKey?"cell"===d?t(a,f,c._select_lastCell||null):x(a,d,f,c._select_lastCell?c._select_lastCell[d]:null):(b=a[d+"s"]({selected:!0}),j&&1===b.flatten().length?a[d](f).deselect():(b.deselect(),a[d](f).select())):"multi+shift"= [...]
+"cell"===d?t(a,f,c._select_lastCell||null):x(a,d,f,c._select_lastCell?c._select_lastCell[d]:null):a[d](f).select(!j):a[d](f).select(!j)}function q(b,a){return function(c){return c.i18n("buttons."+b,a)}}var g=e.fn.dataTable;g.select={};g.select.version="1.2.0";g.select.init=function(b){var a=b.settings()[0],c=a.oInit.select,d=g.defaults.select,c=c===h?d:c,d="row",f="api",m=!1,j=!0,u="td, th",i="selected";a._select={};if(!0===c)f="os";else if("string"===typeof c)f=c;else if(e.isPlainObject [...]
+h&&(m=c.blurable),c.info!==h&&(j=c.info),c.items!==h&&(d=c.items),c.style!==h&&(f=c.style),c.selector!==h&&(u=c.selector),c.className!==h))i=c.className;b.select.selector(u);b.select.items(d);b.select.style(f);b.select.blurable(m);b.select.info(j);a._select.className=i;e.fn.dataTable.ext.order["select-checkbox"]=function(a,c){return this.api().column(c,{order:"index"}).nodes().map(function(c){return"row"===a._select.items?e(c).parent().hasClass(a._select.className):"cell"===a._select.ite [...]
+!1})};e(b.table().node()).hasClass("selectable")&&b.select.style("os")};e.each([{type:"row",prop:"aoData"},{type:"column",prop:"aoColumns"}],function(b,a){g.ext.selector[a.type].push(function(c,b,f){var b=b.selected,e,j=[];if(b===h)return f;for(var g=0,i=f.length;g<i;g++)e=c[a.prop][f[g]],(!0===b&&!0===e._select_selected||!1===b&&!e._select_selected)&&j.push(f[g]);return j})});g.ext.selector.cell.push(function(b,a,c){var a=a.selected,d,f=[];if(a===h)return c;for(var e=0,g=c.length;e<g;e+ [...]
+(!0===a&&d._selected_cells&&!0===d._selected_cells[c[e].column]||!1===a&&(!d._selected_cells||!d._selected_cells[c[e].column]))&&f.push(c[e]);return f});var n=g.Api.register,o=g.Api.registerPlural;n("select()",function(){return this.iterator("table",function(b){g.select.init(new g.Api(b))})});n("select.blurable()",function(b){return b===h?this.context[0]._select.blurable:this.iterator("table",function(a){a._select.blurable=b})});n("select.info()",function(b){return w===h?this.context[0]. [...]
+this.iterator("table",function(a){a._select.info=b})});n("select.items()",function(b){return b===h?this.context[0]._select.items:this.iterator("table",function(a){a._select.items=b;k(new g.Api(a),"selectItems",[b])})});n("select.style()",function(b){return b===h?this.context[0]._select.style:this.iterator("table",function(a){a._select.style=b;if(!a._select_init){var c=new g.Api(a);a.aoRowCreatedCallback.push({fn:function(c,b,d){b=a.aoData[d];b._select_selected&&e(c).addClass(a._select.cl [...]
+c=0;for(d=a.aoColumns.length;c<d;c++)(a.aoColumns[c]._select_selected||b._selected_cells&&b._selected_cells[c])&&e(b.anCells[c]).addClass(a._select.className)},sName:"select-deferRender"});c.on("preXhr.dt.dtSelect",function(){var a=c.rows({selected:!0}).ids(!0).filter(function(c){return c!==h}),b=c.cells({selected:!0}).eq(0).map(function(a){var b=c.row(a.row).id(!0);return b?{row:b,column:a.column}:h}).filter(function(c){return c!==h});c.one("draw.dt.dtSelect",function(){c.rows(a).select [...]
+b.each(function(a){c.cells(a.row,a.column).select()})})});c.on("draw.dtSelect.dt select.dtSelect.dt deselect.dtSelect.dt info.dt",function(){w(c)});c.on("destroy.dtSelect",function(){r(c);c.off(".dtSelect")})}var d=new g.Api(a);r(d);"api"!==b&&v(d);k(new g.Api(a),"selectStyle",[b])})});n("select.selector()",function(b){return b===h?this.context[0]._select.selector:this.iterator("table",function(a){r(new g.Api(a));a._select.selector=b;"api"!==a._select.style&&v(new g.Api(a))})});o("rows() [...]
+"row().select()",function(b){var a=this;if(!1===b)return this.deselect();this.iterator("row",function(c,a){p(c);c.aoData[a]._select_selected=!0;e(c.aoData[a].nTr).addClass(c._select.className)});this.iterator("table",function(c,b){k(a,"select",["row",a[b]],!0)});return this});o("columns().select()","column().select()",function(b){var a=this;if(!1===b)return this.deselect();this.iterator("column",function(a,b){p(a);a.aoColumns[b]._select_selected=!0;var f=(new g.Api(a)).column(b);e(f.head [...]
+e(f.footer()).addClass(a._select.className);f.nodes().to$().addClass(a._select.className)});this.iterator("table",function(c,b){k(a,"select",["column",a[b]],!0)});return this});o("cells().select()","cell().select()",function(b){var a=this;if(!1===b)return this.deselect();this.iterator("cell",function(a,b,f){p(a);b=a.aoData[b];b._selected_cells===h&&(b._selected_cells=[]);b._selected_cells[f]=!0;b.anCells&&e(b.anCells[f]).addClass(a._select.className)});this.iterator("table",function(b,d) [...]
+["cell",a[d]],!0)});return this});o("rows().deselect()","row().deselect()",function(){var b=this;this.iterator("row",function(a,b){a.aoData[b]._select_selected=!1;e(a.aoData[b].nTr).removeClass(a._select.className)});this.iterator("table",function(a,c){k(b,"deselect",["row",b[c]],!0)});return this});o("columns().deselect()","column().deselect()",function(){var b=this;this.iterator("column",function(a,b){a.aoColumns[b]._select_selected=!1;var d=new g.Api(a),f=d.column(b);e(f.header()).rem [...]
+e(f.footer()).removeClass(a._select.className);d.cells(null,b).indexes().each(function(b){var c=a.aoData[b.row],d=c._selected_cells;c.anCells&&(!d||!d[b.column])&&e(c.anCells[b.column]).removeClass(a._select.className)})});this.iterator("table",function(a,c){k(b,"deselect",["column",b[c]],!0)});return this});o("cells().deselect()","cell().deselect()",function(){var b=this;this.iterator("cell",function(a,b,d){b=a.aoData[b];b._selected_cells[d]=!1;b.anCells&&!a.aoColumns[d]._select_selecte [...]
+this.iterator("table",function(a,c){k(b,"deselect",["cell",b[c]],!0)});return this});e.extend(g.ext.buttons,{selected:{text:q("selected","Selected"),className:"buttons-selected",init:function(b){var a=this;b.on("draw.dt.DT select.dt.DT deselect.dt.DT",function(){var b=a.rows({selected:!0}).any()||a.columns({selected:!0}).any()||a.cells({selected:!0}).any();a.enable(b)});this.disable()}},selectedSingle:{text:q("selectedSingle","Selected single"),className:"buttons-selected-single",init:fu [...]
+this;b.on("draw.dt.DT select.dt.DT deselect.dt.DT",function(){var c=b.rows({selected:!0}).flatten().length+b.columns({selected:!0}).flatten().length+b.cells({selected:!0}).flatten().length;a.enable(1===c)});this.disable()}},selectAll:{text:q("selectAll","Select all"),className:"buttons-select-all",action:function(){this[this.select.items()+"s"]().select()}},selectNone:{text:q("selectNone","Deselect all"),className:"buttons-select-none",action:function(){p(this.settings()[0],!0)},init:fun [...]
+this;b.on("draw.dt.DT select.dt.DT deselect.dt.DT",function(){var c=b.rows({selected:!0}).flatten().length+b.columns({selected:!0}).flatten().length+b.cells({selected:!0}).flatten().length;a.enable(0<c)});this.disable()}}});e.each(["Row","Column","Cell"],function(b,a){var c=a.toLowerCase();g.ext.buttons["select"+a+"s"]={text:q("select"+a+"s","Select "+c+"s"),className:"buttons-select-"+c+"s",action:function(){this.select.items(c)},init:function(a){var b=this;a.on("selectItems.dt.DT",func [...]
+e){b.active(e===c)})}}});e(l).on("preInit.dt.dtSelect",function(b,a){"dt"===b.namespace&&g.select.init(new g.Api(a))});return g.select});
diff --git a/inst/htmlwidgets/lib/datatables-plugins/natural/natural.js b/inst/htmlwidgets/lib/datatables-plugins/natural/natural.js
new file mode 100644
index 0000000..6a89380
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-plugins/natural/natural.js
@@ -0,0 +1,114 @@
+/**
+ * Data can often be a complicated mix of numbers and letters (file names
+ * are a common example) and sorting them in a natural manner is quite a
+ * difficult problem.
+ * 
+ * Fortunately a deal of work has already been done in this area by other
+ * authors - the following plug-in uses the [naturalSort() function by Jim
+ * Palmer](http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm-with-unicode-support) to provide natural sorting in DataTables.
+ *
+ *  @name Natural sorting
+ *  @summary Sort data with a mix of numbers and letters _naturally_.
+ *  @author [Jim Palmer](http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm-with-unicode-support)
+ *  @author [Michael Buehler] (https://github.com/AnimusMachina)
+ *
+ *  @example
+ *    $('#example').dataTable( {
+ *       columnDefs: [
+ *         { type: 'natural', targets: 0 }
+ *       ]
+ *    } );
+ *
+ *    Html can be stripped from sorting by using 'natural-nohtml' such as
+ *
+ *    $('#example').dataTable( {
+ *       columnDefs: [
+ *    	   { type: 'natural-nohtml', targets: 0 }
+ *       ]
+ *    } );
+ *
+ */
+
+(function() {
+
+/*
+ * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
+ * Author: Jim Palmer (based on chunking idea from Dave Koelle)
+ * Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo
+ * See: http://js-naturalsort.googlecode.com/svn/trunk/naturalSort.js
+ */
+function naturalSort (a, b, html) {
+	var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
+		sre = /(^[ ]*|[ ]*$)/g,
+		dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
+		hre = /^0x[0-9a-f]+$/i,
+		ore = /^0/,
+		htmre = /(<([^>]+)>)/ig,
+		// convert all to strings and trim()
+		x = a.toString().replace(sre, '') || '',
+		y = b.toString().replace(sre, '') || '';
+		// remove html from strings if desired
+		if (!html) {
+			x = x.replace(htmre, '');
+			y = y.replace(htmre, '');
+		}
+		// chunk/tokenize
+	var	xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
+		yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
+		// numeric, hex or date detection
+		xD = parseInt(x.match(hre), 10) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),
+		yD = parseInt(y.match(hre), 10) || xD && y.match(dre) && Date.parse(y) || null;
+
+	// first try and sort Hex codes or Dates
+	if (yD) {
+		if ( xD < yD ) {
+			return -1;
+		}
+		else if ( xD > yD )	{
+			return 1;
+		}
+	}
+
+	// natural sorting through split numeric strings and default strings
+	for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
+		// find floats not starting with '0', string or 0 if not defined (Clint Priest)
+		var oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc], 10) || xN[cLoc] || 0;
+		var oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc], 10) || yN[cLoc] || 0;
+		// handle numeric vs string comparison - number < string - (Kyle Adams)
+		if (isNaN(oFxNcL) !== isNaN(oFyNcL)) {
+			return (isNaN(oFxNcL)) ? 1 : -1;
+		}
+		// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
+		else if (typeof oFxNcL !== typeof oFyNcL) {
+			oFxNcL += '';
+			oFyNcL += '';
+		}
+		if (oFxNcL < oFyNcL) {
+			return -1;
+		}
+		if (oFxNcL > oFyNcL) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
+jQuery.extend( jQuery.fn.dataTableExt.oSort, {
+	"natural-asc": function ( a, b ) {
+		return naturalSort(a,b,true);
+	},
+
+	"natural-desc": function ( a, b ) {
+		return naturalSort(a,b,true) * -1;
+	},
+
+	"natural-nohtml-asc": function( a, b ) {
+		return naturalSort(a,b,false);
+	},
+
+	"natural-nohtml-desc": function( a, b ) {
+		return naturalSort(a,b,false) * -1;
+	}
+} );
+
+}());
diff --git a/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/dataTables.searchHighlight.css b/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/dataTables.searchHighlight.css
new file mode 100644
index 0000000..10a03e6
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/dataTables.searchHighlight.css
@@ -0,0 +1,6 @@
+
+
+table.dataTable span.highlight {
+  background-color: #FFFF88;
+}
+
diff --git a/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/dataTables.searchHighlight.min.js b/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/dataTables.searchHighlight.min.js
new file mode 100644
index 0000000..3875871
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/dataTables.searchHighlight.min.js
@@ -0,0 +1,6 @@
+/*!
+ SearchHighlight for DataTables v1.0.1
+ 2014 SpryMedia Ltd - datatables.net/license
+*/
+(function(h,g,b){function e(d,c){d.unhighlight();c.rows({filter:"applied"}).data().length&&d.highlight(b.trim(c.search()).split(/\s+/))}b(g).on("init.dt.dth",function(d,c){if("dt"===d.namespace){var a=new b.fn.dataTable.Api(c),f=b(a.table().body());if(b(a.table().node()).hasClass("searchHighlight")||c.oInit.searchHighlight||b.fn.dataTable.defaults.searchHighlight)a.on("draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth",function(){e(f,a)}).on("destroy",function(){a.off("draw.dt.d [...]
+a.search()&&e(f,a)}})})(window,document,jQuery);
diff --git a/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/jquery.highlight.js b/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/jquery.highlight.js
new file mode 100644
index 0000000..9dcf3c7
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables-plugins/searchHighlight/jquery.highlight.js
@@ -0,0 +1,108 @@
+/*
+ * jQuery Highlight plugin
+ *
+ * Based on highlight v3 by Johann Burkard
+ * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
+ *
+ * Code a little bit refactored and cleaned (in my humble opinion).
+ * Most important changes:
+ *  - has an option to highlight only entire words (wordsOnly - false by default),
+ *  - has an option to be case sensitive (caseSensitive - false by default)
+ *  - highlight element tag and class names can be specified in options
+ *
+ * Usage:
+ *   // wrap every occurrance of text 'lorem' in content
+ *   // with <span class='highlight'> (default options)
+ *   $('#content').highlight('lorem');
+ *
+ *   // search for and highlight more terms at once
+ *   // so you can save some time on traversing DOM
+ *   $('#content').highlight(['lorem', 'ipsum']);
+ *   $('#content').highlight('lorem ipsum');
+ *
+ *   // search only for entire word 'lorem'
+ *   $('#content').highlight('lorem', { wordsOnly: true });
+ *
+ *   // don't ignore case during search of term 'lorem'
+ *   $('#content').highlight('lorem', { caseSensitive: true });
+ *
+ *   // wrap every occurrance of term 'ipsum' in content
+ *   // with <em class='important'>
+ *   $('#content').highlight('ipsum', { element: 'em', className: 'important' });
+ *
+ *   // remove default highlight
+ *   $('#content').unhighlight();
+ *
+ *   // remove custom highlight
+ *   $('#content').unhighlight({ element: 'em', className: 'important' });
+ *
+ *
+ * Copyright (c) 2009 Bartek Szopka
+ *
+ * Licensed under MIT license.
+ *
+ */
+
+jQuery.extend({
+    highlight: function (node, re, nodeName, className) {
+        if (node.nodeType === 3) {
+            var match = node.data.match(re);
+            if (match) {
+                var highlight = document.createElement(nodeName || 'span');
+                highlight.className = className || 'highlight';
+                var wordNode = node.splitText(match.index);
+                wordNode.splitText(match[0].length);
+                var wordClone = wordNode.cloneNode(true);
+                highlight.appendChild(wordClone);
+                wordNode.parentNode.replaceChild(highlight, wordNode);
+                return 1; //skip added node in parent
+            }
+        } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children
+                !/(script|style)/i.test(node.tagName) && // ignore script and style nodes
+                !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted
+            for (var i = 0; i < node.childNodes.length; i++) {
+                i += jQuery.highlight(node.childNodes[i], re, nodeName, className);
+            }
+        }
+        return 0;
+    }
+});
+
+jQuery.fn.unhighlight = function (options) {
+    var settings = { className: 'highlight', element: 'span' };
+    jQuery.extend(settings, options);
+
+    return this.find(settings.element + "." + settings.className).each(function () {
+        var parent = this.parentNode;
+        parent.replaceChild(this.firstChild, this);
+        parent.normalize();
+    }).end();
+};
+
+jQuery.fn.highlight = function (words, options) {
+    var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false };
+    jQuery.extend(settings, options);
+    
+    if (words.constructor === String) {
+        words = [words];
+    }
+    words = jQuery.grep(words, function(word, i){
+      return word != '';
+    });
+    words = jQuery.map(words, function(word, i) {
+      return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+    });
+    if (words.length == 0) { return this; };
+
+    var flag = settings.caseSensitive ? "" : "i";
+    var pattern = "(" + words.join("|") + ")";
+    if (settings.wordsOnly) {
+        pattern = "\\b" + pattern + "\\b";
+    }
+    var re = new RegExp(pattern, flag);
+    
+    return this.each(function () {
+        jQuery.highlight(this, re, settings.element, settings.className);
+    });
+};
+
diff --git a/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap.extra.css b/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap.extra.css
new file mode 100644
index 0000000..c025bbe
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap.extra.css
@@ -0,0 +1,78 @@
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+  text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+  text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+  text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+  text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+  white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+  text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+  text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+  text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+  text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+  white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+  text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+  text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+  text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+  text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+  white-space: nowrap;
+}
+.table.dataTable tbody td.active, .table.dataTable tbody tr.active td {
+	background-color: #0075b0;
+	color: white;
+}
+.dataTables_scrollBody .dataTables_sizing {
+  visibility: hidden;
+}
diff --git a/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap.min.css b/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap.min.css
new file mode 100644
index 0000000..16ed637
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:norm [...]
diff --git a/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap4.min.css b/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap4.min.css
new file mode 100644
index 0000000..881beb3
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/dataTables.bootstrap4.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-spa [...]
diff --git a/inst/htmlwidgets/lib/datatables/css/dataTables.foundation.min.css b/inst/htmlwidgets/lib/datatables/css/dataTables.foundation.min.css
new file mode 100644
index 0000000..1b8a7f6
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/dataTables.foundation.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin:0.5em 0 !important;max-width:none !important;width:100%}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper{position:relative}div.dataTables_wrapper div.dataTables_length label{float:left;text-align:left;margin-bottom:0}div.dataTables [...]
diff --git a/inst/htmlwidgets/lib/datatables/css/dataTables.jqueryui.min.css b/inst/htmlwidgets/lib/datatables/css/dataTables.jqueryui.min.css
new file mode 100644
index 0000000..a1ec199
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/dataTables.jqueryui.min.css
@@ -0,0 +1 @@
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9} [...]
diff --git a/inst/htmlwidgets/lib/datatables/css/dataTables.material.min.css b/inst/htmlwidgets/lib/datatables/css/dataTables.material.min.css
new file mode 100644
index 0000000..5935ac4
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/dataTables.material.min.css
@@ -0,0 +1 @@
+div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:10px;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;text-align:center}div.dataTables_wrapper div.dataTables_paginate{text-align:right}div.dataTables_wrapper div.mdl-grid.dt-table{padding-top:0;padding-bottom:0}div.dataT [...]
diff --git a/inst/htmlwidgets/lib/datatables/css/dataTables.semanticui.min.css b/inst/htmlwidgets/lib/datatables/css/dataTables.semanticui.min.css
new file mode 100644
index 0000000..4df32da
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/dataTables.semanticui.min.css
@@ -0,0 +1 @@
+table.dataTable.table{margin:0}table.dataTable.table thead th,table.dataTable.table thead td{position:relative}table.dataTable.table thead th.sorting,table.dataTable.table thead th.sorting_asc,table.dataTable.table thead th.sorting_desc,table.dataTable.table thead td.sorting,table.dataTable.table thead td.sorting_asc,table.dataTable.table thead td.sorting_desc{padding-right:20px}table.dataTable.table thead th.sorting:after,table.dataTable.table thead th.sorting_asc:after,table.dataTable. [...]
diff --git a/inst/htmlwidgets/lib/datatables/css/dataTables.uikit.min.css b/inst/htmlwidgets/lib/datatables/css/dataTables.uikit.min.css
new file mode 100644
index 0000000..0818eed
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/dataTables.uikit.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.row.uk-grid.dt-merge-grid{margin-top:5px}div.dataTables_wrapper div.dataTables_length label{font-weight: [...]
diff --git a/inst/htmlwidgets/lib/datatables/css/jquery.dataTables.extra.css b/inst/htmlwidgets/lib/datatables/css/jquery.dataTables.extra.css
new file mode 100644
index 0000000..dbbac6d
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/jquery.dataTables.extra.css
@@ -0,0 +1,8 @@
+/* Selected rows/cells */
+table.dataTable tr.selected td, table.dataTable td.selected {
+  background-color: #b0bed9 !important;
+}
+/* In case of scrollX/Y or FixedHeader */
+.dataTables_scrollBody .dataTables_sizing {
+  visibility: hidden;
+}
diff --git a/inst/htmlwidgets/lib/datatables/css/jquery.dataTables.min.css b/inst/htmlwidgets/lib/datatables/css/jquery.dataTables.min.css
new file mode 100644
index 0000000..207dd69
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/css/jquery.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead . [...]
diff --git a/inst/htmlwidgets/lib/datatables/js/dataTables.bootstrap.min.js b/inst/htmlwidgets/lib/datatables/js/dataTables.bootstrap.min.js
new file mode 100644
index 0000000..2d824c8
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/js/dataTables.bootstrap.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.e [...]
+{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,m,j,n){var o=new f.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action [...]
+l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":s.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append( [...]
+"aria-controls":a.sTableId,"aria-label":t[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
diff --git a/inst/htmlwidgets/lib/datatables/js/dataTables.bootstrap4.min.js b/inst/htmlwidgets/lib/datatables/js/dataTables.bootstrap4.min.js
new file mode 100644
index 0000000..471f174
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/js/dataTables.bootstrap4.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-md-6'l><'col-md-6'f>><'row'<'col-md-12'tr>><'row'<'col-md-5'i><'col-md-7'p>>",renderer:"bootstrap"});b.e [...]
+{sWrapper:"dataTables_wrapper form-inline dt-bootstrap4",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default",sPageButton:"paginate_button page-item"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,m,j,n){var o=new f.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.pa [...]
+o.page(a.data.action).draw("page")};l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":s.sPageButton+" "+g,id:0===r&&"string"===type [...]
+"_"+c:null}).append(b("<a>",{href:"#","aria-controls":a.sTableId,"aria-label":t[c],"data-dt-idx":p,tabindex:a.iTabIndex,"class":"page-link"}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
diff --git a/inst/htmlwidgets/lib/datatables/js/dataTables.foundation.min.js b/inst/htmlwidgets/lib/datatables/js/dataTables.foundation.min.js
new file mode 100644
index 0000000..58c7b03
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/js/dataTables.foundation.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Foundation integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return d(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net")(a,b).$;return d(b,a,a.document)}:d(jQuery,window,document)})(function(d){var a=d.fn.dataTable,b=d('<meta class="foundation-mq"/>').appendTo("head");a.ext.foundationVersion=b.css("font-family").match(/small|medium|large/)?6:5;b.remove();d.exten [...]
+{sWrapper:"dataTables_wrapper dt-foundation",sProcessing:"dataTables_processing panel"});d.extend(!0,a.defaults,{dom:"<'row'<'small-6 columns'l><'small-6 columns'f>r>t<'row'<'small-6 columns'i><'small-6 columns'p>>",renderer:"foundation"});a.ext.renderer.pageButton.foundation=function(b,l,r,s,e,i){var m=new a.Api(b),t=b.oClasses,j=b.oLanguage.oPaginate,u=b.oLanguage.oAria.paginate||{},f,h,g,v=5===a.ext.foundationVersion,q=function(a,n){var k,o,p,c,l=function(a){a.preventDefault();!d(a.cu [...]
+m.page()!=a.data.action&&m.page(a.data.action).draw("page")};k=0;for(o=n.length;k<o;k++)if(c=n[k],d.isArray(c))q(a,c);else{h=f="";g=null;switch(c){case "ellipsis":f="&#x2026;";h="unavailable disabled";g=null;break;case "first":f=j.sFirst;h=c+(0<e?"":" unavailable disabled");g=0<e?"a":null;break;case "previous":f=j.sPrevious;h=c+(0<e?"":" unavailable disabled");g=0<e?"a":null;break;case "next":f=j.sNext;h=c+(e<i-1?"":" unavailable disabled");g=e<i-1?"a":null;break;case "last":f=j.sLast;h= [...]
+"":" unavailable disabled");g=e<i-1?"a":null;break;default:f=c+1,h=e===c?"current":"",g=e===c?null:"a"}v&&(g="a");f&&(p=d("<li>",{"class":t.sPageButton+" "+h,"aria-controls":b.sTableId,"aria-label":u[c],tabindex:b.iTabIndex,id:0===r&&"string"===typeof c?b.sTableId+"_"+c:null}).append(g?d("<"+g+"/>",{href:"#"}).html(f):f).appendTo(a),b.oApi._fnBindAction(p,{action:c},l))}};q(d(l).empty().html('<ul class="pagination"/>').children("ul"),s)};return a});
diff --git a/inst/htmlwidgets/lib/datatables/js/dataTables.jqueryui.min.js b/inst/htmlwidgets/lib/datatables/js/dataTables.jqueryui.min.js
new file mode 100644
index 0000000..782d10f
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/js/dataTables.jqueryui.min.js
@@ -0,0 +1,9 @@
+/*!
+ DataTables jQuery UI integration
+ ©2011-2014 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,d){b||(b=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(b,d).$;return a(d,b,b.document)}:a(jQuery,window,document)})(function(a){var b=a.fn.dataTable;a.extend(!0,b.defaults,{dom:'<"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-tl ui-corner-tr"lfr>t<"fg-toolbar ui-toolbar ui-wi [...]
+renderer:"jqueryui"});a.extend(b.ext.classes,{sWrapper:"dataTables_wrapper dt-jqueryui",sPageButton:"fg-button ui-button ui-state-default",sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:"ui-state-default sorting_asc",sSortDesc:"ui-state-default sorting_desc",sSortable:"ui-state-default sorting",sSortableAsc:"ui-state-default sorting_asc_disabled",s [...]
+sSortableNone:"ui-state-default sorting_disabled",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead ui-state-default",sScrollFoot:"dataTables_scrollFoot ui-state-default",sHeaderTH:"ui-state-default",sFooterTH:"ui-state-default"});b.ext.renderer.header.jqueryui=function(b,h,e,c){var f="css_right ui-icon ui-icon-carat-2-n-s",g=-1!==a.inArray("asc",e.asSorting),i=-1!==a.inArray("desc",e.asSorting);!e.bSortable||!g&&!i?f="":g&&!i?f="css_right ui-icon ui-icon-carat-1-n":!g& [...]
+a("<div/>").addClass("DataTables_sort_wrapper").append(h.contents()).append(a("<span/>").addClass(c.sSortIcon+" "+f)).appendTo(h);a(b.nTable).on("order.dt",function(a,g,i,j){b===g&&(a=e.idx,h.removeClass(c.sSortAsc+" "+c.sSortDesc).addClass("asc"==j[a]?c.sSortAsc:"desc"==j[a]?c.sSortDesc:e.sSortingClass),h.find("span."+c.sSortIcon).removeClass("css_right ui-icon ui-icon-triangle-1-n css_right ui-icon ui-icon-triangle-1-s css_right ui-icon ui-icon-carat-2-n-s css_right ui-icon ui-icon-car [...]
+j[a]?"css_right ui-icon ui-icon-triangle-1-n":"desc"==j[a]?"css_right ui-icon ui-icon-triangle-1-s":f))})};b.TableTools&&a.extend(!0,b.TableTools.classes,{container:"DTTT_container ui-buttonset ui-buttonset-multi",buttons:{normal:"DTTT_button ui-button ui-state-default"},collection:{container:"DTTT_collection ui-buttonset ui-buttonset-multi"}});return b});
diff --git a/inst/htmlwidgets/lib/datatables/js/dataTables.material.min.js b/inst/htmlwidgets/lib/datatables/js/dataTables.material.min.js
new file mode 100644
index 0000000..480094f
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/js/dataTables.material.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return c(d,a,a.document)}:c(jQuery,window,document)})(function(c,a,d){var g=c.fn.dataTable;c.extend(!0,g.defaults,{dom:"<'mdl-grid'<'mdl-cell mdl-cell--6-col'l><'mdl-cell mdl-cell--6-col'f>><'mdl-grid dt-table'<'mdl-cell mdl-cell--12-co [...]
+renderer:"material"});c.extend(g.ext.classes,{sWrapper:"dataTables_wrapper form-inline dt-material",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});g.ext.renderer.pageButton.material=function(a,h,r,s,i,n){var o=new g.Api(a),l=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},f,e,p=0,q=function(d,g){var m,h,j,b,k=function(a){a.preventDefault();!c(a.currentTarget).hasClass("disabled")&&o.page()!=a.dat [...]
+o.page(a.data.action).draw("page")};m=0;for(h=g.length;m<h;m++)if(b=g[m],c.isArray(b))q(d,b);else{f="";j=!1;switch(b){case "ellipsis":f="&#x2026;";e="disabled";break;case "first":f=l.sFirst;e=b+(0<i?"":" disabled");break;case "previous":f=l.sPrevious;e=b+(0<i?"":" disabled");break;case "next":f=l.sNext;e=b+(i<n-1?"":" disabled");break;case "last":f=l.sLast;e=b+(i<n-1?"":" disabled");break;default:f=b+1,e="",j=i===b}j&&(e+=" mdl-button--raised mdl-button--colored");f&&(j=c("<button>",{"cl [...]
+e,id:0===r&&"string"===typeof b?a.sTableId+"_"+b:null,"aria-controls":a.sTableId,"aria-label":t[b],"data-dt-idx":p,tabindex:a.iTabIndex,disabled:-1!==e.indexOf("disabled")}).html(f).appendTo(d),a.oApi._fnBindAction(j,{action:b},k),p++)}},k;try{k=c(h).find(d.activeElement).data("dt-idx")}catch(u){}q(c(h).empty().html('<div class="pagination"/>').children(),s);k&&c(h).find("[data-dt-idx="+k+"]").focus()};return g});
diff --git a/inst/htmlwidgets/lib/datatables/js/dataTables.semanticui.min.js b/inst/htmlwidgets/lib/datatables/js/dataTables.semanticui.min.js
new file mode 100644
index 0000000..cb60091
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/js/dataTables.semanticui.min.js
@@ -0,0 +1,9 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d){var e=b.fn.dataTable;b.extend(!0,e.defaults,{dom:"<'ui grid'<'row'<'eight wide column'l><'right aligned eight wide column'f>><'row dt-table'<'sixteen wide column'tr>> [...]
+renderer:"semanticUI"});b.extend(e.ext.classes,{sWrapper:"dataTables_wrapper dt-semanticUI",sFilter:"dataTables_filter ui input",sProcessing:"dataTables_processing ui segment",sPageButton:"paginate_button item"});e.ext.renderer.pageButton.semanticUI=function(h,a,r,s,j,m){var n=new e.Api(h),t=h.oClasses,k=h.oLanguage.oPaginate,u=h.oLanguage.oAria.paginate||{},f,g,o=0,p=function(a,d){var e,i,l,c,q=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&n.page()!=a.data.act [...]
+e=0;for(i=d.length;e<i;e++)if(c=d[e],b.isArray(c))p(a,c);else{g=f="";switch(c){case "ellipsis":f="&#x2026;";g="disabled";break;case "first":f=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":f=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":f=k.sNext;g=c+(j<m-1?"":" disabled");break;case "last":f=k.sLast;g=c+(j<m-1?"":" disabled");break;default:f=c+1,g=j===c?"active":""}l=-1===g.indexOf("disabled")?"a":"div";f&&(l=b("<"+l+">",{"class":t.sPageButton+" "+g,id:0===r&&"string"= [...]
+h.sTableId+"_"+c:null,href:"#","aria-controls":h.sTableId,"aria-label":u[c],"data-dt-idx":o,tabindex:h.iTabIndex}).html(f).appendTo(a),h.oApi._fnBindAction(l,{action:c},q),o++)}},i;try{i=b(a).find(d.activeElement).data("dt-idx")}catch(v){}p(b(a).empty().html('<div class="ui pagination menu"/>').children(),s);i&&b(a).find("[data-dt-idx="+i+"]").focus()};b(d).on("init.dt",function(a,d){if("dt"===a.namespace&&b.fn.dropdown){var e=new b.fn.dataTable.Api(d);b("div.dataTables_length select",e. [...]
+return e});
diff --git a/inst/htmlwidgets/lib/datatables/js/dataTables.uikit.min.js b/inst/htmlwidgets/lib/datatables/js/dataTables.uikit.min.js
new file mode 100644
index 0000000..5bbe651
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/js/dataTables.uikit.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables UIkit 3 integration
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,c){a||(a=window);if(!c||!c.fn.dataTable)c=require("datatables.net")(a,c).$;return b(c,a,a.document)}:b(jQuery,window,document)})(function(b,a,c){var g=b.fn.dataTable;b.extend(!0,g.defaults,{dom:"<'row uk-grid'<'uk-width-1-2'l><'uk-width-1-2'f>><'row uk-grid dt-merge-grid'<'uk-width-1-1'tr>><'row uk-grid dt-mer [...]
+renderer:"uikit"});b.extend(g.ext.classes,{sWrapper:"dataTables_wrapper uk-form dt-uikit",sFilterInput:"uk-form-small",sLengthSelect:"uk-form-small",sProcessing:"dataTables_processing uk-panel"});g.ext.renderer.pageButton.uikit=function(a,h,r,m,j,n){var o=new g.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},f,d,p=0,q=function(c,g){var l,h,i,e,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.act [...]
+l=0;for(h=g.length;l<h;l++)if(e=g[l],b.isArray(e))q(c,e);else{d=f="";switch(e){case "ellipsis":f='<i class="uk-icon-ellipsis-h"></i>';d="uk-disabled disabled";break;case "first":f='<i class="uk-icon-angle-double-left"></i> '+k.sFirst;d=0<j?"":" uk-disabled disabled";break;case "previous":f='<i class="uk-icon-angle-left"></i> '+k.sPrevious;d=0<j?"":"uk-disabled disabled";break;case "next":f=k.sNext+' <i class="uk-icon-angle-right"></i>';d=j<n-1?"":"uk-disabled disabled";break;case "last": [...]
+' <i class="uk-icon-angle-double-right"></i>';d=j<n-1?"":" uk-disabled disabled";break;default:f=e+1,d=j===e?"uk-active":""}f&&(i=b("<li>",{"class":s.sPageButton+" "+d,id:0===r&&"string"===typeof e?a.sTableId+"_"+e:null}).append(b(-1!=d.indexOf("disabled")||-1!=d.indexOf("active")?"<span>":"<a>",{href:"#","aria-controls":a.sTableId,"aria-label":t[e],"data-dt-idx":p,tabindex:a.iTabIndex}).html(f)).appendTo(c),a.oApi._fnBindAction(i,{action:e},m),p++)}},i;try{i=b(h).find(c.activeElement).d [...]
+m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};return g});
diff --git a/inst/htmlwidgets/lib/datatables/js/jquery.dataTables.min.js b/inst/htmlwidgets/lib/datatables/js/jquery.dataTables.min.js
new file mode 100644
index 0000000..f127725
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/js/jquery.dataTables.min.js
@@ -0,0 +1,166 @@
+/*!
+ DataTables 1.10.12
+ ©2008-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(D){return h(D,window,document)}):"object"===typeof exports?module.exports=function(D,I){D||(D=window);I||(I="undefined"!==typeof window?require("jquery"):require("jquery")(D));return h(I,D,D.document)}:h(jQuery,window,document)})(function(h,D,I,k){function X(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLo [...]
+d[c]=e,"o"===b[1]&&X(a[e])});a._hungarianMap=d}function K(a,b,c){a._hungarianMap||X(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),K(a[d],b[d],c)):b[d]=b[e]})}function Da(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&E(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&E(a,a,"sZeroRecords","sLoa [...]
+a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX& [...]
+a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&K(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",top: [...]
+width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function hb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==e;)a [...]
+(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ea(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:I.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);ja(a,d,h(b).data())}function ja(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width") [...]
+(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),K(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),E(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),E(b,c,"aDataSort"));var g=b.mData,j=Q(g),i=b.mRender?Q(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isP [...]
+(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return R(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJ [...]
+!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function Y(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Fa(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&ka(a);u(a,null,"column-sizing",[a])}function Z(a,b){var c=la(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=la(a,"bVisible"),c=h.inArray(b,c);return-1!== [...]
+function aa(a){var b=0;h.each(a.aoColumns,function(a,d){d.bVisible&&"none"!==h(d.nTh).css("display")&&b++});return b}function la(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ga(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,t;e=0;for(f=b.length;e<f;e++)if(l=b[e],t=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){t[i]===k&&(t[i]=B(a,i,e,"type"));q=d[g](t[i] [...]
+g!==d.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function ib(a,b,c,d){var e,f,g,j,i,n,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){n=b[e];var q=n.targets!==k?n.targets:n.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Ea(a);d(q[f],n)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],n);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).ha [...]
+d(j,n)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function N(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ha(a,e,c,d);return e}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ia(a,e);return N(a,c.data,e,c.cells)})}function B(a,b,c,d) [...]
+f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,i=f.fnGetData(g,d,{settings:a,row:b,col:c});if(i===k)return a.iDrawError!=e&&null===j&&(L(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j&&d!==k)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function jb(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a [...]
+function Ja(a){return h.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\./g,".")})}function Q(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=Q(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!= [...]
+for(var i=0,n=j.length;i<n;i++){f=j[i].match(ba);g=j[i].match(U);if(f){j[i]=j[i].replace(ba,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");if(h.isArray(a)){i=0;for(n=a.length;i<n;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(U,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function R(a){if(h.isPlainObject [...]
+if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=Ja(e),f;f=e[e.length-1];for(var g,j,i=0,n=e.length-1;i<n;i++){g=e[i].match(ba);j=e[i].match(U);if(g){e[i]=e[i].replace(ba,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(n=d.length;j<n;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j [...]
+""),a=a[e[i]](d));if(null===a[e[i]]||a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(U))a[f.replace(U,"")](d);else a[f.replace(ba,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ka(a){return G(a.aoData,"_aData")}function na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function oa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function ca(a,b,c,d){var e=a.aoData[b],f,g=fun [...]
+c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ia(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;La(a,e)}}function Ia(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,n,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],t=function(a,b){if("string"===typeof a){var c [...]
+-1!==c&&(c=a.substring(c+1),R(a)(d,b.getAttribute(c)))}},S=function(a){if(c===k||c===i)j=l[i],n=h.trim(a.innerHTML),j&&j._bAttrSrc?(R(j.mData._)(d,n),t(j.mData.sort,a),t(j.mData.type,a),t(j.mData.filter,a)):q?(j._setter||(j._setter=R(j.mData)),j._setter(d,n)):d[i]=n;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)S(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)S(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&R(a.rowId)(d,b);return{d [...]
+function Ha(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,n,l,q;if(null===e.nTr){j=c||I.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;La(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){n=a.aoColumns[l];i=c?d[l]:I.createElement(n.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if((!c||n.mRender||n.mData!==l)&&(!h.isPlainObject(n.mData)||n.mData._!==l+".display"))i.innerHTML=B(a,b,l,"display");n.sClass&&(i.className+=" "+n.sClass);n.bVisible&&!c?j.appendChild(i):!n.bVisible&&c [...]
+n.fnCreatedCell&&n.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}u(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role","row")}function La(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?pa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function kb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFo [...]
+h("th, td",g).length,n=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass),i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Ma(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Na(a,"header")(a,d,f,n);i&&da(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(j).find(">t [...]
+if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,n;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(n=i=1,j[d][f]===k){a.appendChild(g[d][ [...]
+for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+n]!==k&&g[d][f].cell==g[d][f+n].cell;){for(c=0;c<i;c++)j[d+c][f+n]=1;n++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",n)}}}}function O(a){var b=u(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0 [...]
+-1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!lb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:n;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ha(a,l);l=q.nTr;if(0!==e){var t=d[c%e];q._sRowStripe!=t&&(h(l).removeClass(q._sRowStripe).addClass(t),q._sRowStripe=t)}u(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoa [...]
+f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];u(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ka(a),g,n,i]);u(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ka(a),g,n,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));u(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeat [...]
+c.bSort&&mb(a);d?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold=!1}function nb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,n,l,q,t=0;t<f.length;t++){g=null;j=f[t];if("<"==j){i=h(" [...]
+n=f[t+1];if("'"==n||'"'==n){l="";for(q=2;f[t+q]!=n;)l+=f[t+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),i.id=n[0].substr(1,n[0].length-1),i.className=n[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;t+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==j&&d.bFilter)g=pb(a);else if("r"==j&&d.bProcessing)g=qb(a);else if("t"==j)g=rb(a);else if("i"==j&&d.bInfo)g=sb(a);e [...]
+j&&d.bPaginate)g=tb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(n=i.length;q<n;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function da(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,n,l,q,t;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e [...]
+q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;n=g;t=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][n+j]={cell:e,unique:t},a[f+g].nTr=d}e=e.nextSibling}}}function qa(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function ra(a,b,c){u(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)) [...]
+e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,j=a.oInstance,i=function(b){u(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var n=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&n?n:h.extend(!0,b,n);delete g.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&L(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=u(a,n [...]
+[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?L(a,0,"Invalid JSON response",1):4===b.readyState&&L(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;u(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(n,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(n,g)),g.data=f)}function lb(a){return a.bAjaxDataGet?(a.i [...]
+!0),ra(a,ub(a),function(b){vb(a,b)}),!1):!0}function ub(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,n,l,q=V(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var k=function(a,b){j.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",G(b,"sName").join(","));k("iDisplayStart",g);k("iDisplayLength",i);var S={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c; [...]
+l=f[g],i="function"==typeof n.mData?"function":n.mData,S.columns.push({data:i,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),k("mDataProp_"+g,i),d.bFilter&&(k("sSearch_"+g,l.sSearch),k("bRegex_"+g,l.bRegex),k("bSearchable_"+g,n.bSearchable)),d.bSort&&k("bSortable_"+g,n.bSortable);d.bFilter&&(k("sSearch",e.sSearch),k("bRegex",e.bRegex));d.bSort&&(h.each(q,function(a,b){S.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("s [...]
+a,b.dir)}),k("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:S:b?j:S}function vb(a,b){var c=sa(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}na(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)N(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;O(a); [...]
+ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?Q(c)(b):b}function pb(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function( [...]
+"":this.value;b!=e.sSearch&&(fa(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,O(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?Oa(f,g):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==I.activeEleme [...]
+return b[0]}function fa(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ga(a);if("ssp"!=y(a)){wb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)xb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);yb(a)}else f(b);a.bFiltered=!0;u(a,null,"search",[a])}functi [...]
+m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,n=c.length;i<n;i++)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function xb(a,b,c,d,e,f){if(""!==b)for(var g=a.aiDisplay,d=Pa(b,d,e,f),e=g.length-1;0<=e;e--)b=a.aoData[g[e]]._aFilterData[c],d.test(b)||g.splice(e,1)}function wb(a,b,c,d,e,f){var d=Pa(b,d,e,f),e=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&&(c=!0);g=zb(a);if(0>=b.length)a.aiDispl [...]
+else{if(g||c||e.length>b.length||0!==b.indexOf(e)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)d.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Pa(a,b,c,d){a=b?a:Qa(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function zb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=m.ext.type.search;c=!1;d=0;for(f= [...]
+f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(ua.innerHTML=i,i=Zb?ua.textContent:ua.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join("  ");c=!0}return c}function Ab(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a [...]
+function Bb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function sb(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Cb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Cb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd [...]
+g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Db(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Db(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a, [...]
+e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ga(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){nb(a);kb(a);ea(a,a.aoHeader);ea(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Fa(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=x(f.sWidth));u(a,null,"preInit",[a]);T(a);e=y(a);if("ssp"!=e||g)"ajax"==e?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)N(a,f[b]);a.iInitDisplayStart=d;T(a);C(a,!1);ta(a,c)}, [...]
+ta(a))}else setTimeout(function(){ga(a)},200)}function ta(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&Y(a);u(a,null,"plugin-init",[a,b]);u(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);u(a,null,"length",[a,c])}function ob(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)e[0][g]=new Option(d[g] [...]
+h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());O(a)});h(a.nTable).bind("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function tb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){O(a)},b=h("<div/>").addClass(a.oClasses.sPaging+b)[0], [...]
+d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Na(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Ta(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first [...]
+"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:L(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(u(a,null,"page",[a]),c&&O(a));return b}function qb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");u(a,nul [...]
+[a,b])}function rb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:x(d):"100%"}).append(h("<div/>",{"class":f.s [...]
+width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:x(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:x(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===j?g:null).append(b.child [...]
+var b=i.children(),k=b[0],f=b[1],t=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(t.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:ka,sName:"scrolling"});return i[0]}function ka(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,n=j.children("table"),j=a.nScrollBody,l=h(j),q=j.style,t [...]
+m=t.children("table"),o=h(a.nTHead),F=h(a.nTable),p=F[0],r=p.style,u=a.nTFoot?h(a.nTFoot):null,Eb=a.oBrowser,Ua=Eb.bScrollOversize,s=G(a.aoColumns,"nTh"),P,v,w,y,z=[],A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};v=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==v&&a.scrollBarVis!==k)a.scrollBarVis=v,Y(a);else{a.scrollBarVis=v;F.children("thead, tfoot").remove();u&&(w=u.clone().prependTo(F),P=u.fin [...]
+w.find("tr"));y=o.clone().prependTo(F);o=o.find("tr");v=y.find("tr");y.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(qa(a,y),function(b,c){D=Z(a,b);c.style.width=a.aoColumns[D].sWidth});u&&J(function(a){a.style.width=""},w);f=F.outerWidth();if(""===c){r.width="100%";if(Ua&&(F.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=x(F.outerWidth()-b);f=F.outerWidth()}else""!==d&&(r.width=x(d),f=F.outerWidth());J(E,v);J(func [...]
+z.push(x(h(a).css("width")))},v);J(function(a,b){if(h.inArray(a,s)!==-1)a.style.width=z[b]},o);h(v).height(0);u&&(J(E,w),J(function(a){C.push(a.innerHTML);A.push(x(h(a).css("width")))},w),J(function(a,b){a.style.width=A[b]},P),h(w).height(0));J(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+B[b]+"</div>";a.style.width=z[b]},v);u&&J(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+C[b]+"</div>";a.s [...]
+A[b]},w);if(F.outerWidth()<f){P=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(Ua&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=x(P-b);(""===c||""!==d)&&L(a,1,"Possible column misalignment",6)}else P="100%";q.width=x(P);g.width=x(P);u&&(a.nScrollFoot.style.width=x(P));!e&&Ua&&(q.height=x(p.offsetHeight+b));c=F.outerWidth();n[0].style.width=x(c);i.width=x(c);d=F.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+(Eb.bScrollb [...]
+"Right");i[e]=d?b+"px":"0px";u&&(m[0].style.width=x(c),t[0].style.width=x(c),t[0].style[e]=d?b+"px":"0px");F.children("colgroup").insertBefore(F.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function J(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Fa(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,f=d.sX,g [...]
+j=c.length,i=la(a,"bVisible"),n=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,t=!1,m,o,p=a.oBrowser,d=p.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)o=c[i[m]],null!==o.sWidth&&(o.sWidth=Fb(o.sWidthOrig,k),t=!0);if(d||!t&&!f&&!e&&j==aa(a)&&j==n.length)for(m=0;m<j;m++)i=Z(a,m),null!==i&&(c[i].sWidth=x(n.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var r=h("<tr/>").appendTo(j.f [...]
+j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=qa(a,j.find("thead")[0]);for(m=0;m<i.length;m++)o=c[i[m]],n[m].style.width=null!==o.sWidthOrig&&""!==o.sWidthOrig?x(o.sWidthOrig):"",o.sWidthOrig&&f&&h(n[m]).append(h("<div/>").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)t=i[m],o=c[t],h(Gb(a,t)).clone(!1).append(o.sContentPadding).appendTo(r) [...]
+j).removeAttr("name");o=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth):l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(n[m]),g=k.outerWidth()-k.width(),k=p.bBounding?Math.ceil(n[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=x(k-g);b.style.width=x(e);o.remove()}l&& [...]
+x(l));if((l||f)&&!a._reszEvt)b=function(){h(D).bind("resize.DT-"+a.sInstance,Oa(function(){Y(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function Fb(a,b){if(!a)return 0;var c=h("<div/>").css("width",x(a)).appendTo(b||I.body),d=c[0].offsetWidth;c.remove();return d}function Gb(a,b){var c=Hb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Hb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c [...]
+""),c=c.replace(/ /g," "),c.length>d&&(d=c.length,e=f);return e}function x(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function V(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){i=n[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g [...]
+"string",n[a]._idx===k&&(n[a]._idx=h.inArray(n[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:n[a][1],index:n[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function mb(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Ga(a);h=V(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Ib(a,j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortDa [...]
+0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=p[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,d=a.aoColumns,e=V(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b= [...]
+"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Va(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMu [...]
+G(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);T(a);"function"==typeof d&&d(a)}function Ma(a,b,c,d){var e=a.aoColumns[c];Wa(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Va(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Va(a,c,b.s [...]
+function va(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=V(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)g=b[e].src,h(G(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(G(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Ib(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if [...]
+c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function wa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:Ab(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Ab(a.aoPreSearchCols[d])}})};u(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oIn [...]
+b)}}function Kb(a){var b,c,d=a.aoColumns;if(a.oFeatures.bStateSave){var e=a.fnStateLoadCallback.call(a.oInstance,a);if(e&&e.time&&(b=u(a,"aoStateLoadParams","stateLoadParams",[a,e]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&e.time<+new Date-1E3*b)&&d.length===e.columns.length))){a.oLoadedState=h.extend(!0,{},e);e.start!==k&&(a._iDisplayStart=e.start,a.iInitDisplayStart=e.start);e.length!==k&&(a._iDisplayLength=e.length);e.order!==k&&(a.aaSorting=[],h.each(e.order,function(b,c){a.a [...]
+d.length?[0,c[1]]:c)}));e.search!==k&&h.extend(a.oPreviousSearch,Bb(e.search));b=0;for(c=e.columns.length;b<c;b++){var f=e.columns[b];f.visible!==k&&(d[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Bb(f.search))}u(a,"aoStateLoaded","stateLoaded",[a,e])}}}function xa(a){var b=m.settings,a=h.inArray(a,G(b,"nTable"));return-1!==a?b[a]:null}function L(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error,  [...]
+d);if(b)D.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&u(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function E(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?E(a,b,d[0],d[1]):E(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Lb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"! [...]
+e&&h.isArray(d)?d.slice():d);return a}function Wa(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function u(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Sa(a){var b=a [...]
+c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Na(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ya(a,b){var c=[],c=Mb.numbers_length,d=Math.floor(c/2);b<=c?c=W(0,b):a<=d?(c=W(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=W(b-(c-2),b):(c=W(a-d+2,a+d-1),c.pus [...]
+c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Xa)},"html-num":function(b){return za(b,a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Xa)}},function(b,c){v.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(v.type.search[b+a]=v.type.search.html)})}function Nb(a){return function(){var b=[xa(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m. [...]
+b)}}var m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new r(xa(this[v.iApiIndex])):new r(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a== [...]
+(""!==d.sX||""!==d.sY)&&ka(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b|| [...]
+c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.c [...]
+[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return xa(this[v.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a). [...]
+function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=v.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=v.internal;for(var e in m.ext.internal)e&&(this[e]=Nb(e));this.each(function(){var e={},e=1<d?Lb(e,a,!0):a,g=0,j,i=this.getAttribute("id"),n=!1,l=m.defaults,q=h(this);i [...]
+this.nodeName.toLowerCase())L(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);K(l,l,!0);K(l.column,l.column,!0);K(l,h.extend(e,q.data()));var t=m.settings,g=0;for(j=t.length;g<j;g++){var p=t[g];if(p.nTable==this||p.nTHead.parentNode==this||p.nTFoot&&p.nTFoot.parentNode==this){g=e.bRetrieve!==k?e.bRetrieve:l.bRetrieve;if(c||g)return p.oInstance;if(e.bDestroy!==k?e.bDestroy:l.bDestroy){p.oInstance.fnDestroy();break}else{L(p,0,"Cannot reinitialise DataT [...]
+return}}if(p.sTableId==this.id){t.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var o=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});o.nTable=this;o.oApi=b.internal;o.oInit=e;t.push(o);o.oInstance=1===b.length?b:q.dataTable();eb(e);e.oLanguage&&Da(e.oLanguage);e.aLengthMenu&&!e.iDisplayLength&&(e.iDisplayLength=h.isArray(e.aLengthMenu[0])?e.aLengthMenu[0][0]:e.aLengthMenu[0]);e=Lb(h.extend(!0,{},l),e);E(o. [...]
+e,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));E(o,e,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSe [...]
+"aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);E(o.oScroll,e,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);E(o.oLanguage,e,"fnInfoCallback");z(o,"aoDrawCallback",e.fnDrawCallback,"user");z(o,"aoServerParams",e.fnServerParams,"user");z(o,"aoStateSaveParams",e.fnStateSaveParams,"user");z(o,"aoStateLoadParams",e.fnStateLoadParams,"user");z(o,"aoStateLoaded",e.fnStateLoaded,"user");z(o,"aoRowCallback",e.fnRo [...]
+"user");z(o,"aoRowCreatedCallback",e.fnCreatedRow,"user");z(o,"aoHeaderCallback",e.fnHeaderCallback,"user");z(o,"aoFooterCallback",e.fnFooterCallback,"user");z(o,"aoInitComplete",e.fnInitComplete,"user");z(o,"aoPreDrawCallback",e.fnPreDrawCallback,"user");o.rowIdFn=Q(e.rowId);gb(o);i=o.oClasses;e.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,e.oClasses),e.sDom===l.sDom&&"lfrtip"===l.sDom&&(o.sDom='<"H"lfr>t<"F"ip>'),o.renderer)?h.isPlainObject(o.renderer)&&!o.renderer.header&&(o.renderer.heade [...]
+o.renderer="jqueryui":h.extend(i,m.ext.classes,e.oClasses);q.addClass(i.sTable);o.iInitDisplayStart===k&&(o.iInitDisplayStart=e.iDisplayStart,o._iDisplayStart=e.iDisplayStart);null!==e.iDeferLoading&&(o.bDeferLoading=!0,g=h.isArray(e.iDeferLoading),o._iRecordsDisplay=g?e.iDeferLoading[0]:e.iDeferLoading,o._iRecordsTotal=g?e.iDeferLoading[1]:e.iDeferLoading);var r=o.oLanguage;h.extend(!0,r,e.oLanguage);""!==r.sUrl&&(h.ajax({dataType:"json",url:r.sUrl,success:function(a){Da(a);K(l.oLanguag [...]
+r,a);ga(o)},error:function(){ga(o)}}),n=!0);null===e.asStripeClasses&&(o.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=o.asStripeClasses,v=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return v.hasClass(a)}))&&(h("tbody tr",this).removeClass(g.join(" ")),o.asDestroyStripes=g.slice());t=[];g=this.getElementsByTagName("thead");0!==g.length&&(da(o.aoHeader,g[0]),t=qa(o));if(null===e.aoColumns){p=[];g=0;for(j=t.length;g<j;g++)p.push(null)}else p=e.aoColumns [...]
+p.length;g<j;g++)Ea(o,t?t[g]:null);ib(o,e.aoColumnDefs,p,function(a,b){ja(o,a,b)});if(v.length){var s=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(v[0]).children("th, td").each(function(a,b){var c=o.aoColumns[a];if(c.mData===a){var d=s(b,"sort")||s(b,"order"),e=s(b,"filter")||s(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+". at data-"+d:k,type:d!==null?a+". at data-"+d:k,filter:e!==null?a+". at data-"+e:k};ja(o,a)}}})}var w=o.oFeatures;e.bStateSave [...]
+!0,Kb(o,e),z(o,"aoDrawCallback",wa,"state_save"));if(e.aaSorting===k){t=o.aaSorting;g=0;for(j=t.length;g<j;g++)t[g][1]=o.aoColumns[g].asSorting[0]}va(o);w.bSort&&z(o,"aoDrawCallback",function(){if(o.bSorted){var a=V(o),b={};h.each(a,function(a,c){b[c.src]=c.dir});u(o,null,"order",[o,a,b]);Jb(o)}});z(o,"aoDrawCallback",function(){(o.bSorted||y(o)==="ssp"||w.bDeferRender)&&va(o)},"sc");g=q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0 [...]
+(j=h("<thead/>").appendTo(this));o.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));o.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==o.oScroll.sX||""!==o.oScroll.sY))j=h("<tfoot/>").appendTo(this);0===j.length||0===j.children().length?q.addClass(i.sNoFooter):0<j.length&&(o.nTFoot=j[0],da(o.aoFooter,o.nTFoot));if(e.aaData)for(g=0;g<e.aaData.length;g++)N(o,e.aaData[g]);else(o.bDeferLoading||"dom"==y(o))&&ma(o,h(o.nTBody).children("tr")) [...]
+o.aiDisplayMaster.slice();o.bInitialised=!0;!1===n&&ga(o)}});b=null;return this},v,r,p,s,Ya={},Ob=/[\r\n]/g,Aa=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,cc=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Xa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(Qa(b),"g"));return"string"===typeof a&&"."!==b?a.r [...]
+"").replace(Ya[b],"."):a},Za=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Qb(a,b));c&&d&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===typeof a)?null:Za(a.replace(Aa,""),b,c)?!0:null},G=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},ha=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++) [...]
+e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},W=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Sb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},pa=function(a){var b=[],c,d,e=a.length,f,g=0;d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b};m.util={throttle:function(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,h=arguments;d&&g<d+c? [...]
+e=setTimeout(function(){d=k;a.apply(b,h)},c)):(d=g,a.apply(b,h))}},escapeRegex:function(a){return a.replace(cc,"\\$1")}};var A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ba=/\[.*?\]$/,U=/\(\)$/,Qa=m.util.escapeRegex,ua=h("<div>")[0],Zb=ua.textContent!==k,$b=/<.*?>/g,Oa=m.util.throttle,Tb=[],w=Array.prototype,dc=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e), [...]
+null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};r=function(a,b){if(!(this instanceof r))return new r(a,b);var c=[],d=function(a){(a=dc(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=pa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};r.extend(this, [...]
+m.Api=r;h.extend(r.prototype,{any:function(){return 0!==this.count()},concat:w.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new r(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new r(this.context [...]
+[];return new r(this.context,a.concat.apply(a,this.toArray()))},join:w.join,indexOf:w.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,h,i,n,l=this.context,m,t,p=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var o=new r(l[g]);if("table"===b)f=c.call(o,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(o,l[g],this[g],g),f!==k&&e.push(f);else if("column" [...]
+b||"row"===b||"cell"===b){t=this[g];"column-rows"===b&&(m=Ba(l[g],p.opts));i=0;for(n=t.length;i<n;i++)f=t[i],f="cell"===b?c.call(o,l[g],f.row,f.column,g,i):c.call(o,l[g],f,g,i,m),f!==k&&e.push(f)}}return e.length||d?(a=new r(l,a?e.concat.apply([],e):e),b=a.selector,b.rows=p.rows,b.cols=p.cols,b.opts=p.opts,a):this},lastIndexOf:w.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(w.map)b=w.map.call(this,a,this);else [...]
+0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new r(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:w.pop,push:w.push,reduce:w.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:w.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:w.reverse,selector:null,shift:w.shift,sort:w.sort,splice:w.splice,toArray:function(){return w.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){ret [...]
+unique:function(){return new r(this.context,pa(this))},unshift:w.unshift});r.extend=function(a,b,c){if(c.length&&b&&(b instanceof r||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);r.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,r.extend(a,b[f.name],f.propExt)}};r.register=p=function(a,b){if(h.isArray(a))for(var c=0,d= [...]
+d;c++)r.register(a[c],b);else for(var e=a.split("."),f=Tb,g,j,c=0,d=e.length;c<d;c++){g=(j=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var n=f.length;i<n;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};r.registerPlural=s=function(a,b,c){r.register(a,c);r.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof r?a.length?h.isArray(a[0])?ne [...]
+a[0]):a[0]:k:a})};p("tables()",function(a){var b;if(a){b=r;var c=this.context;if("number"===typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b=this;return b});p("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new r(b[0]):a});s("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});s("tables().body() [...]
+function(){return this.iterator("table",function(a){return a.nTBody},1)});s("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});s("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});s("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});p("draw()",function(a){return this.iterator("table",functio [...]
+a?O(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),T(b,!1===a))})});p("page()",function(a){return a===k?this.page.info().page:this.iterator("table",function(b){Ta(b,a)})});p("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsD [...]
+serverSide:"ssp"===y(a)}});p("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:k:this.iterator("table",function(b){Ra(b,a)})});var Ub=function(a,b,c){if(c){var d=new r(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))T(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();ra(a,[],function(c){na(a);for(var c=sa(a,c),d=0,e=c.length;d<e;d++)N(a,c[d]);T(a,b);C(a,!1)})}};p("ajax.json()",function(){var a=this.context;if(0<a.lengt [...]
+p("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});p("ajax.reload()",function(a,b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});p("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});p("ajax.url().load()",function(a,b){return this.iterator("table", [...]
+!1===b,a)})});var $a=function(a,b,c,d,e){var f=[],g,j,i,n,l,m;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(n=b.length;i<n;i++){j=b[i]&&b[i].split?b[i].split(","):[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=v.selector[a];if(a.length){i=0;for(n=a.length;i<n;i++)f=a[i](d,e,f)}return pa(f)},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:" [...]
+page:"all"},a)},bb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Ba=function(a,b){var c,d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:W(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,fun [...]
+h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};p("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!e)return[b];var j=Ba(c,e);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h [...]
+c.aoData[b];return a(b,e._aData,e.nTr)?b:null});b=Sb(ha(c.aoData,j,"nTr"));if(a.nodeName){if(a._DT_RowIndex!==k)return[a._DT_RowIndex];if(a._DT_CellIndex)return[a._DT_CellIndex.row];b=h(a).closest("*[data-dt-row]");return b.length?[b.data("dt-row")]:[]}if(typeof a==="string"&&a.charAt(0)==="#"){j=c.aIds[a.replace(/^#/,"")];if(j!==k)return[j.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});p("rows().nod [...]
+function(a,b){return a.aoData[b].nTr||k},1)});p("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ha(a.aoData,b,"_aData")},1)});s("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});s("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ca(b,c,a)})});s("rows().indexes()","row().index()",function(){return this.iter [...]
+function(a,b){return b},1)});s("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new r(c,b)});s("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,n,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l [...]
+l.length;i<n;i++)l[i]._DT_CellIndex.row=g}oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[d],c,!1);Sa(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});p("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(N(b,c));return h},1),c=this.rows(-1);c.pop();h.m [...]
+return c});p("row()",function(a,b){return bb(this.rows(a,b))});p("row().data()",function(a){var b=this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});p("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});p("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.no [...]
+ma(b,a)[0]:N(b,a)});return this.row(b[0])});var cb=function(a,b){var c=a.context;if(c.length&&(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=k,c._details=k},Vb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new r(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<G(g,"_details").length&& [...]
+function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(e===b)for(var c,d=aa(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&cb(f,c)}))}}};p("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&& [...]
+c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===a)cb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=aa(d),e.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(e);c._detailsShow&&c._details.insertAfter [...]
+p(["row().child.show()","row().child().show()"],function(){Vb(this,!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});p(["row().child.remove()","row().child().remove()"],function(){cb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var ec=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(B(a, [...]
+return c};p("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,j=G(g,"sName"),i=G(g,"nTh");return $a("column",e,function(a){var b=Pb(a);if(a==="")return W(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Ba(c,f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(ec):"";if(k)switch(k[2]){case "visIdx":case "visible":b [...]
+10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[Z(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});s("col [...]
+"column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});s("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});s("columns().data()","column().data()",function(){return this.iterator("column-rows",Wb,1)});s("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});s("columns().cache()","colum [...]
+function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ha(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});s("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ha(a.aoData,e,"anCells",b)},1)});s("columns().visible()","column().visible()",function(a,b){var c=this.iterator("column",function(b,c){if(a===k)return b.aoColumns[c].bVisible;var f=b.aoColumns,g=f[c],j=b.aoData,i,n,l;if(a!==k&&g.bVisible!== [...]
+h.inArray(!0,G(f,"bVisible"),c+1);i=0;for(n=j.length;i<n;i++)l=j[i].nTr,f=j[i].anCells,l&&l.insertBefore(f[c],f[m]||null)}else h(G(b.aoData,"anCells",c)).detach();g.bVisible=a;ea(b,b.aoHeader);ea(b,b.aoFooter);wa(b)}});a!==k&&(this.iterator("column",function(c,e){u(c,null,"column-visibility",[c,e,a,b])}),(b===k||b)&&this.columns.adjust());return c});s("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});p("col [...]
+function(){return this.iterator("table",function(a){Y(a)},1)});p("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return Z(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});p("column()",function(a,b){return bb(this.columns(a,b))});p("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a, [...]
+b.aoData,g=Ba(b,e),j=Sb(ha(f,g,"anCells")),i=h([].concat.apply([],j)),l,n=b.aoColumns.length,m,p,r,u,v,s;return $a("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){m=[];p=0;for(r=g.length;p<r;p++){l=g[p];for(u=0;u<n;u++){v={row:l,column:u};if(c){s=f[l];a(v,B(b,l,u),s.anCells?s.anCells[u]:null)&&m.push(v)}else m.push(v)}}return m}if(h.isPlainObject(a))return[a];c=i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray(); [...]
+!a.nodeName)return c;s=h(a).closest("*[data-dt-row]");return s.length?[{row:s.data("dt-row"),column:s.data("dt-column")}]:[]},b,e)});var d=this.columns(b,c),e=this.rows(a,c),f,g,j,i,n,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(n=d[b].length;i<n;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});s("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a [...]
+a.anCells?a.anCells[c]:k},1)});p("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});s("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});s("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});s("cells().indexes()","cell().index()",function(){return this.iterator("cell",f [...]
+b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});s("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ca(b,c,a,d)})});p("cell()",function(a,b,c){return bb(this.cells(a,b,c))});p("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;jb(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});p("order()",function(a,b){var c=this.context;if(a=== [...]
+c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:a.length&&!h.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});p("order.listener()",function(a,b,c){return this.iterator("table",function(d){Ma(d,a,b,c)})});p("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});p(["co [...]
+"column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});p("search()",function(a,b,c,d){var e=this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&fa(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});s("columns().search()","column().search()",f [...]
+b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),fa(e,e.oPreviousSearch,1))})});p("state()",function(){return this.context.length?this.context[0].oSavedState:null});p("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});p("state.loaded()",function( [...]
+this.context[0].oLoadedState:null});p("state.save()",function(){return this.iterator("table",function(a){wa(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrol [...]
+null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new r(c):c};m.camelToHungarian=K;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments); [...]
+(a[0]+=".dt");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",function(a){na(a)})});p("settings()",function(){return new r(this.context,this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return G(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrap [...]
+d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),p;b.bDestroying=!0;u(b,"aoDestroyCallback","destroy",[b]);a||(new r(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(D).unbind(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];va(b);h(l).removeCla [...]
+h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+d.sSortIcon+", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.childr [...]
+p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){p(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,n){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,n)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=Q(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.12";m.settings=[];m.models={};m.models.o [...]
+sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,s [...]
+sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback [...]
+fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:funct [...]
+a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in tabl [...]
+sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrol [...]
+renderer:null,rowId:"DT_RowId"};X(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};X(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null, [...]
+bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoH [...]
+aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json: [...]
+fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnD [...]
+this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=v={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},re [...]
+header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(v,{afnFiltering:v.search,aTypes:v.type.detect,ofnSearch:v.type.search,oSort:v.type.order,afnSortData:v.order,aoFeatures:v.feature,oApi:v.internal,oStdClasses:v.classes,oPagination:v.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disa [...]
+sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_sc [...]
+sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Ca="",Ca="",H=Ca+"ui-state-default",ia=Ca+"css_right ui-icon ui-icon-",Xb=Ca+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m. [...]
+m.ext.classes,{sPageButton:"fg-button ui-button "+H,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:H+" sorting_asc",sSortDesc:H+" sorting_desc",sSortable:H+" sorting",sSortableAsc:H+" sorting_asc_disabled",sSortableDesc:H+" sorting_desc_disabled",sSortableNone:H+" sorting_disabled",sSortJUIAsc:ia+"triangle-1-n",sSortJUIDesc:ia+"triangle-1-s",sSortJ [...]
+sSortJUIAscAllowed:ia+"carat-1-n",sSortJUIDescAllowed:ia+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+H,sScrollFoot:"dataTables_scrollFoot "+H,sHeaderTH:H,sFooterTH:H,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){r [...]
+b)]},simple_numbers:function(a,b){return["previous",ya(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ya(a,b),"next","last"]},_numbers:ya,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},k,l,m=0,p=function(b,d){var o,r,u,s,v=function(b){Ta(a,b.data.action,true)};o=0;for(r=d.length;o<r;o++){s=d[o];if(h.isArray(s)){u=h("<"+(s.DT_el||"div")+"/>").appendTo(b);p(u,s) [...]
+l="";switch(s){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":k=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":k=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":k=j.sNext;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":k=j.sLast;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:k=s+1;l=e===s?g.sPageButtonActive:""}if(k!==null){u=h("<a>",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableI [...]
+"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(k).appendTo(b);Wa(u,{action:s},v);m++}}}},r;try{r=h(b).find(I.activeElement).data("dt-idx")}catch(o){}p(h(b).empty(),d);r&&h(b).find("[data-dt-idx="+r+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||M(a [...]
+null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Aa,""):""},string:function(a){return M(a)?a:"string"===typeof a?a. [...]
+" "):a}});var za=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(v.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return M(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc": [...]
+b){return a<b?1:a>b?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",f [...]
+f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Yb=function(a){return"string"===typeof a?a.replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):a};m.rend [...]
+b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Yb(f);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:Yb}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:lb,_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:sa,_fnAddColumn:Ea,_fnCol [...]
+_fnAdjustColumnSizing:Y,_fnVisibleToColumnIndex:Z,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:la,_fnColumnTypes:Ga,_fnApplyColumnDefs:ib,_fnHungarianMap:X,_fnCamelToHungarian:K,_fnLanguageCompat:Da,_fnBrowserDetect:gb,_fnAddData:N,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:jb,_fnSplitObjNotation:Ja,_fnGetObjectDataF [...]
+_fnGetDataMaster:Ka,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ca,_fnGetRowElements:Ia,_fnCreateTr:Ha,_fnBuildHead:kb,_fnDrawHead:ea,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:nb,_fnDetectHeader:da,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:pb,_fnFilterComplete:fa,_fnFilterCustom:yb,_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Pa,_fnEscapeRegex:Qa,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb,_fnInfoMacros:Db,_fnInitialise:ga,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFe [...]
+_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:ka,_fnApplyToChildren:J,_fnCalculateColumnWidths:Fa,_fnThrottle:Oa,_fnConvertToWidth:Fb,_fnGetWidestNode:Gb,_fnGetMaxLenString:Hb,_fnStringToCss:x,_fnSortFlatten:V,_fnSort:mb,_fnSortAria:Jb,_fnSortListener:Va,_fnSortAttachListener:Ma,_fnSortingClasses:va,_fnSortData:Ib,_fnSaveState:wa,_fnLoadState:Kb,_fnSettingsFromNode:xa,_fnLog:L,_fnMap:E,_fnBindAction:Wa,_ [...]
+_fnCallbackFire:u,_fnLengthOverflow:Sa,_fnRenderer:Na,_fnDataSource:y,_fnRowAttributes:La,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});
diff --git a/inst/htmlwidgets/lib/datatables/license.txt b/inst/htmlwidgets/lib/datatables/license.txt
new file mode 100644
index 0000000..e22fb65
--- /dev/null
+++ b/inst/htmlwidgets/lib/datatables/license.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2008-2015 SpryMedia Limited
+http://datatables.net
+
+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/htmlwidgets/lib/jquery/LICENSE.txt b/inst/htmlwidgets/lib/jquery/LICENSE.txt
new file mode 100644
index 0000000..5bf4f5e
--- /dev/null
+++ b/inst/htmlwidgets/lib/jquery/LICENSE.txt
@@ -0,0 +1,37 @@
+Copyright 2005, 2014 jQuery Foundation and other contributors,
+https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+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.
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
diff --git a/inst/htmlwidgets/lib/jquery/jquery.min.js b/inst/htmlwidgets/lib/jquery/jquery.min.js
new file mode 100644
index 0000000..e836475
--- /dev/null
+++ b/inst/htmlwidgets/lib/jquery/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.12.4 | (c) jQuery Foundation | 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=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r [...]
+}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.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()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d& [...]
+marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return v [...]
+padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){ [...]
diff --git a/inst/htmlwidgets/lib/nouislider/jquery.nouislider.min.css b/inst/htmlwidgets/lib/nouislider/jquery.nouislider.min.css
new file mode 100644
index 0000000..3b7014b
--- /dev/null
+++ b/inst/htmlwidgets/lib/nouislider/jquery.nouislider.min.css
@@ -0,0 +1,4 @@
+/*! noUiSlider - 7.0.10 - 2015-03-17 17:30:22 */
+
+
+.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-user-select:none;-ms-touch-action:none;-ms-user-select:none;-moz-user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative;direction:ltr}.noUi-base{width:100%;height:100%;position:relative}.noUi-origin{position:absolute;right:0;top:0;left:0;bottom:0}.noUi-handle{position:relative;z-index:1}.noUi-stacking .noUi-handle{z-index:10}.noUi-state-tap .noUi-origin{-webkit-transition:left .3s,top [...]
\ No newline at end of file
diff --git a/inst/htmlwidgets/lib/nouislider/jquery.nouislider.min.js b/inst/htmlwidgets/lib/nouislider/jquery.nouislider.min.js
new file mode 100644
index 0000000..03b5244
--- /dev/null
+++ b/inst/htmlwidgets/lib/nouislider/jquery.nouislider.min.js
@@ -0,0 +1,3 @@
+/*! noUiSlider - 7.0.10 - 2015-03-17 17:30:22 */
+
+!function(a){"use strict";function b(a,b){return Math.round(a/b)*b}function c(a){return"number"==typeof a&&!isNaN(a)&&isFinite(a)}function d(a){var b=Math.pow(10,7);return Number((Math.round(a*b)/b).toFixed(7))}function e(a,b,c){a.addClass(b),setTimeout(function(){a.removeClass(b)},c)}function f(a){return Math.max(Math.min(a,100),0)}function g(b){return a.isArray(b)?b:[b]}function h(a){var b=a.split(".");return b.length>1?b[1].length:0}function i(a,b){return 100/(b-a)}function j(a,b){ret [...]
\ No newline at end of file
diff --git a/inst/htmlwidgets/lib/selectize/selectize.bootstrap3.css b/inst/htmlwidgets/lib/selectize/selectize.bootstrap3.css
new file mode 100644
index 0000000..6779260
--- /dev/null
+++ b/inst/htmlwidgets/lib/selectize/selectize.bootstrap3.css
@@ -0,0 +1,401 @@
+/**
+ * selectize.bootstrap3.css (v0.12.0) - Bootstrap 3 Theme
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
+ *
+ * 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.
+ *
+ * @author Brian Reavis <brian at thirdroute.com>
+ */
+.selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
+  visibility: visible !important;
+  background: #f2f2f2 !important;
+  background: rgba(0, 0, 0, 0.06) !important;
+  border: 0 none !important;
+  -webkit-box-shadow: inset 0 0 12px 4px #ffffff;
+  box-shadow: inset 0 0 12px 4px #ffffff;
+}
+.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
+  content: '!';
+  visibility: hidden;
+}
+.selectize-control.plugin-drag_drop .ui-sortable-helper {
+  -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+}
+.selectize-dropdown-header {
+  position: relative;
+  padding: 3px 12px;
+  border-bottom: 1px solid #d0d0d0;
+  background: #f8f8f8;
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.selectize-dropdown-header-close {
+  position: absolute;
+  right: 12px;
+  top: 50%;
+  color: #333333;
+  opacity: 0.4;
+  margin-top: -12px;
+  line-height: 20px;
+  font-size: 20px !important;
+}
+.selectize-dropdown-header-close:hover {
+  color: #000000;
+}
+.selectize-dropdown.plugin-optgroup_columns .optgroup {
+  border-right: 1px solid #f2f2f2;
+  border-top: 0 none;
+  float: left;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
+  border-right: 0 none;
+}
+.selectize-dropdown.plugin-optgroup_columns .optgroup:before {
+  display: none;
+}
+.selectize-dropdown.plugin-optgroup_columns .optgroup-header {
+  border-top: 0 none;
+}
+.selectize-control.plugin-remove_button [data-value] {
+  position: relative;
+  padding-right: 24px !important;
+}
+.selectize-control.plugin-remove_button [data-value] .remove {
+  z-index: 1;
+  /* fixes ie bug (see #392) */
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  width: 17px;
+  text-align: center;
+  font-weight: bold;
+  font-size: 12px;
+  color: inherit;
+  text-decoration: none;
+  vertical-align: middle;
+  display: inline-block;
+  padding: 1px 0 0 0;
+  border-left: 1px solid rgba(0, 0, 0, 0);
+  -webkit-border-radius: 0 2px 2px 0;
+  -moz-border-radius: 0 2px 2px 0;
+  border-radius: 0 2px 2px 0;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.selectize-control.plugin-remove_button [data-value] .remove:hover {
+  background: rgba(0, 0, 0, 0.05);
+}
+.selectize-control.plugin-remove_button [data-value].active .remove {
+  border-left-color: rgba(0, 0, 0, 0);
+}
+.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
+  background: none;
+}
+.selectize-control.plugin-remove_button .disabled [data-value] .remove {
+  border-left-color: rgba(77, 77, 77, 0);
+}
+.selectize-control {
+  position: relative;
+}
+.selectize-dropdown,
+.selectize-input,
+.selectize-input input {
+  color: #333333;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: 20px;
+  -webkit-font-smoothing: inherit;
+}
+.selectize-input,
+.selectize-control.single .selectize-input.input-active {
+  background: #ffffff;
+  cursor: text;
+  display: inline-block;
+}
+.selectize-input {
+  border: 1px solid #cccccc;
+  padding: 6px 12px;
+  display: inline-block;
+  width: 100%;
+  overflow: hidden;
+  position: relative;
+  z-index: 1;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.selectize-control.multi .selectize-input.has-items {
+  padding: 5px 12px 2px;
+}
+.selectize-input.full {
+  background-color: #ffffff;
+}
+.selectize-input.disabled,
+.selectize-input.disabled * {
+  cursor: default !important;
+}
+.selectize-input.focus {
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
+}
+.selectize-input.dropdown-active {
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.selectize-input > * {
+  vertical-align: baseline;
+  display: -moz-inline-stack;
+  display: inline-block;
+  zoom: 1;
+  *display: inline;
+}
+.selectize-control.multi .selectize-input > div {
+  cursor: pointer;
+  margin: 0 3px 3px 0;
+  padding: 1px 3px;
+  background: #efefef;
+  color: #333333;
+  border: 0 solid rgba(0, 0, 0, 0);
+}
+.selectize-control.multi .selectize-input > div.active {
+  background: #428bca;
+  color: #ffffff;
+  border: 0 solid rgba(0, 0, 0, 0);
+}
+.selectize-control.multi .selectize-input.disabled > div,
+.selectize-control.multi .selectize-input.disabled > div.active {
+  color: #808080;
+  background: #ffffff;
+  border: 0 solid rgba(77, 77, 77, 0);
+}
+.selectize-input > input {
+  display: inline-block !important;
+  padding: 0 !important;
+  min-height: 0 !important;
+  max-height: none !important;
+  max-width: 100% !important;
+  margin: 0 !important;
+  text-indent: 0 !important;
+  border: 0 none !important;
+  background: none !important;
+  line-height: inherit !important;
+  -webkit-user-select: auto !important;
+  -webkit-box-shadow: none !important;
+  box-shadow: none !important;
+}
+.selectize-input > input::-ms-clear {
+  display: none;
+}
+.selectize-input > input:focus {
+  outline: none !important;
+}
+.selectize-input::after {
+  content: ' ';
+  display: block;
+  clear: left;
+}
+.selectize-input.dropdown-active::before {
+  content: ' ';
+  display: block;
+  position: absolute;
+  background: #ffffff;
+  height: 1px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.selectize-dropdown {
+  position: absolute;
+  z-index: 10;
+  border: 1px solid #d0d0d0;
+  background: #ffffff;
+  margin: -1px 0 0 0;
+  border-top: 0 none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.selectize-dropdown [data-selectable] {
+  cursor: pointer;
+  overflow: hidden;
+}
+.selectize-dropdown [data-selectable] .highlight {
+  background: rgba(255, 237, 40, 0.4);
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+}
+.selectize-dropdown [data-selectable],
+.selectize-dropdown .optgroup-header {
+  padding: 3px 12px;
+}
+.selectize-dropdown .optgroup:first-child .optgroup-header {
+  border-top: 0 none;
+}
+.selectize-dropdown .optgroup-header {
+  color: #777777;
+  background: #ffffff;
+  cursor: default;
+}
+.selectize-dropdown .active {
+  background-color: #f5f5f5;
+  color: #262626;
+}
+.selectize-dropdown .active.create {
+  color: #262626;
+}
+.selectize-dropdown .create {
+  color: rgba(51, 51, 51, 0.5);
+}
+.selectize-dropdown-content {
+  overflow-y: auto;
+  overflow-x: hidden;
+  max-height: 200px;
+}
+.selectize-control.single .selectize-input,
+.selectize-control.single .selectize-input input {
+  cursor: pointer;
+}
+.selectize-control.single .selectize-input.input-active,
+.selectize-control.single .selectize-input.input-active input {
+  cursor: text;
+}
+.selectize-control.single .selectize-input:after {
+  content: ' ';
+  display: block;
+  position: absolute;
+  top: 50%;
+  right: 17px;
+  margin-top: -3px;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-width: 5px 5px 0 5px;
+  border-color: #333333 transparent transparent transparent;
+}
+.selectize-control.single .selectize-input.dropdown-active:after {
+  margin-top: -4px;
+  border-width: 0 5px 5px 5px;
+  border-color: transparent transparent #333333 transparent;
+}
+.selectize-control.rtl.single .selectize-input:after {
+  left: 17px;
+  right: auto;
+}
+.selectize-control.rtl .selectize-input > input {
+  margin: 0 4px 0 -2px !important;
+}
+.selectize-control .selectize-input.disabled {
+  opacity: 0.5;
+  background-color: #ffffff;
+}
+.selectize-dropdown,
+.selectize-dropdown.form-control {
+  height: auto;
+  padding: 0;
+  margin: 2px 0 0 0;
+  z-index: 1000;
+  background: #ffffff;
+  border: 1px solid #cccccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+}
+.selectize-dropdown .optgroup-header {
+  font-size: 12px;
+  line-height: 1.42857143;
+}
+.selectize-dropdown .optgroup:first-child:before {
+  display: none;
+}
+.selectize-dropdown .optgroup:before {
+  content: ' ';
+  display: block;
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  margin-left: -12px;
+  margin-right: -12px;
+}
+.selectize-dropdown-content {
+  padding: 5px 0;
+}
+.selectize-dropdown-header {
+  padding: 6px 12px;
+}
+.selectize-input {
+  min-height: 34px;
+}
+.selectize-input.dropdown-active {
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.selectize-input.dropdown-active::before {
+  display: none;
+}
+.selectize-input.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, 0.6);
+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+.has-error .selectize-input {
+  border-color: #a94442;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-error .selectize-input:focus {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+}
+.selectize-control.multi .selectize-input.has-items {
+  padding-left: 9px;
+  padding-right: 9px;
+}
+.selectize-control.multi .selectize-input > div {
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.form-control.selectize-control {
+  padding: 0;
+  height: auto;
+  border: none;
+  background: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
diff --git a/inst/htmlwidgets/lib/selectize/selectize.min.js b/inst/htmlwidgets/lib/selectize/selectize.min.js
new file mode 100644
index 0000000..fe955bc
--- /dev/null
+++ b/inst/htmlwidgets/lib/selectize/selectize.min.js
@@ -0,0 +1,3 @@
+/*! selectize.js - v0.12.1 | https://github.com/brianreavis/selectize.js | Apache License (v2) */
+!function(a,b){"function"==typeof define&&define.amd?define("sifter",b):"object"==typeof exports?module.exports=b():a.Sifter=b()}(this,function(){var a=function(a,b){this.items=a,this.settings=b||{diacritics:!0}};a.prototype.tokenize=function(a){if(a=d(String(a||"").toLowerCase()),!a||!a.length)return[];var b,c,f,h,i=[],j=a.split(/ +/);for(b=0,c=j.length;c>b;b++){if(f=e(j[b]),this.settings.diacritics)for(h in g)g.hasOwnProperty(h)&&(f=f.replace(new RegExp(h,"g"),g[h]));i.push({string:j[b [...]
+b&&(b.preventDefault(),b.stopPropagation())}else(l.isFocused||"single"===l.settings.mode)&&l.items.length&&(0>e&&0===f.start&&0===f.length?g.push(l.items[l.caretPos-1]):e>0&&f.start===l.$control_input.val().length&&g.push(l.items[l.caretPos]));if(!g.length||"function"==typeof l.settings.onDelete&&l.settings.onDelete.apply(l,[g])===!1)return!1;for("undefined"!=typeof h&&l.setCaret(h);g.length;)l.removeItem(g.pop());return l.showInput(),l.positionDropdown(),l.refreshOptions(!0),i&&(j=l.get [...]
\ No newline at end of file
diff --git a/man/DT-imports.Rd b/man/DT-imports.Rd
new file mode 100644
index 0000000..a086c39
--- /dev/null
+++ b/man/DT-imports.Rd
@@ -0,0 +1,12 @@
+\name{DT-imports}
+\alias{JS}
+\alias{saveWidget}
+\alias{\%>\%}
+\docType{import}
+\title{Objects imported from other packages}
+\description{
+These objects are imported from other packages. Follow the links to their documentation.
+\describe{
+  \item{htmlwidgets}{\code{\link[htmlwidgets:JS]{JS}}, \code{\link[htmlwidgets:saveWidget]{saveWidget}}}
+  \item{magrittr}{\code{\link[magrittr:\%>\%]{\%>\%}}}
+}}
diff --git a/man/dataTableAjax.Rd b/man/dataTableAjax.Rd
new file mode 100644
index 0000000..7da3e3f
--- /dev/null
+++ b/man/dataTableAjax.Rd
@@ -0,0 +1,71 @@
+% Please edit documentation in R/shiny.R
+\name{dataTableAjax}
+\alias{dataTableAjax}
+\title{Register a data object in a shiny session for DataTables}
+\usage{
+dataTableAjax(session, data, rownames, filter = dataTablesFilter, outputId)
+}
+\arguments{
+\item{session}{the \code{session} object in the shiny server function
+(\code{function(input, output, session)})}
+
+\item{data}{a data object (will be coerced to a data frame internally)}
+
+\item{rownames}{see \code{\link{datatable}()}; it must be consistent with
+what you use in \code{datatable()}, e.g. if the widget is generated by
+\code{datatable(rownames = FALSE)}, you must also use
+\code{dataTableAjax(rownames = FALSE)} here}
+
+\item{filter}{(for expert use only) a function with two arguments \code{data}
+and \code{params} (Ajax parameters, a list of the form \code{list(search =
+list(value = 'FOO', regex = 'false'), length = 10, ...)}) that return the
+filtered table result according to the DataTables Ajax request}
+
+\item{outputId}{the output ID of the table (the same ID passed to
+\code{dataTableOutput()}; if missing, a random string)}
+}
+\value{
+A character string (an Ajax URL that can be queried by DataTables).
+}
+\description{
+This function stores a data object in a shiny session and returns a URL that
+returns JSON data based on DataTables Ajax requests. The URL can be used as
+the \code{url} option inside the \code{ajax} option of the table. It is
+basically an implementation of server-side processing of DataTables in R.
+Filtering, sorting, and pagination are processed through R instead of
+JavaScript (client-side processing).
+}
+\details{
+Normally you should not need to call this function directly. It is called
+internally when a table widget is rendered in a Shiny app to configure the
+table option \code{ajax} automatically. If you are familiar with
+\pkg{DataTables}' server-side processing, and want to use a custom filter
+function, you may call this function to get an Ajax URL.
+}
+\examples{
+DTApp = function(data, ..., options = list()) {
+  library(shiny)
+  library(DT)
+  shinyApp(
+    ui = fluidPage(
+      title = 'Server-side processing of DataTables',
+      fluidRow(
+        DT::dataTableOutput('tbl')
+      )
+    ),
+    server = function(input, output, session) {
+      options$serverSide = TRUE
+      options$ajax = list(url = dataTableAjax(session, data))
+      # create a widget using an Ajax URL created above
+      widget = datatable(data, ..., options = options)
+      output$tbl = DT::renderDataTable(widget)
+    }
+  )
+}
+
+if (interactive()) DTApp(iris)
+if (interactive()) DTApp(iris, filter = 'top')
+}
+\references{
+\url{http://rstudio.github.io/DT/server.html}
+}
diff --git a/man/dataTableOutput.Rd b/man/dataTableOutput.Rd
new file mode 100644
index 0000000..970535f
--- /dev/null
+++ b/man/dataTableOutput.Rd
@@ -0,0 +1,58 @@
+% Please edit documentation in R/shiny.R
+\name{dataTableOutput}
+\alias{dataTableOutput}
+\alias{renderDataTable}
+\title{Helper functions for using DT in Shiny}
+\usage{
+dataTableOutput(outputId, width = "100\%", height = "auto")
+
+renderDataTable(expr, server = TRUE, env = parent.frame(), quoted = FALSE, ...)
+}
+\arguments{
+\item{outputId}{output variable to read the table from}
+
+\item{width}{the width of the table container}
+
+\item{height}{the height of the table container}
+
+\item{expr}{an expression to create a table widget (normally via
+\code{\link{datatable}()}), or a data object to be passed to
+\code{datatable()} to create a table widget}
+
+\item{server}{whether to use server-side processing. If \code{TRUE}, then the
+data is kept on the server and the browser requests a page at a time; if
+\code{FALSE}, then the entire data frame is sent to the browser at once.
+Highly recommended for medium to large data frames, which can cause
+browsers to slow down or crash.}
+
+\item{env}{The environment in which to evaluate \code{expr}.}
+
+\item{quoted}{Is \code{expr} a quoted expression (with \code{quote()})? This
+is useful if you want to save an expression in a variable.}
+
+\item{...}{ignored when \code{expr} returns a table widget, and passed as
+additional arguments to \code{datatable()} when \code{expr} returns a data
+object}
+}
+\description{
+These two functions are like most \code{fooOutput()} and \code{renderFoo()}
+functions in the \pkg{shiny} package. The former is used to create a
+container for table, and the latter is used in the server logic to render the
+table.
+}
+\examples{
+if (interactive()) {
+  library(shiny)
+  shinyApp(
+    ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
+    server = function(input, output) {
+      output$tbl = DT::renderDataTable(
+        iris, options = list(lengthChange = FALSE)
+      )
+    }
+  )
+}
+}
+\references{
+\url{http://rstudio.github.io/DT/shiny.html}
+}
diff --git a/man/datatable.Rd b/man/datatable.Rd
new file mode 100644
index 0000000..c28296f
--- /dev/null
+++ b/man/datatable.Rd
@@ -0,0 +1,134 @@
+% Please edit documentation in R/datatables.R
+\name{datatable}
+\alias{datatable}
+\title{Create an HTML table widget using the DataTables library}
+\usage{
+datatable(data, options = list(), class = "display", callback = JS("return table;"), 
+    rownames, colnames, container, caption = NULL, filter = c("none", 
+        "bottom", "top"), escape = TRUE, style = "default", width = NULL, 
+    height = NULL, elementId = NULL, fillContainer = getOption("DT.fillContainer", 
+        NULL), autoHideNavigation = getOption("DT.autoHideNavigation", 
+        NULL), selection = c("multiple", "single", "none"), extensions = list(), 
+    plugins = NULL)
+}
+\arguments{
+\item{data}{a data object (either a matrix or a data frame)}
+
+\item{options}{a list of initialization options (see
+\url{http://datatables.net/reference/option/}); the character options
+wrapped in \code{\link[htmlwidgets]{JS}()} will be treated as literal
+JavaScript code instead of normal character strings; you can also set
+options globally via \code{\link{options}(DT.options = list(...))}, and
+global options will be merged into this \code{options} argument if set}
+
+\item{class}{the CSS class(es) of the table; see
+\url{http://datatables.net/manual/styling/classes}}
+
+\item{callback}{the body of a JavaScript callback function with the argument
+\code{table} to be applied to the DataTables instance (i.e. \code{table})}
+
+\item{rownames}{\code{TRUE} (show row names) or \code{FALSE} (hide row names)
+or a character vector of row names; by default, the row names are displayed
+in the first column of the table if exist (not \code{NULL})}
+
+\item{colnames}{if missing, the column names of the data; otherwise it can be
+an unnamed character vector of names you want to show in the table header
+instead of the default data column names; alternatively, you can provide a
+\emph{named} numeric or character vector of the form \code{'newName1' = i1,
+'newName2' = i2} or \code{c('newName1' = 'oldName1', 'newName2' =
+'oldName2', ...)}, where \code{newName} is the new name you want to show in
+the table, and \code{i} or \code{oldName} is the index of the current
+column name}
+
+\item{container}{a sketch of the HTML table to be filled with data cells; by
+default, it is generated from \code{htmltools::tags$table()} with a table
+header consisting of the column names of the data}
+
+\item{caption}{the table caption; a character vector or a tag object
+generated from \code{htmltools::tags$caption()}}
+
+\item{filter}{whether/where to use column filters; \code{none}: no filters;
+\code{bottom/top}: put column filters at the bottom/top of the table; range
+sliders are used to filter numeric/date/time columns, select lists are used
+for factor columns, and text input boxes are used for character columns; if
+you want more control over the styles of filters, you can provide a list to
+this argument of the form \code{list(position = 'top', clear = TRUE, plain
+= FALSE)}, where \code{clear} indicates whether you want the clear buttons
+in the input boxes, and \code{plain} means if you want to use Bootstrap
+form styles or plain text input styles for the text input boxes}
+
+\item{escape}{whether to escape HTML entities in the table: \code{TRUE} means
+to escape the whole table, and \code{FALSE} means not to escape it;
+alternatively, you can specify numeric column indices or column names to
+indicate which columns to escape, e.g. \code{1:5} (the first 5 columns),
+\code{c(1, 3, 4)}, or \code{c(-1, -3)} (all columns except the first and
+third), or \code{c('Species', 'Sepal.Length')}}
+
+\item{style}{the style name (\url{http://datatables.net/manual/styling/});
+currently only \code{'default'} and \code{'bootstrap'} are supported}
+
+\item{width, height}{Width/Height in pixels (optional, defaults to automatic
+sizing)}
+
+\item{elementId}{An id for the widget (a random string by default).}
+
+\item{fillContainer}{\code{TRUE} to configure the table to automatically fill
+it's containing element. If the table can't fit fully into it's container
+then vertical and/or horizontal scrolling of the table cells will occur.}
+
+\item{autoHideNavigation}{\code{TRUE} to automatically hide navigational UI
+when the number of total records is less than the page size.}
+
+\item{selection}{the row/column selection mode (single or multiple selection
+or disable selection) when a table widget is rendered in a Shiny app;
+alternatively, you can use a list of the form \code{list(mode = 'multiple',
+selected = c(1, 3, 8), target = 'row')} to pre-select rows; the element
+\code{target} in the list can be \code{'column'} to enable column
+selection, or \code{'row+column'} to make it possible to select both rows
+and columns (click on the footer to select columns), or \code{'cell'} to
+select cells}
+
+\item{extensions}{a character vector of the names of the DataTables
+extensions (\url{http://datatables.net/extensions/index})}
+
+\item{plugins}{a character vector of the names of DataTables plug-ins
+(\url{http://rstudio.github.io/DT/plugins.html})}
+}
+\description{
+This function creates an HTML widget to display rectangular data (a matrix or
+data frame) using the JavaScript library DataTables.
+}
+\note{
+You are recommended to escape the table content for security reasons
+  (e.g. XSS attacks) when using this function in Shiny or any other dynamic
+  web applications.
+}
+\examples{
+library(DT)
+
+# see the package vignette for examples and the link to website
+vignette('DT', package = 'DT')
+
+# some boring edge cases for testing purposes
+m = matrix(nrow = 0, ncol = 5, dimnames = list(NULL, letters[1:5]))
+datatable(m)  # zero rows
+datatable(as.data.frame(m))
+
+m = matrix(1, dimnames = list(NULL, 'a'))
+datatable(m)  # one row and one column
+datatable(as.data.frame(m))
+
+m = data.frame(a = 1, b = 2, c = 3)
+datatable(m)
+datatable(as.matrix(m))
+
+# dates
+datatable(data.frame(
+  date = seq(as.Date("2015-01-01"), by = "day", length.out = 5), x = 1:5
+))
+datatable(data.frame(x = Sys.Date()))
+datatable(data.frame(x = Sys.time()))
+}
+\references{
+See \url{http://rstudio.github.io/DT} for the full documentation.
+}
diff --git a/man/formatCurrency.Rd b/man/formatCurrency.Rd
new file mode 100644
index 0000000..94b058a
--- /dev/null
+++ b/man/formatCurrency.Rd
@@ -0,0 +1,114 @@
+% Please edit documentation in R/format.R
+\name{formatCurrency}
+\alias{formatCurrency}
+\alias{formatDate}
+\alias{formatPercentage}
+\alias{formatRound}
+\alias{formatSignif}
+\alias{formatString}
+\alias{formatStyle}
+\title{Format table columns}
+\usage{
+formatCurrency(table, columns, currency = "$", interval = 3, mark = ",", digits = 2, 
+    dec.mark = getOption("OutDec"), before = TRUE)
+
+formatString(table, columns, prefix = "", suffix = "")
+
+formatPercentage(table, columns, digits = 0)
+
+formatRound(table, columns, digits = 2)
+
+formatSignif(table, columns, digits = 2)
+
+formatDate(table, columns, method = "toDateString")
+
+formatStyle(table, columns, valueColumns = columns, target = c("cell", "row"), 
+    fontWeight = NULL, color = NULL, backgroundColor = NULL, background = NULL, 
+    ...)
+}
+\arguments{
+\item{table}{a table object created from \code{\link{datatable}()}}
+
+\item{columns}{the indices of the columns to be formatted (can be character,
+numeric, logical, or a formula of the form \code{~ V1 + V2}, which is
+equivalent to \code{c('V1', 'V2')})}
+
+\item{currency}{the currency symbol}
+
+\item{interval}{put a marker after how many digits of the numbers}
+
+\item{mark}{the marker after every \code{interval} decimals in the numbers}
+
+\item{digits}{the number of decimal places to round to}
+
+\item{dec.mark}{a character to indicate the decimal point}
+
+\item{before}{whether to place the currency symbol before or after the values}
+
+\item{prefix}{string to put in front of the column values}
+
+\item{suffix}{string to put after the column values}
+
+\item{method}{the method(s) to convert a date to string in JavaScript; see
+\code{DT:::DateMethods} for a list of possible methods, and
+\url{http://mzl.la/1xGe99W} for a full reference}
+
+\item{valueColumns}{indices of the columns from which the cell values are
+obtained; this can be different with the \code{columns} argument, e.g. you
+may style one column based on the values of a different column}
+
+\item{target}{the target to apply the CSS styles to (the current cell or the
+full row)}
+
+\item{fontWeight}{the font weight, e.g. \code{'bold'} and \code{'normal'}}
+
+\item{color}{the font color, e.g. \code{'red'} and \code{'#ee00aa'}}
+
+\item{backgroundColor}{the background color of table cells}
+
+\item{background}{the background of table cells}
+
+\item{...}{other CSS properties, e.g. \code{'border'}, \code{'font-size'},
+\code{'text-align'}, and so on; if you want to condition CSS styles on the
+cell values, you may use the helper functions such as
+\code{\link{styleInterval}()}; note the actual CSS property names are
+dash-separated, but you can use camelCase names in this function (otherwise
+you will have to use backticks to quote the names, e.g. \code{`font-size` =
+'12px'}), and this function will automatically convert camelCase names to
+dash-separated names (e.g. \code{'fontWeight'} will be converted to
+\code{'font-weight'} internally)}
+}
+\description{
+Format numeric columns in a table as currency (\code{formatCurrency()}) or
+percentages (\code{formatPercentage()}), or round numbers to a specified
+number of decimal places (\code{formatRound()}), or a specified number
+of significant figures (\code{formatSignif()}).  The function
+\code{formatStyle()} applies CSS styles to table cells by column.
+}
+\examples{
+library(DT)
+m = cbind(matrix(rnorm(120, 1e5, 1e6), 40), runif(40), rnorm(40, 100))
+colnames(m) = head(LETTERS, ncol(m))
+m
+
+# format the columns A and C as currency, and D as percentages
+datatable(m) \%>\% formatCurrency(c('A', 'C')) \%>\% formatPercentage('D', 2)
+
+# the first two columns are Euro currency, and round column E to 3 decimal places
+datatable(m) \%>\% formatCurrency(1:2, '\\U20AC') \%>\% formatRound('E', 3)
+
+# render vapor pressure with only two significant figures.
+datatable(pressure) \%>\% formatSignif('pressure',2)
+
+# apply CSS styles to columns
+datatable(iris) \%>\%
+  formatStyle('Sepal.Length', fontWeight = styleInterval(5, c('bold', 'weight'))) \%>\%
+  formatStyle('Sepal.Width',
+    color = styleInterval(3.4, c('red', 'white')),
+    backgroundColor = styleInterval(3.4, c('yellow', 'gray'))
+  )
+}
+\references{
+See \url{http://rstudio.github.io/DT/functions.html} for detailed
+  documentation and examples.
+}
diff --git a/man/proxy.Rd b/man/proxy.Rd
new file mode 100644
index 0000000..4b366fd
--- /dev/null
+++ b/man/proxy.Rd
@@ -0,0 +1,95 @@
+% Please edit documentation in R/shiny.R
+\name{dataTableProxy}
+\alias{addRow}
+\alias{clearSearch}
+\alias{dataTableProxy}
+\alias{reloadData}
+\alias{selectCells}
+\alias{selectColumns}
+\alias{selectPage}
+\alias{selectRows}
+\alias{updateCaption}
+\alias{updateSearch}
+\title{Manipulate an existing DataTables instance in a Shiny app}
+\usage{
+dataTableProxy(outputId, session = shiny::getDefaultReactiveDomain(), 
+    deferUntilFlush = TRUE)
+
+selectRows(proxy, selected)
+
+selectColumns(proxy, selected)
+
+selectCells(proxy, selected)
+
+addRow(proxy, data)
+
+clearSearch(proxy)
+
+selectPage(proxy, page)
+
+updateCaption(proxy, caption)
+
+updateSearch(proxy, keywords = list(global = NULL, columns = NULL))
+
+reloadData(proxy, resetPaging = TRUE, clearSelection = c("all", "none", 
+    "row", "column", "cell"))
+}
+\arguments{
+\item{outputId}{the id of the table to be manipulated (the same id as the one
+you used in \code{\link{dataTableOutput}()})}
+
+\item{session}{the Shiny session object (from the server function of the
+Shiny app)}
+
+\item{deferUntilFlush}{whether an action should be carried out right away, or
+should be held until after the next time all of the outputs are updated}
+
+\item{proxy}{a proxy object returned by \code{dataTableProxy()}}
+
+\item{selected}{an integer vector of row/column indices, or a matrix of two
+columns (row and column indices, respectively) for cell indices; you may
+use \code{NULL} to clear existing selections}
+
+\item{data}{a single row of data to be added to the table; it can be a matrix
+or data frame of one row, or a vector or list of row data (in the latter
+case, please be cautious about the row name: if your table contains row
+names, here \code{data} must also contain the row name as the first
+element)}
+
+\item{page}{a number indicating the page to select}
+
+\item{caption}{a new table caption (see the \code{caption} argument of
+\code{\link{datatable}()})}
+
+\item{keywords}{a list of two components: \code{global} is the global search
+keyword of a single character string (ignored if \code{NULL});
+\code{columns} is a character vector of the search keywords for all columns
+(when the table has one column for the row names, this vector of keywords
+should contain one keyword for the row names as well)}
+
+\item{resetPaging}{whether to reset the paging position}
+
+\item{clearSelection}{which existing selections to clear: it can be any
+combinations of \code{row}, \code{column}, and \code{cell}, or \code{all}
+for all three, or \code{none} to keep current selections (by default, all
+selections are cleared after the data is reloaded)}
+}
+\description{
+The function \code{datatableProxy()} creates a proxy object that can be used
+to manipulate an existing DataTables instance in a Shiny app, e.g. select
+rows/columns, or add rows.
+}
+\note{
+\code{addRow()} only works for client-side tables. If you want to use
+  it in a Shiny app, make sure to use \code{renderDataTable(..., server =
+  FALSE)}.
+
+\code{reloadData()} only works for tables in the server-side processing
+  mode, e.g. tables rendered with \code{renderDataTable(server = TRUE)}. The
+  data to be reloaded (i.e. the one you pass to \code{dataTableAjax()}) must
+  have exactly the same number of columns as the previous data object in the
+  table.
+}
+\references{
+\url{http://rstudio.github.io/DT/shiny.html}
+}
diff --git a/man/replaceData.Rd b/man/replaceData.Rd
new file mode 100644
index 0000000..c185593
--- /dev/null
+++ b/man/replaceData.Rd
@@ -0,0 +1,29 @@
+% Please edit documentation in R/shiny.R
+\name{replaceData}
+\alias{replaceData}
+\title{Replace data in an existing table}
+\usage{
+replaceData(proxy, data, ..., resetPaging = TRUE, clearSelection = "all")
+}
+\arguments{
+\item{proxy}{a proxy object created by \code{dataTableProxy()}}
+
+\item{data}{the new data object to be loaded in the table}
+
+\item{...}{other arguments to be passed to \code{\link{dataTableAjax}()}}
+
+\item{resetPaging, clearSelection}{passed to \code{\link{reloadData}()}}
+}
+\description{
+Replace the data object of a table output and avoid regenerating the full
+table, in which case the state of the current table will be preserved
+(sorting, filtering, and pagination) and applied to the table with new data.
+}
+\note{
+When you replace the data in an existing table, please make sure the
+  new data has the same number of columns as the current data. When you have
+  enabled column filters, you should also make sure the attributes of every
+  column remain the same, e.g. factor columns should have the same or fewer
+  levels, and numeric columns should have the same or smaller range,
+  otherwise the filters may never be able to reach certain rows in the data.
+}
diff --git a/man/styleInterval.Rd b/man/styleInterval.Rd
new file mode 100644
index 0000000..dc1fb3d
--- /dev/null
+++ b/man/styleInterval.Rd
@@ -0,0 +1,58 @@
+% Please edit documentation in R/format.R
+\name{styleInterval}
+\alias{styleColorBar}
+\alias{styleEqual}
+\alias{styleInterval}
+\title{Conditional CSS styles}
+\usage{
+styleInterval(cuts, values)
+
+styleEqual(levels, values)
+
+styleColorBar(data, color, angle = 90)
+}
+\arguments{
+\item{cuts}{a vector of cut points (sorted increasingly)}
+
+\item{values}{a vector of CSS values}
+
+\item{levels}{a character vector of data values to be mapped (one-to-one) to
+CSS values}
+
+\item{data}{a numeric vector whose range will be used for scaling the
+table data from 0-100 before being represented as color bars. A vector
+of length 2 is acceptable here for specifying a range possibly wider or
+narrower than the range of the table data itself.}
+
+\item{color}{the color of the bars}
+
+\item{angle}{a number of degrees representing the direction to fill the
+gradient relative to a horizontal line and the gradient line, going
+counter-clockwise. For example, 90 fills right to left and -90 fills
+left to right.}
+}
+\description{
+A few helper functions for the \code{\link{formatStyle}()} function to
+calculate CSS styles for table cells based on the cell values. Under the
+hood, they just generate JavaScript and CSS code from the values specified in
+R.
+}
+\details{
+The function \code{styleInterval()} maps intervals to CSS values. Its
+argument \code{values} must be of length \code{n + 1} where \code{n =
+length(cuts)}. The right-closed interval \samp{(cuts[i - 1], cuts[i]]} is
+mapped to \samp{values[i]} for \samp{i = 2, 3, ..., n}; \samp{values[1]} is
+for the interval \samp{(-Inf, cuts[1]]}, and \samp{values[n + 1]} is for
+\samp{(cuts[n], +Inf)}. You can think of the order of \code{cuts} and
+\code{values} using this diagram: \samp{-Inf -> values[1] -> cuts[1] ->
+values[2] -> cuts[2] -> ... -> values[n] -> cuts[n] -> values[n + 1] ->
++Inf}.
+
+The function \code{styleEqual()} maps data values to CSS values in the
+one-to-one manner, i.e. \code{values[i]} is used when the table cell value is
+\code{levels[i]}.
+
+The function \code{styleColorBar()} can be used to draw background color bars
+behind table cells in a column, and the width of bars is proportional to the
+column values.
+}
diff --git a/man/tableHeader.Rd b/man/tableHeader.Rd
new file mode 100644
index 0000000..7ae4418
--- /dev/null
+++ b/man/tableHeader.Rd
@@ -0,0 +1,33 @@
+% Please edit documentation in R/datatables.R
+\name{tableHeader}
+\alias{tableFooter}
+\alias{tableHeader}
+\title{Generate a table header or footer from column names}
+\usage{
+tableHeader(names, escape = TRUE)
+
+tableFooter(names, escape = TRUE)
+}
+\arguments{
+\item{names}{a character vector of the column names of the table (if it is an
+object with column names, its column names will be used instead)}
+
+\item{escape}{whether to escape the names (see \code{\link{datatable}})}
+}
+\value{
+A tag object generated by \code{htmltools::tags}.
+}
+\description{
+Convenience functions to generate a table header (\samp{<thead></thead>}) or
+footer (\samp{<tfoot></tfoot>}) given the column names. They are basically
+wrappers of \code{htmltools::tags$th} applied to the column names.
+}
+\examples{
+library(DT)
+tableHeader(iris)  # or equivalently,
+tableHeader(colnames(iris))
+tableFooter(iris)  # footer
+
+library(htmltools)
+tags$table(tableHeader(iris), tableFooter(iris))
+}
diff --git a/vignettes/DT.Rmd b/vignettes/DT.Rmd
new file mode 100644
index 0000000..a06f85d
--- /dev/null
+++ b/vignettes/DT.Rmd
@@ -0,0 +1,26 @@
+---
+title: "An Introduction to the DT Package"
+author: "Yihui Xie"
+date: '`r Sys.Date()`'
+output:
+  knitr:::html_vignette:
+    number_sections: yes
+    toc: yes
+vignette: |
+  %\VignetteIndexEntry{An Introduction to the DT Package}
+  %\VignetteEngine{knitr::rmarkdown_notangle}
+---
+
+<style type="text/css">
+table, table th, table td {
+  border: none;
+}
+</style>
+
+Please see http://rstudio.github.io/DT for the full documentation. Here is only a minimal example:
+
+```{r}
+library(DT)
+datatable(iris)
+```
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/r-cran-dt.git



More information about the debian-science-commits mailing list