')
+ .css(blockerCSS)
+ .css('right', 0)
+ .addClass(this.classes.rightBottomBlocker),
+ rightTopBlocker: $('
')
+ .css(blockerCSS)
+ .css({
+ right: 0,
+ top: 0
+ })
+ .addClass(this.classes.rightTopBlocker)
+ };
+ if (this.s.dt.settings()[0]._bInitComplete) {
+ // Fixed Columns Initialisation
+ this._addStyles();
+ this._setKeyTableListener();
+ }
+ else {
+ table.one('init.dt', function () {
+ // Fixed Columns Initialisation
+ _this._addStyles();
+ _this._setKeyTableListener();
+ });
+ }
+ table.on('column-sizing.dt', function () { return _this._addStyles(); });
+ // Make class available through dt object
+ table.settings()[0]._fixedColumns = this;
+ return this;
+ }
+ /**
+ * Getter/Setter for the `fixedColumns.left` property
+ *
+ * @param newVal Optional. If present this will be the new value for the number of left fixed columns
+ * @returns The number of left fixed columns
+ */
+ FixedColumns.prototype.left = function (newVal) {
+ // If the value is to change
+ if (newVal !== undefined) {
+ // Set the new values and redraw the columns
+ this.c.left = newVal;
+ this._addStyles();
+ }
+ return this.c.left;
+ };
+ /**
+ * Getter/Setter for the `fixedColumns.left` property
+ *
+ * @param newVal Optional. If present this will be the new value for the number of right fixed columns
+ * @returns The number of right fixed columns
+ */
+ FixedColumns.prototype.right = function (newVal) {
+ // If the value is to change
+ if (newVal !== undefined) {
+ // Set the new values and redraw the columns
+ this.c.right = newVal;
+ this._addStyles();
+ }
+ return this.c.right;
+ };
+ /**
+ * Iterates over the columns, fixing the appropriate ones to the left and right
+ */
+ FixedColumns.prototype._addStyles = function () {
+ // Set the bar width if vertical scrolling is enabled
+ if (this.s.dt.settings()[0].oScroll.sY) {
+ var scroll_1 = $(this.s.dt.table().node()).closest('div.dataTables_scrollBody')[0];
+ var barWidth = this.s.dt.settings()[0].oBrowser.barWidth;
+ if (scroll_1.offsetWidth - scroll_1.clientWidth >= barWidth) {
+ this.s.barWidth = barWidth;
+ }
+ else {
+ this.s.barWidth = 0;
+ }
+ this.dom.rightTopBlocker.css('width', this.s.barWidth + 1);
+ this.dom.leftTopBlocker.css('width', this.s.barWidth + 1);
+ this.dom.rightBottomBlocker.css('width', this.s.barWidth + 1);
+ this.dom.leftBottomBlocker.css('width', this.s.barWidth + 1);
+ }
+ var parentDiv = null;
+ // Get the header and it's height
+ var header = this.s.dt.column(0).header();
+ var headerHeight = null;
+ if (header !== null) {
+ header = $(header);
+ headerHeight = header.outerHeight() + 1;
+ parentDiv = $(header.closest('div.dataTables_scroll')).css('position', 'relative');
+ }
+ // Get the footer and it's height
+ var footer = this.s.dt.column(0).footer();
+ var footerHeight = null;
+ if (footer !== null) {
+ footer = $(footer);
+ footerHeight = footer.outerHeight();
+ // Only attempt to retrieve the parentDiv if it has not been retrieved already
+ if (parentDiv === null) {
+ parentDiv = $(footer.closest('div.dataTables_scroll')).css('position', 'relative');
+ }
+ }
+ // Get the number of columns in the table - this is used often so better to only make 1 api call
+ var numCols = this.s.dt.columns().data().toArray().length;
+ // Tracker for the number of pixels should be left to the left of the table
+ var distLeft = 0;
+ // Sometimes the headers have slightly different widths so need to track them individually
+ var headLeft = 0;
+ // Get all of the row elements in the table
+ var rows = $(this.s.dt.table().node()).children('tbody').children('tr');
+ var invisibles = 0;
+ // When working from right to left we need to know how many are invisible before a point,
+ // without including those that are invisible after
+ var prevInvisible = new Map();
+ // Iterate over all of the columns
+ for (var i = 0; i < numCols; i++) {
+ var column = this.s.dt.column(i);
+ // Set the map for the previous column
+ if (i > 0) {
+ prevInvisible.set(i - 1, invisibles);
+ }
+ if (!column.visible()) {
+ invisibles++;
+ continue;
+ }
+ // Get the columns header and footer element
+ var colHeader = $(column.header());
+ var colFooter = $(column.footer());
+ // If i is less than the value of left then this column should be fixed left
+ if (i - invisibles < this.c.left) {
+ $(this.s.dt.table().node()).addClass(this.classes.tableFixedLeft);
+ parentDiv.addClass(this.classes.tableFixedLeft);
+ // Add the width of the previous node - only if we are on atleast the second column
+ if (i - invisibles > 0) {
+ var prevIdx = i;
+ // Simply using the number of hidden columns doesn't work here,
+ // if the first is hidden then this would be thrown off
+ while (prevIdx + 1 < numCols) {
+ var prevCol = this.s.dt.column(prevIdx - 1, { page: 'current' });
+ if (prevCol.visible()) {
+ distLeft += $(prevCol.nodes()[0]).outerWidth();
+ headLeft += prevCol.header() ?
+ $(prevCol.header()).outerWidth() :
+ prevCol.footer() ?
+ $(prevCol.header()).outerWidth() :
+ 0;
+ break;
+ }
+ prevIdx--;
+ }
+ }
+ // Iterate over all of the rows, fixing the cell to the left
+ for (var _i = 0, rows_1 = rows; _i < rows_1.length; _i++) {
+ var row = rows_1[_i];
+ $($(row).children()[i - invisibles])
+ .css(this._getCellCSS(false, distLeft, 'left'))
+ .addClass(this.classes.fixedLeft);
+ }
+ // Add the css for the header and the footer
+ colHeader
+ .css(this._getCellCSS(true, headLeft, 'left'))
+ .addClass(this.classes.fixedLeft);
+ colFooter
+ .css(this._getCellCSS(true, headLeft, 'left'))
+ .addClass(this.classes.fixedLeft);
+ }
+ else {
+ // Iteriate through all of the rows, making sure they aren't currently trying to fix left
+ for (var _a = 0, rows_2 = rows; _a < rows_2.length; _a++) {
+ var row = rows_2[_a];
+ var cell = $($(row).children()[i - invisibles]);
+ // If the cell is trying to fix to the left, remove the class and the css
+ if (cell.hasClass(this.classes.fixedLeft)) {
+ cell
+ .css(this._clearCellCSS('left'))
+ .removeClass(this.classes.fixedLeft);
+ }
+ }
+ // Make sure the header for this column isn't fixed left
+ if (colHeader.hasClass(this.classes.fixedLeft)) {
+ colHeader
+ .css(this._clearCellCSS('left'))
+ .removeClass(this.classes.fixedLeft);
+ }
+ // Make sure the footer for this column isn't fixed left
+ if (colFooter.hasClass(this.classes.fixedLeft)) {
+ colFooter
+ .css(this._clearCellCSS('left'))
+ .removeClass(this.classes.fixedLeft);
+ }
+ }
+ }
+ // If there is a header with the index class and reading rtl then add left top blocker
+ if (header !== null && !header.hasClass('index')) {
+ if (this.s.rtl) {
+ this.dom.leftTopBlocker.outerHeight(headerHeight);
+ parentDiv.append(this.dom.leftTopBlocker);
+ }
+ else {
+ this.dom.rightTopBlocker.outerHeight(headerHeight);
+ parentDiv.append(this.dom.rightTopBlocker);
+ }
+ }
+ // If there is a footer with the index class and reading rtl then add left bottom blocker
+ if (footer !== null && !footer.hasClass('index')) {
+ if (this.s.rtl) {
+ this.dom.leftBottomBlocker.outerHeight(footerHeight);
+ parentDiv.append(this.dom.leftBottomBlocker);
+ }
+ else {
+ this.dom.rightBottomBlocker.outerHeight(footerHeight);
+ parentDiv.append(this.dom.rightBottomBlocker);
+ }
+ }
+ var distRight = 0;
+ var headRight = 0;
+ // Counter for the number of invisible columns so far
+ var rightInvisibles = 0;
+ for (var i = numCols - 1; i >= 0; i--) {
+ var column = this.s.dt.column(i);
+ // If a column is invisible just skip it
+ if (!column.visible()) {
+ rightInvisibles++;
+ continue;
+ }
+ // Get the columns header and footer element
+ var colHeader = $(column.header());
+ var colFooter = $(column.footer());
+ // Get the number of visible columns that came before this one
+ var prev = prevInvisible.get(i);
+ if (prev === undefined) {
+ // If it wasn't set then it was the last column so just use the final value
+ prev = invisibles;
+ }
+ if (i + rightInvisibles >= numCols - this.c.right) {
+ $(this.s.dt.table().node()).addClass(this.classes.tableFixedRight);
+ parentDiv.addClass(this.classes.tableFixedRight);
+ // Add the widht of the previous node, only if we are on atleast the second column
+ if (i + 1 + rightInvisibles < numCols) {
+ var prevIdx = i;
+ // Simply using the number of hidden columns doesn't work here,
+ // if the first is hidden then this would be thrown off
+ while (prevIdx + 1 < numCols) {
+ var prevCol = this.s.dt.column(prevIdx + 1, { page: 'current' });
+ if (prevCol.visible()) {
+ distRight += $(prevCol.nodes()[0]).outerWidth();
+ headRight += prevCol.header() ?
+ $(prevCol.header()).outerWidth() :
+ prevCol.footer() ?
+ $(prevCol.header()).outerWidth() :
+ 0;
+ break;
+ }
+ prevIdx++;
+ }
+ }
+ // Iterate over all of the rows, fixing the cell to the right
+ for (var _b = 0, rows_3 = rows; _b < rows_3.length; _b++) {
+ var row = rows_3[_b];
+ $($(row).children()[i - prev])
+ .css(this._getCellCSS(false, distRight, 'right'))
+ .addClass(this.classes.fixedRight);
+ }
+ // Add the css for the header and the footer
+ colHeader
+ .css(this._getCellCSS(true, headRight, 'right'))
+ .addClass(this.classes.fixedRight);
+ colFooter
+ .css(this._getCellCSS(true, headRight, 'right'))
+ .addClass(this.classes.fixedRight);
+ }
+ else {
+ // Iteriate through all of the rows, making sure they aren't currently trying to fix right
+ for (var _c = 0, rows_4 = rows; _c < rows_4.length; _c++) {
+ var row = rows_4[_c];
+ var cell = $($(row).children()[i - prev]);
+ // If the cell is trying to fix to the right, remove the class and the css
+ if (cell.hasClass(this.classes.fixedRight)) {
+ cell
+ .css(this._clearCellCSS('right'))
+ .removeClass(this.classes.fixedRight);
+ }
+ }
+ // Make sure the header for this column isn't fixed right
+ if (colHeader.hasClass(this.classes.fixedRight)) {
+ colHeader
+ .css(this._clearCellCSS('right'))
+ .removeClass(this.classes.fixedRight);
+ }
+ // Make sure the footer for this column isn't fixed right
+ if (colFooter.hasClass(this.classes.fixedRight)) {
+ colFooter
+ .css(this._clearCellCSS('right'))
+ .removeClass(this.classes.fixedRight);
+ }
+ }
+ }
+ // If there is a header with the index class and reading rtl then add right top blocker
+ if (header) {
+ if (!this.s.rtl) {
+ this.dom.rightTopBlocker.outerHeight(headerHeight);
+ parentDiv.append(this.dom.rightTopBlocker);
+ }
+ else {
+ this.dom.leftTopBlocker.outerHeight(headerHeight);
+ parentDiv.append(this.dom.leftTopBlocker);
+ }
+ }
+ // If there is a footer with the index class and reading rtl then add right bottom blocker
+ if (footer) {
+ if (!this.s.rtl) {
+ this.dom.rightBottomBlocker.outerHeight(footerHeight);
+ parentDiv.append(this.dom.rightBottomBlocker);
+ }
+ else {
+ this.dom.leftBottomBlocker.outerHeight(footerHeight);
+ parentDiv.append(this.dom.leftBottomBlocker);
+ }
+ }
+ };
+ /**
+ * Gets the correct CSS for the cell, header or footer based on options provided
+ *
+ * @param header Whether this cell is a header or a footer
+ * @param dist The distance that the cell should be moved away from the edge
+ * @param lr Indicator of fixing to the left or the right
+ * @returns An object containing the correct css
+ */
+ FixedColumns.prototype._getCellCSS = function (header, dist, lr) {
+ if (lr === 'left') {
+ return !this.s.rtl ?
+ {
+ left: dist + 'px',
+ position: 'sticky'
+ } :
+ {
+ position: 'sticky',
+ right: dist + (header ? this.s.barWidth : 0) + 'px'
+ };
+ }
+ else {
+ return !this.s.rtl ?
+ {
+ position: 'sticky',
+ right: dist + (header ? this.s.barWidth : 0) + 'px'
+ } :
+ {
+ left: dist + 'px',
+ position: 'sticky'
+ };
+ }
+ };
+ /**
+ * Gets the css that is required to clear the fixing to a side
+ *
+ * @param lr Indicator of fixing to the left or the right
+ * @returns An object containing the correct css
+ */
+ FixedColumns.prototype._clearCellCSS = function (lr) {
+ if (lr === 'left') {
+ return !this.s.rtl ?
+ {
+ left: '',
+ position: ''
+ } :
+ {
+ position: '',
+ right: ''
+ };
+ }
+ else {
+ return !this.s.rtl ?
+ {
+ position: '',
+ right: ''
+ } :
+ {
+ left: '',
+ position: ''
+ };
+ }
+ };
+ FixedColumns.prototype._setKeyTableListener = function () {
+ var _this = this;
+ this.s.dt.on('key-focus', function (e, dt, cell) {
+ var cellPos = $(cell.node()).offset();
+ var scroll = $($(_this.s.dt.table().node()).closest('div.dataTables_scrollBody'));
+ // If there are fixed columns to the left
+ if (_this.c.left > 0) {
+ // Get the rightmost left fixed column header, it's position and it's width
+ var rightMost = $(_this.s.dt.column(_this.c.left - 1).header());
+ var rightMostPos = rightMost.offset();
+ var rightMostWidth = rightMost.outerWidth();
+ // If the current highlighted cell is left of the rightmost cell on the screen
+ if (cellPos.left < rightMostPos.left + rightMostWidth) {
+ // Scroll it into view
+ var currScroll = scroll.scrollLeft();
+ scroll.scrollLeft(currScroll - (rightMostPos.left + rightMostWidth - cellPos.left));
+ }
+ }
+ // If there are fixed columns to the right
+ if (_this.c.right > 0) {
+ // Get the number of columns and the width of the cell as doing right side calc
+ var numCols = _this.s.dt.columns().data().toArray().length;
+ var cellWidth = $(cell.node()).outerWidth();
+ // Get the leftmost right fixed column header and it's position
+ var leftMost = $(_this.s.dt.column(numCols - _this.c.right).header());
+ var leftMostPos = leftMost.offset();
+ // If the current highlighted cell is right of the leftmost cell on the screen
+ if (cellPos.left + cellWidth > leftMostPos.left) {
+ // Scroll it into view
+ var currScroll = scroll.scrollLeft();
+ scroll.scrollLeft(currScroll - (leftMostPos.left - (cellPos.left + cellWidth)));
+ }
+ }
+ });
+ // Whenever a draw occurs there is potential for the data to have changed and therefore also the column widths
+ // Therefore it is necessary to recalculate the values for the fixed columns
+ this.s.dt.on('draw', function () {
+ _this._addStyles();
+ });
+ this.s.dt.on('column-reorder', function () {
+ _this._addStyles();
+ });
+ this.s.dt.on('column-visibility', function (e, s) {
+ if (!s.bDestroying) {
+ setTimeout(function () {
+ _this._addStyles();
+ }, 50);
+ }
+ });
+ };
+ FixedColumns.version = '4.0.2';
+ FixedColumns.classes = {
+ fixedLeft: 'dtfc-fixed-left',
+ fixedRight: 'dtfc-fixed-right',
+ leftBottomBlocker: 'dtfc-left-bottom-blocker',
+ leftTopBlocker: 'dtfc-left-top-blocker',
+ rightBottomBlocker: 'dtfc-right-bottom-blocker',
+ rightTopBlocker: 'dtfc-right-top-blocker',
+ tableFixedLeft: 'dtfc-has-left',
+ tableFixedRight: 'dtfc-has-right'
+ };
+ FixedColumns.defaults = {
+ i18n: {
+ button: 'FixedColumns'
+ },
+ left: 1,
+ right: 0
+ };
+ return FixedColumns;
+ }());
+
+ /*! FixedColumns 4.0.2
+ * 2019-2022 SpryMedia Ltd - datatables.net/license
+ */
+ // DataTables extensions common UMD. Note that this allows for AMD, CommonJS
+ // (with window and jQuery being allowed as parameters to the returned
+ // function) or just default browser loading.
+ (function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD
+ define(['jquery', 'datatables.net'], function ($) {
+ return factory($, window, document);
+ });
+ }
+ else if (typeof exports === 'object') {
+ // CommonJS
+ module.exports = function (root, $) {
+ if (!root) {
+ root = window;
+ }
+ if (!$ || !$.fn.dataTable) {
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
+ $ = require('datatables.net')(root, $).$;
+ }
+ return factory($, root, root.document);
+ };
+ }
+ else {
+ // Browser - assume jQuery has already been loaded
+ factory(window.jQuery, window, document);
+ }
+ }(function ($, window, document) {
+ setJQuery($);
+ var dataTable = $.fn.dataTable;
+ $.fn.dataTable.FixedColumns = FixedColumns;
+ $.fn.DataTable.FixedColumns = FixedColumns;
+ var apiRegister = $.fn.dataTable.Api.register;
+ apiRegister('fixedColumns()', function () {
+ return this;
+ });
+ apiRegister('fixedColumns().left()', function (newVal) {
+ var ctx = this.context[0];
+ if (newVal !== undefined) {
+ ctx._fixedColumns.left(newVal);
+ return this;
+ }
+ else {
+ return ctx._fixedColumns.left();
+ }
+ });
+ apiRegister('fixedColumns().right()', function (newVal) {
+ var ctx = this.context[0];
+ if (newVal !== undefined) {
+ ctx._fixedColumns.right(newVal);
+ return this;
+ }
+ else {
+ return ctx._fixedColumns.right();
+ }
+ });
+ $.fn.dataTable.ext.buttons.fixedColumns = {
+ action: function (e, dt, node, config) {
+ if ($(node).attr('active')) {
+ $(node).removeAttr('active').removeClass('active');
+ dt.fixedColumns().left(0);
+ dt.fixedColumns().right(0);
+ }
+ else {
+ $(node).attr('active', true).addClass('active');
+ dt.fixedColumns().left(config.config.left);
+ dt.fixedColumns().right(config.config.right);
+ }
+ },
+ config: {
+ left: 1,
+ right: 0
+ },
+ init: function (dt, node, config) {
+ if (dt.settings()[0]._fixedColumns === undefined) {
+ _init(dt.settings(), config);
+ }
+ $(node).attr('active', true).addClass('active');
+ dt.button(node).text(config.text || dt.i18n('buttons.fixedColumns', dt.settings()[0]._fixedColumns.c.i18n.button));
+ },
+ text: null
+ };
+ function _init(settings, options) {
+ if (options === void 0) { options = null; }
+ var api = new dataTable.Api(settings);
+ var opts = options
+ ? options
+ : api.init().fixedColumns || dataTable.defaults.fixedColumns;
+ var fixedColumns = new FixedColumns(api, opts);
+ return fixedColumns;
+ }
+ // Attach a listener to the document which listens for DataTables initialisation
+ // events so we can automatically initialise
+ $(document).on('plugin-init.dt', function (e, settings) {
+ if (e.namespace !== 'dt') {
+ return;
+ }
+ if (settings.oInit.fixedColumns ||
+ dataTable.defaults.fixedColumns) {
+ if (!settings._fixedColumns) {
+ _init(settings, null);
+ }
+ }
+ });
+ }));
+
+})();
+
+
diff --git a/js/datatables/datatables.min.css b/js/datatables/datatables.min.css
new file mode 100644
index 0000000000..ca04a8e7d1
--- /dev/null
+++ b/js/datatables/datatables.min.css
@@ -0,0 +1,18 @@
+/*
+ * This combined file was created by the DataTables downloader builder:
+ * https://datatables.net/download
+ *
+ * To rebuild or modify this file with the latest versions of the included
+ * software please visit:
+ * https://datatables.net/download/#dt/dt-1.11.5/fc-4.0.2
+ *
+ * Included libraries:
+ * DataTables 1.11.5, FixedColumns 4.0.2
+ */
+
+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 td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}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 .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("DataTables-1.11.5/images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("DataTables-1.11.5/images/sort_asc.png") !important}table.dataTable thead .sorting_desc{background-image:url("DataTables-1.11.5/images/sort_desc.png") !important}table.dataTable thead .sorting_asc_disabled{background-image:url("DataTables-1.11.5/images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("DataTables-1.11.5/images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, white 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, white 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, white 0%, #dcdcdc 100%);background:-o-linear-gradient(top, white 0%, #dcdcdc 100%);background:linear-gradient(to bottom, white 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));background:-webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}
+
+
+table.dataTable.display tbody tr.DTFC_NoData{background-color:transparent}tr.even td{background-color:#fff}tr.odd td{background-color:#f9f9f9}tr.selected td{background-color:#a6b4cd}thead th{background-color:white}tfoot th{background-color:white}tr.dt-rowReorder-moving td.dtfc-fixed-left,tr.dt-rowReorder-moving td.dtfc-fixed-right{border-top:2px solid #555 !important;border-bottom:2px solid #555 !important}tr.dt-rowReorder-moving td.dtfc-fixed-left:first-child{border-left:2px solid #555 !important}tr.dt-rowReorder-moving td.dtfc-fixed-right:last-child{border-right:2px solid #555 !important}
+
+
diff --git a/js/datatables/datatables.min.js b/js/datatables/datatables.min.js
new file mode 100644
index 0000000000..cd2ca0ea33
--- /dev/null
+++ b/js/datatables/datatables.min.js
@@ -0,0 +1,250 @@
+/*
+ * This combined file was created by the DataTables downloader builder:
+ * https://datatables.net/download
+ *
+ * To rebuild or modify this file with the latest versions of the included
+ * software please visit:
+ * https://datatables.net/download/#dt/dt-1.11.5/fc-4.0.2
+ *
+ * Included libraries:
+ * DataTables 1.11.5, FixedColumns 4.0.2
+ */
+
+/*!
+ Copyright 2008-2021 SpryMedia Ltd.
+
+ This source file is free software, available under the following license:
+ MIT license - http://datatables.net/license
+
+ This source file is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+
+ For details please refer to: http://www.datatables.net
+ DataTables 1.11.5
+ ©2008-2021 SpryMedia Ltd - datatables.net/license
+*/
+var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(l,z,A){l instanceof String&&(l=String(l));for(var q=l.length,E=0;E
").css({position:"fixed",top:0,left:-1*l(z).scrollLeft(),height:1,
+width:1,overflow:"hidden"}).append(l("").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(l("").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()}l.extend(a.oBrowser,u.__browser);a.oScroll.iBarWidth=u.__browser.barWidth}
+function Cb(a,b,c,d,e,h){var f=!1;if(c!==q){var g=c;f=!0}for(;d!==e;)a.hasOwnProperty(d)&&(g=f?b(g,a[d],d,a):a[d],f=!0,d+=h);return g}function Ya(a,b){var c=u.defaults.column,d=a.aoColumns.length;c=l.extend({},u.models.oColumn,c,{nTh:b?b:A.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]=l.extend({},u.models.oSearch,c[d]);Ga(a,d,l(b).data())}function Ga(a,b,c){b=a.aoColumns[b];
+var d=a.oClasses,e=l(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var h=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);h&&(b.sWidthOrig=h[1])}c!==q&&null!==c&&(Ab(c),P(u.defaults.column,c,!0),c.mDataProp===q||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),l.extend(b,c),X(b,c,"sWidth","sWidthOrig"),c.iDataSort!==q&&(b.aDataSort=[c.iDataSort]),X(b,c,"aDataSort"));var f=b.mData,g=na(f),
+k=b.mRender?na(b.mRender):null;c=function(m){return"string"===typeof m&&-1!==m.indexOf("@")};b._bAttrSrc=l.isPlainObject(f)&&(c(f.sort)||c(f.type)||c(f.filter));b._setter=null;b.fnGetData=function(m,n,p){var t=g(m,n,q,p);return k&&n?k(t,n,m,p):t};b.fnSetData=function(m,n,p){return ha(f)(m,n,p)};"number"!==typeof f&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==l.inArray("asc",b.asSorting);c=-1!==l.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c?
+(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function sa(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Za(a);for(var c=0,d=b.length;cm[n])d(g.length+m[n],k);else if("string"===typeof m[n]){var p=0;for(f=g.length;pb&&a[e]--; -1!=d&&c===q&&a.splice(d,1)}function va(a,b,c,d){var e=a.aoData[b],h,f=function(k,m){for(;k.childNodes.length;)k.removeChild(k.firstChild);k.innerHTML=T(a,b,m,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var g=e.anCells;if(g)if(d!==q)f(g[d],d);else for(c=0,h=g.length;c").appendTo(d));var k=0;for(b=g.length;k=a.fnRecordsDisplay()?0:d,a.iInitDisplayStart=-1);c=F(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==l.inArray(!1,c))V(a,!1);else{c=[];var e=0;d=a.asStripeClasses;var h=d.length,f=a.oLanguage,g="ssp"==Q(a),k=a.aiDisplay,m=a._iDisplayStart,n=a.fnDisplayEnd();a.bDrawing=!0;if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,V(a,!1);else if(!g)a.iDraw++;else if(!a.bDestroying&&!b){Gb(a);return}if(0!==k.length)for(b=g?a.aoData.length:n,f=g?0:m;f",{"class":h?d[0]:""}).append(l(" | ",{valign:"top",colSpan:oa(a),"class":a.oClasses.sRowEmpty}).html(e))[0];F(a,"aoHeaderCallback","header",[l(a.nTHead).children("tr")[0],db(a),m,n,k]);F(a,"aoFooterCallback",
+"footer",[l(a.nTFoot).children("tr")[0],db(a),m,n,k]);d=l(a.nTBody);d.children().detach();d.append(l(c));F(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function ka(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&Hb(a);d?ya(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;ja(a);a._drawHold=!1}function Ib(a){var b=a.oClasses,c=l(a.nTable);c=l("").insertBefore(c);var d=a.oFeatures,e=l("",{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 h=a.sDom.split(""),f,g,k,m,n,p,t=0;t")[0];m=h[t+1];if("'"==m||'"'==m){n="";for(p=2;h[t+p]!=m;)n+=h[t+p],p++;"H"==n?n=b.sJUIHeader:"F"==n&&(n=b.sJUIFooter);-1!=n.indexOf(".")?(m=n.split("."),k.id=m[0].substr(1,m[0].length-1),k.className=m[1]):"#"==n.charAt(0)?k.id=n.substr(1,n.length-1):k.className=n;t+=p}e.append(k);
+e=l(k)}else if(">"==g)e=e.parent();else if("l"==g&&d.bPaginate&&d.bLengthChange)f=Jb(a);else if("f"==g&&d.bFilter)f=Kb(a);else if("r"==g&&d.bProcessing)f=Lb(a);else if("t"==g)f=Mb(a);else if("i"==g&&d.bInfo)f=Nb(a);else if("p"==g&&d.bPaginate)f=Ob(a);else if(0!==u.ext.feature.length)for(k=u.ext.feature,p=0,m=k.length;p',g=d.sSearch;g=g.match(/_INPUT_/)?g.replace("_INPUT_",f):g+f;b=l("",{id:h.f?null:c+"_filter","class":b.sFilter}).append(l("").append(g));var k=function(n){var p=this.value?this.value:"";e.return&&"Enter"!==n.key||p==e.sSearch||(ya(a,{sSearch:p,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive,"return":e.return}),a._iDisplayStart=0,ja(a))};h=
+null!==a.searchDelay?a.searchDelay:"ssp"===Q(a)?400:0;var m=l("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",h?hb(k,h):k).on("mouseup",function(n){setTimeout(function(){k.call(m[0],n)},10)}).on("keypress.DT",function(n){if(13==n.keyCode)return!1}).attr("aria-controls",c);l(a.nTable).on("search.dt.DT",function(n,p){if(a===p)try{m[0]!==A.activeElement&&m.val(e.sSearch)}catch(t){}});return b[0]}function ya(a,b,c){var d=a.oPreviousSearch,
+e=a.aoPreSearchCols,h=function(g){d.sSearch=g.sSearch;d.bRegex=g.bRegex;d.bSmart=g.bSmart;d.bCaseInsensitive=g.bCaseInsensitive;d.return=g.return},f=function(g){return g.bEscapeRegex!==q?!g.bEscapeRegex:g.bRegex};$a(a);if("ssp"!=Q(a)){Rb(a,b.sSearch,c,f(b),b.bSmart,b.bCaseInsensitive,b.return);h(b);for(b=0;b=b.length)a.aiDisplay=g.slice();else{if(k||
+c||d||f.length>b.length||0!==b.indexOf(f)||a.bSorted)a.aiDisplay=g.slice();b=a.aiDisplay;for(c=0;c",{"class":a.oClasses.sInfo,id:c?null:b+"_info"});c||(a.aoDrawCallback.push({fn:Xb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),l(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Xb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),h=a.fnRecordsTotal(),f=a.fnRecordsDisplay(),g=
+f?c.sInfo:c.sInfoEmpty;f!==h&&(g+=" "+c.sInfoFiltered);g+=c.sInfoPostFix;g=Yb(a,g);c=c.fnInfoCallback;null!==c&&(g=c.call(a.oInstance,a,d,e,h,f,g));l(b).html(g)}}function Yb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,h=a.fnRecordsDisplay(),f=-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,h)).replace(/_PAGE_/g,c.call(a,f?1:Math.ceil(d/e))).replace(/_PAGES_/g,
+c.call(a,f?1:Math.ceil(h/e)))}function Aa(a){var b=a.iInitDisplayStart,c=a.aoColumns;var d=a.oFeatures;var e=a.bDeferLoading;if(a.bInitialised){Ib(a);Fb(a);xa(a,a.aoHeader);xa(a,a.aoFooter);V(a,!0);d.bAutoWidth&&Za(a);var h=0;for(d=c.length;h",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect});for(var f=0,g=h.length;f
").addClass(b.sLength);a.aanFeatures.l||(k[0].id=c+"_length");k.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));l("select",k).val(a._iDisplayLength).on("change.DT",function(m){kb(a,l(this).val());ja(a)});l(a.nTable).on("length.dt.DT",function(m,n,p){a===n&&l("select",k).val(p)});return k[0]}function Ob(a){var b=a.sPaginationType,c=u.ext.pager[b],d="function"===typeof c,e=function(f){ja(f)};b=l("
").addClass(a.oClasses.sPaging+b)[0];
+var h=a.aanFeatures;d||c.fnInit(a,b,e);h.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(f){if(d){var g=f._iDisplayStart,k=f._iDisplayLength,m=f.fnRecordsDisplay(),n=-1===k;g=n?0:Math.ceil(g/k);k=n?1:Math.ceil(m/k);m=c(g,k);var p;n=0;for(p=h.p.length;n
",{"class":h.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?K(d):null:"100%"}).append(l("
",{"class":h.sScrollHeadInner}).css({"box-sizing":"content-box",
+width:c.sXInner||"100%"}).append(k.removeAttr("id").css("margin-left",0).append("top"===g?f:null).append(b.children("thead"))))).append(l("
",{"class":h.sScrollBody}).css({position:"relative",overflow:"auto",width:d?K(d):null}).append(b));n&&k.append(l("
",{"class":h.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?K(d):null:"100%"}).append(l("
",{"class":h.sScrollFootInner}).append(m.removeAttr("id").css("margin-left",0).append("bottom"===g?f:null).append(b.children("tfoot")))));
+b=k.children();var p=b[0];h=b[1];var t=n?b[2]:null;if(d)l(h).on("scroll.DT",function(v){v=this.scrollLeft;p.scrollLeft=v;n&&(t.scrollLeft=v)});l(h).css("max-height",e);c.bCollapse||l(h).css("height",e);a.nScrollHead=p;a.nScrollBody=h;a.nScrollFoot=t;a.aoDrawCallback.push({fn:Ha,sName:"scrolling"});return k[0]}function Ha(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var h=l(a.nScrollHead),f=h[0].style,g=h.children("div"),k=g[0].style,m=g.children("table");g=a.nScrollBody;var n=l(g),p=
+g.style,t=l(a.nScrollFoot).children("div"),v=t.children("table"),x=l(a.nTHead),w=l(a.nTable),r=w[0],C=r.style,G=a.nTFoot?l(a.nTFoot):null,aa=a.oBrowser,L=aa.bScrollOversize;U(a.aoColumns,"nTh");var O=[],I=[],H=[],ea=[],Y,Ba=function(D){D=D.style;D.paddingTop="0";D.paddingBottom="0";D.borderTopWidth="0";D.borderBottomWidth="0";D.height=0};var fa=g.scrollHeight>g.clientHeight;if(a.scrollBarVis!==fa&&a.scrollBarVis!==q)a.scrollBarVis=fa,sa(a);else{a.scrollBarVis=fa;w.children("thead, tfoot").remove();
+if(G){var ba=G.clone().prependTo(w);var la=G.find("tr");ba=ba.find("tr")}var mb=x.clone().prependTo(w);x=x.find("tr");fa=mb.find("tr");mb.find("th, td").removeAttr("tabindex");c||(p.width="100%",h[0].style.width="100%");l.each(Na(a,mb),function(D,W){Y=ta(a,D);W.style.width=a.aoColumns[Y].sWidth});G&&ca(function(D){D.style.width=""},ba);h=w.outerWidth();""===c?(C.width="100%",L&&(w.find("tbody").height()>g.offsetHeight||"scroll"==n.css("overflow-y"))&&(C.width=K(w.outerWidth()-b)),h=w.outerWidth()):
+""!==d&&(C.width=K(d),h=w.outerWidth());ca(Ba,fa);ca(function(D){var W=z.getComputedStyle?z.getComputedStyle(D).width:K(l(D).width());H.push(D.innerHTML);O.push(W)},fa);ca(function(D,W){D.style.width=O[W]},x);l(fa).css("height",0);G&&(ca(Ba,ba),ca(function(D){ea.push(D.innerHTML);I.push(K(l(D).css("width")))},ba),ca(function(D,W){D.style.width=I[W]},la),l(ba).height(0));ca(function(D,W){D.innerHTML='
";D.childNodes[0].style.height="0";D.childNodes[0].style.overflow=
+"hidden";D.style.width=O[W]},fa);G&&ca(function(D,W){D.innerHTML='
";D.childNodes[0].style.height="0";D.childNodes[0].style.overflow="hidden";D.style.width=I[W]},ba);Math.round(w.outerWidth())