[ Mini Kiebo ]
Server: Windows NT AKFAR_SERVER 10.0 build 26200 (Windows 10) AMD64
Path:
D:
/
software bumsil
/
aplikasi
/
peminjaman
/
public
/
extensions
/
simple-datatables
/
[
Home
]
File: index.js.map
{"version":3,"file":"index.js","sources":["../src/helpers.js","../src/rows.js","../src/columns.js","../src/table.js","../src/config.js","../src/datatable.js"],"sourcesContent":["/**\n * Check is item is object\n * @return {Boolean}\n */\nexport const isObject = val => Object.prototype.toString.call(val) === \"[object Object]\"\n\n/**\n * Check for valid JSON string\n * @param {String} str\n * @return {Boolean|Array|Object}\n */\nexport const isJson = str => {\n let t = !1\n try {\n t = JSON.parse(str)\n } catch (e) {\n return !1\n }\n return !(null === t || (!Array.isArray(t) && !isObject(t))) && t\n}\n\n/**\n * Create DOM element node\n * @param {String} nodeName nodeName\n * @param {Object} attrs properties and attributes\n * @return {Object}\n */\nexport const createElement = (nodeName, attrs) => {\n const dom = document.createElement(nodeName)\n if (attrs && \"object\" == typeof attrs) {\n for (const attr in attrs) {\n if (\"html\" === attr) {\n dom.innerHTML = attrs[attr]\n } else {\n dom.setAttribute(attr, attrs[attr])\n }\n }\n }\n return dom\n}\n\nexport const flush = el => {\n if (el instanceof NodeList) {\n el.forEach(e => flush(e))\n } else {\n el.innerHTML = \"\"\n }\n}\n\n/**\n * Create button helper\n * @param {String} class\n * @param {Number} page\n * @param {String} text\n * @return {Object}\n */\nexport const button = (className, page, text) => createElement(\n \"li\",\n {\n class: className,\n html: `<a href=\"#\" data-page=\"${page}\">${text}</a>`\n }\n)\n\n/**\n * Bubble sort algorithm\n */\nexport const sortItems = (a, b) => {\n let c\n let d\n if (1 === b) {\n c = 0\n d = a.length\n } else {\n if (b === -1) {\n c = a.length - 1\n d = -1\n }\n }\n for (let e = !0; e;) {\n e = !1\n for (let f = c; f != d; f += b) {\n if (a[f + b] && a[f].value > a[f + b].value) {\n const g = a[f]\n const h = a[f + b]\n const i = g\n a[f] = h\n a[f + b] = i\n e = !0\n }\n }\n }\n return a\n}\n\n/**\n * Pager truncation algorithm\n */\nexport const truncate = (a, b, c, d, ellipsis) => {\n d = d || 2\n let j\n const e = 2 * d\n let f = b - d\n let g = b + d\n const h = []\n const i = []\n if (b < 4 - d + e) {\n g = 3 + e\n } else if (b > c - (3 - d + e)) {\n f = c - (2 + e)\n }\n for (let k = 1; k <= c; k++) {\n if (1 == k || k == c || (k >= f && k <= g)) {\n const l = a[k - 1]\n l.classList.remove(\"active\")\n h.push(l)\n }\n }\n h.forEach(c => {\n const d = c.children[0].getAttribute(\"data-page\")\n if (j) {\n const e = j.children[0].getAttribute(\"data-page\")\n if (d - e == 2) i.push(a[e])\n else if (d - e != 1) {\n const f = createElement(\"li\", {\n class: \"ellipsis\",\n html: `<a href=\"#\">${ellipsis}</a>`\n })\n i.push(f)\n }\n }\n i.push(c)\n j = c\n })\n\n return i\n}\n","import {createElement} from \"./helpers\"\n/**\n * Rows API\n * @param {Object} instance DataTable instance\n * @param {Array} rows\n */\nexport class Rows {\n constructor(dt, rows) {\n this.dt = dt\n this.rows = rows\n\n return this\n }\n\n /**\n * Build a new row\n * @param {Array} row\n * @return {HTMLElement}\n */\n build(row) {\n const tr = createElement(\"tr\")\n\n let headings = this.dt.headings\n\n if (!headings.length) {\n headings = row.map(() => \"\")\n }\n\n headings.forEach((h, i) => {\n const td = createElement(\"td\")\n\n // Fixes #29\n if (!row[i] || !row[i].length) {\n row[i] = \"\"\n }\n\n td.innerHTML = row[i]\n\n td.data = row[i]\n\n tr.appendChild(td)\n })\n\n return tr\n }\n\n render(row) {\n return row\n }\n\n /**\n * Add new row\n * @param {Array} select\n */\n add(data) {\n if (Array.isArray(data)) {\n const dt = this.dt\n // Check for multiple rows\n if (Array.isArray(data[0])) {\n data.forEach(row => {\n dt.data.push(this.build(row))\n })\n } else {\n dt.data.push(this.build(data))\n }\n\n // We may have added data to an empty table\n if ( dt.data.length ) {\n dt.hasRows = true\n }\n\n\n this.update()\n\n dt.columns().rebuild()\n }\n\n }\n\n /**\n * Remove row(s)\n * @param {Array|Number} select\n * @return {Void}\n */\n remove(select) {\n const dt = this.dt\n\n if (Array.isArray(select)) {\n // Remove in reverse otherwise the indexes will be incorrect\n select.sort((a, b) => b - a)\n\n select.forEach(row => {\n dt.data.splice(row, 1)\n })\n } else if (select == 'all') {\n dt.data = [];\n } else {\n dt.data.splice(select, 1)\n }\n\n // We may have emptied the table\n if ( !dt.data.length ) {\n dt.hasRows = false\n }\n\n this.update()\n dt.columns().rebuild()\n }\n\n /**\n * Update row indexes\n * @return {Void}\n */\n update() {\n this.dt.data.forEach((row, i) => {\n row.dataIndex = i\n })\n }\n}\n","import {sortItems} from \"./helpers\"\n\n/**\n * Columns API\n * @param {Object} instance DataTable instance\n * @param {Mixed} columns Column index or array of column indexes\n */\nexport class Columns {\n constructor(dt) {\n this.dt = dt\n return this\n }\n\n /**\n * Swap two columns\n * @return {Void}\n */\n swap(columns) {\n if (columns.length && columns.length === 2) {\n const cols = []\n\n // Get the current column indexes\n this.dt.headings.forEach((h, i) => {\n cols.push(i)\n })\n\n const x = columns[0]\n const y = columns[1]\n const b = cols[y]\n cols[y] = cols[x]\n cols[x] = b\n\n this.order(cols)\n }\n }\n\n /**\n * Reorder the columns\n * @return {Array} columns Array of ordered column indexes\n */\n order(columns) {\n let a\n let b\n let c\n let d\n let h\n let s\n let cell\n\n const temp = [\n [],\n [],\n [],\n []\n ]\n\n const dt = this.dt\n\n // Order the headings\n columns.forEach((column, x) => {\n h = dt.headings[column]\n s = h.getAttribute(\"data-sortable\") !== \"false\"\n a = h.cloneNode(true)\n a.originalCellIndex = x\n a.sortable = s\n\n temp[0].push(a)\n\n if (!dt.hiddenColumns.includes(column)) {\n b = h.cloneNode(true)\n b.originalCellIndex = x\n b.sortable = s\n\n temp[1].push(b)\n }\n })\n\n // Order the row cells\n dt.data.forEach((row, i) => {\n c = row.cloneNode(false)\n d = row.cloneNode(false)\n\n c.dataIndex = d.dataIndex = i\n\n if (row.searchIndex !== null && row.searchIndex !== undefined) {\n c.searchIndex = d.searchIndex = row.searchIndex\n }\n\n // Append the cell to the fragment in the correct order\n columns.forEach(column => {\n cell = row.cells[column].cloneNode(true)\n cell.data = row.cells[column].data\n c.appendChild(cell)\n\n if (!dt.hiddenColumns.includes(column)) {\n cell = row.cells[column].cloneNode(true)\n cell.data = row.cells[column].data\n d.appendChild(cell)\n }\n })\n\n temp[2].push(c)\n temp[3].push(d)\n })\n\n dt.headings = temp[0]\n dt.activeHeadings = temp[1]\n\n dt.data = temp[2]\n dt.activeRows = temp[3]\n\n // Update\n dt.update()\n }\n\n /**\n * Hide columns\n * @return {Void}\n */\n hide(columns) {\n if (columns.length) {\n const dt = this.dt\n\n columns.forEach(column => {\n if (!dt.hiddenColumns.includes(column)) {\n dt.hiddenColumns.push(column)\n }\n })\n\n this.rebuild()\n }\n }\n\n /**\n * Show columns\n * @return {Void}\n */\n show(columns) {\n if (columns.length) {\n let index\n const dt = this.dt\n\n columns.forEach(column => {\n index = dt.hiddenColumns.indexOf(column)\n if (index > -1) {\n dt.hiddenColumns.splice(index, 1)\n }\n })\n\n this.rebuild()\n }\n }\n\n /**\n * Check column(s) visibility\n * @return {Boolean}\n */\n visible(columns) {\n let cols\n const dt = this.dt\n\n columns = columns || dt.headings.map(th => th.originalCellIndex)\n\n if (!isNaN(columns)) {\n cols = !dt.hiddenColumns.includes(columns)\n } else if (Array.isArray(columns)) {\n cols = []\n columns.forEach(column => {\n cols.push(!dt.hiddenColumns.includes(column))\n })\n }\n\n return cols\n }\n\n /**\n * Add a new column\n * @param {Object} data\n */\n add(data) {\n let td\n const th = document.createElement(\"th\")\n\n if (!this.dt.headings.length) {\n this.dt.insert({\n headings: [data.heading],\n data: data.data.map(i => [i])\n })\n this.rebuild()\n return\n }\n\n if (!this.dt.hiddenHeader) {\n if (data.heading.nodeName) {\n th.appendChild(data.heading)\n } else {\n th.innerHTML = data.heading\n }\n } else {\n th.innerHTML = \"\"\n }\n\n this.dt.headings.push(th)\n\n this.dt.data.forEach((row, i) => {\n if (data.data[i]) {\n td = document.createElement(\"td\")\n\n if (data.data[i].nodeName) {\n td.appendChild(data.data[i])\n } else {\n td.innerHTML = data.data[i]\n }\n\n td.data = td.innerHTML\n\n if (data.render) {\n td.innerHTML = data.render.call(this, td.data, td, row)\n }\n\n row.appendChild(td)\n }\n })\n\n if (data.type) {\n th.setAttribute(\"data-type\", data.type)\n }\n if (data.format) {\n th.setAttribute(\"data-format\", data.format)\n }\n\n if (data.hasOwnProperty(\"sortable\")) {\n th.sortable = data.sortable\n th.setAttribute(\"data-sortable\", data.sortable === true ? \"true\" : \"false\")\n }\n\n this.rebuild()\n\n this.dt.renderHeader()\n }\n\n /**\n * Remove column(s)\n * @param {Array|Number} select\n * @return {Void}\n */\n remove(select) {\n if (Array.isArray(select)) {\n // Remove in reverse otherwise the indexes will be incorrect\n select.sort((a, b) => b - a)\n select.forEach(column => this.remove(column))\n } else {\n this.dt.headings.splice(select, 1)\n\n this.dt.data.forEach(row => {\n row.removeChild(row.cells[select])\n })\n }\n\n this.rebuild()\n }\n\n /**\n * Filter by column\n * @param {int} column - The column no.\n * @param {string} dir - asc or desc\n * @filter {array} filter - optional parameter with a list of strings\n * @return {void}\n */\n filter(column, dir, init, terms) {\n const dt = this.dt\n\n // Creates a internal state that manages filters if there are none\n if ( !dt.filterState ) {\n dt.filterState = {\n originalData: dt.data\n }\n }\n\n // If that column is was not filtered yet, we need to create its state\n if ( !dt.filterState[column] ) {\n\n // append a filter that selects all rows, 'resetting' the filter\n const filters = [...terms, () => true]\n\n dt.filterState[column] = (\n function() {\n let i = 0;\n return () => filters[i++ % (filters.length)]\n }()\n )\n }\n\n // Apply the filter and rebuild table\n const rowFilter = dt.filterState[column]() // fetches next filter\n const filteredRows = Array.from(dt.filterState.originalData).filter(tr => {\n const cell = tr.cells[column]\n const content = cell.hasAttribute('data-content') ? cell.getAttribute('data-content') : cell.innerText\n\n // If the filter is a function, call it, if it is a string, compare it\n return (typeof rowFilter) === 'function' ? rowFilter(content) : content === rowFilter;\n })\n\n dt.data = filteredRows\n this.rebuild()\n dt.update()\n if (!init) {\n dt.emit(\"datatable.sort\", column, dir)\n }\n }\n\n /**\n * Sort by column\n * @param {int} column - The column no.\n * @param {string} dir - asc or desc\n * @return {void}\n */\n sort(column, dir, init) {\n const dt = this.dt\n\n // Check column is present\n if (dt.hasHeadings && (column < 0 || column > dt.headings.length)) {\n return false\n }\n\n //If there is a filter for this column, apply it instead of sorting\n const filterTerms = dt.options.filters &&\n dt.options.filters[dt.headings[column].textContent]\n if ( filterTerms && filterTerms.length !== 0 ) {\n this.filter(column, dir, init, filterTerms)\n return;\n }\n\n dt.sorting = true\n\n if (!init) {\n dt.emit(\"datatable.sorting\", column, dir)\n }\n\n let rows = dt.data\n const alpha = []\n const numeric = []\n let a = 0\n let n = 0\n const th = dt.headings[column]\n\n const waitFor = []\n\n // Check for date format\n if (th.getAttribute(\"data-type\") === \"date\") {\n let format = false\n const formatted = th.hasAttribute(\"data-format\")\n\n if (formatted) {\n format = th.getAttribute(\"data-format\")\n }\n waitFor.push(import(\"./date\").then(({parseDate}) => date => parseDate(date, format)))\n }\n\n Promise.all(waitFor).then(importedFunctions => {\n const parseFunction = importedFunctions[0] // only defined if date\n Array.from(rows).forEach(tr => {\n const cell = tr.cells[column]\n const content = cell.hasAttribute('data-content') ? cell.getAttribute('data-content') : cell.innerText\n let num\n if (parseFunction) {\n num = parseFunction(content)\n } else if (typeof content===\"string\") {\n num = content.replace(/(\\$|,|\\s|%)/g, \"\")\n } else {\n num = content\n }\n\n if (parseFloat(num) == num) {\n numeric[n++] = {\n value: Number(num),\n row: tr\n }\n } else {\n alpha[a++] = {\n value: typeof content===\"string\" ? content.toLowerCase() : content,\n row: tr\n }\n }\n })\n\n /* Sort according to direction (ascending or descending) */\n if (!dir) {\n if (th.classList.contains(\"asc\")) {\n dir = \"desc\"\n } else {\n dir = \"asc\"\n }\n }\n let top\n let btm\n if (dir == \"desc\") {\n top = sortItems(alpha, -1)\n btm = sortItems(numeric, -1)\n th.classList.remove(\"asc\")\n th.classList.add(\"desc\")\n } else {\n top = sortItems(numeric, 1)\n btm = sortItems(alpha, 1)\n th.classList.remove(\"desc\")\n th.classList.add(\"asc\")\n }\n\n /* Clear asc/desc class names from the last sorted column's th if it isn't the same as the one that was just clicked */\n if (dt.lastTh && th != dt.lastTh) {\n dt.lastTh.classList.remove(\"desc\")\n dt.lastTh.classList.remove(\"asc\")\n }\n\n dt.lastTh = th\n\n /* Reorder the table */\n rows = top.concat(btm)\n\n dt.data = []\n const indexes = []\n\n rows.forEach((v, i) => {\n dt.data.push(v.row)\n\n if (v.row.searchIndex !== null && v.row.searchIndex !== undefined) {\n indexes.push(i)\n }\n })\n\n dt.searchData = indexes\n\n this.rebuild()\n\n dt.update()\n\n if (!init) {\n dt.emit(\"datatable.sort\", column, dir)\n }\n })\n }\n\n /**\n * Rebuild the columns\n * @return {Void}\n */\n rebuild() {\n let a\n let b\n let c\n let d\n const dt = this.dt\n const temp = []\n\n dt.activeRows = []\n dt.activeHeadings = []\n\n dt.headings.forEach((th, i) => {\n th.originalCellIndex = i\n th.sortable = th.getAttribute(\"data-sortable\") !== \"false\"\n if (!dt.hiddenColumns.includes(i)) {\n dt.activeHeadings.push(th)\n }\n })\n\n // Loop over the rows and reorder the cells\n dt.data.forEach((row, i) => {\n a = row.cloneNode(false)\n b = row.cloneNode(false)\n\n a.dataIndex = b.dataIndex = i\n\n if (row.searchIndex !== null && row.searchIndex !== undefined) {\n a.searchIndex = b.searchIndex = row.searchIndex\n }\n\n // Append the cell to the fragment in the correct order\n Array.from(row.cells).forEach(cell => {\n c = cell.cloneNode(true)\n c.data = cell.data\n a.appendChild(c)\n\n if (!dt.hiddenColumns.includes(c.cellIndex)) {\n d = c.cloneNode(true)\n d.data = c.data\n b.appendChild(d)\n }\n })\n\n // Append the fragment with the ordered cells\n temp.push(a)\n dt.activeRows.push(b)\n })\n\n dt.data = temp\n\n dt.update()\n }\n}\n","import {createElement} from \"./helpers\"\n\n/**\n * Parse data to HTML table\n */\nexport const dataToTable = function (data) {\n let thead = false\n let tbody = false\n\n data = data || this.options.data\n\n if (data.headings) {\n thead = createElement(\"thead\")\n const tr = createElement(\"tr\")\n data.headings.forEach(col => {\n const td = createElement(\"th\", {\n html: col\n })\n tr.appendChild(td)\n })\n\n thead.appendChild(tr)\n }\n\n if (data.data && data.data.length) {\n tbody = createElement(\"tbody\")\n data.data.forEach(rows => {\n if (data.headings) {\n if (data.headings.length !== rows.length) {\n throw new Error(\n \"The number of rows do not match the number of headings.\"\n )\n }\n }\n const tr = createElement(\"tr\")\n rows.forEach(value => {\n const td = createElement(\"td\", {\n html: value\n })\n tr.appendChild(td)\n })\n tbody.appendChild(tr)\n })\n }\n\n if (thead) {\n if (this.table.tHead !== null) {\n this.table.removeChild(this.table.tHead)\n }\n this.table.appendChild(thead)\n }\n\n if (tbody) {\n if (this.table.tBodies.length) {\n this.table.removeChild(this.table.tBodies[0])\n }\n this.table.appendChild(tbody)\n }\n}\n","/**\n * Default configuration\n * @typ {Object}\n */\nexport const defaultConfig = {\n sortable: true,\n searchable: true,\n\n // Pagination\n paging: true,\n perPage: 10,\n perPageSelect: [5, 10, 15, 20, 25],\n nextPrev: true,\n firstLast: false,\n prevText: \"‹\",\n nextText: \"›\",\n firstText: \"«\",\n lastText: \"»\",\n ellipsisText: \"…\",\n ascText: \"▴\",\n descText: \"▾\",\n truncatePager: true,\n pagerDelta: 2,\n\n scrollY: \"\",\n\n fixedColumns: true,\n fixedHeight: false,\n\n header: true,\n hiddenHeader: false,\n footer: false,\n\n // Customise the display text\n labels: {\n placeholder: \"Search...\", // The search input placeholder\n perPage: \"{select} entries per page\", // per-page dropdown label\n noRows: \"No entries found\", // Message shown when there are no search results\n info: \"Showing {start} to {end} of {rows} entries\" //\n },\n\n // Customise the layout\n layout: {\n top: \"{select}{search}\",\n bottom: \"{info}{pager}\"\n }\n}\n","import {Rows} from \"./rows\"\nimport {Columns} from \"./columns\"\nimport {dataToTable} from \"./table\"\nimport {defaultConfig} from \"./config\"\nimport {\n isObject,\n isJson,\n createElement,\n flush,\n button,\n truncate\n} from \"./helpers\"\n\n\nexport class DataTable {\n constructor(table, options = {}) {\n this.initialized = false\n\n // user options\n this.options = {\n ...defaultConfig,\n ...options,\n layout: {\n ...defaultConfig.layout,\n ...options.layout\n },\n labels: {\n ...defaultConfig.labels,\n ...options.labels\n }\n }\n\n if (typeof table === \"string\") {\n table = document.querySelector(table)\n }\n\n this.initialLayout = table.innerHTML\n this.initialSortable = this.options.sortable\n\n // Disable manual sorting if no header is present (#4)\n if (!this.options.header) {\n this.options.sortable = false\n }\n\n if (table.tHead === null) {\n if (!this.options.data ||\n (this.options.data && !this.options.data.headings)\n ) {\n this.options.sortable = false\n }\n }\n\n if (table.tBodies.length && !table.tBodies[0].rows.length) {\n if (this.options.data) {\n if (!this.options.data.data) {\n throw new Error(\n \"You seem to be using the data option, but you've not defined any rows.\"\n )\n }\n }\n }\n\n this.table = table\n\n this.listeners = {\n onResize: event => this.onResize(event)\n }\n\n this.init()\n }\n\n /**\n * Add custom property or method to extend DataTable\n * @param {String} prop - Method name or property\n * @param {Mixed} val - Function or property value\n * @return {Void}\n */\n static extend(prop, val) {\n if (typeof val === \"function\") {\n DataTable.prototype[prop] = val\n } else {\n DataTable[prop] = val\n }\n }\n\n /**\n * Initialize the instance\n * @param {Object} options\n * @return {Void}\n */\n init(options) {\n if (this.initialized || this.table.classList.contains(\"dataTable-table\")) {\n return false\n }\n\n Object.assign(this.options, options || {})\n\n this.currentPage = 1\n this.onFirstPage = true\n\n this.hiddenColumns = []\n this.columnRenderers = []\n this.selectedColumns = []\n\n this.render()\n\n setTimeout(() => {\n this.emit(\"datatable.init\")\n this.initialized = true\n\n if (this.options.plugins) {\n Object.entries(this.options.plugins).forEach(([plugin, options]) => {\n if (this[plugin] && typeof this[plugin] === \"function\") {\n this[plugin] = this[plugin](options, {createElement})\n\n // Init plugin\n if (options.enabled && this[plugin].init && typeof this[plugin].init === \"function\") {\n this[plugin].init()\n }\n }\n })\n }\n }, 10)\n }\n\n /**\n * Render the instance\n * @param {String} type\n * @return {Void}\n */\n render(type) {\n if (type) {\n switch (type) {\n case \"page\":\n this.renderPage()\n break\n case \"pager\":\n this.renderPager()\n break\n case \"header\":\n this.renderHeader()\n break\n }\n\n return false\n }\n\n const options = this.options\n let template = \"\"\n\n // Convert data to HTML\n if (options.data) {\n dataToTable.call(this)\n }\n\n // Store references\n this.body = this.table.tBodies[0]\n this.head = this.table.tHead\n this.foot = this.table.tFoot\n\n if (!this.body) {\n this.body = createElement(\"tbody\")\n\n this.table.appendChild(this.body)\n }\n\n this.hasRows = this.body.rows.length > 0\n\n // Make a tHead if there isn't one (fixes #8)\n if (!this.head) {\n const h = createElement(\"thead\")\n const t = createElement(\"tr\")\n\n if (this.hasRows) {\n Array.from(this.body.rows[0].cells).forEach(() => {\n t.appendChild(createElement(\"th\"))\n })\n\n h.appendChild(t)\n }\n\n this.head = h\n\n this.table.insertBefore(this.head, this.body)\n\n this.hiddenHeader = options.hiddenHeader\n }\n\n this.headings = []\n this.hasHeadings = this.head.rows.length > 0\n\n if (this.hasHeadings) {\n this.header = this.head.rows[0]\n this.headings = [].slice.call(this.header.cells)\n }\n\n // Header\n if (!options.header) {\n if (this.head) {\n this.table.removeChild(this.table.tHead)\n }\n }\n\n // Footer\n if (options.footer) {\n if (this.head && !this.foot) {\n this.foot = createElement(\"tfoot\", {\n html: this.head.innerHTML\n })\n this.table.appendChild(this.foot)\n }\n } else {\n if (this.foot) {\n this.table.removeChild(this.table.tFoot)\n }\n }\n\n // Build\n this.wrapper = createElement(\"div\", {\n class: \"dataTable-wrapper dataTable-loading\"\n })\n\n // Template for custom layouts\n template += \"<div class='dataTable-top'>\"\n template += options.layout.top\n template += \"</div>\"\n if (options.scrollY.length) {\n template += `<div class='dataTable-container' style='height: ${options.scrollY}; overflow-Y: auto;'></div>`\n } else {\n template += \"<div class='dataTable-container'></div>\"\n }\n template += \"<div class='dataTable-bottom'>\"\n template += options.layout.bottom\n template += \"</div>\"\n\n // Info placement\n template = template.replace(\"{info}\", options.paging ? \"<div class='dataTable-info'></div>\" : \"\")\n\n // Per Page Select\n if (options.paging && options.perPageSelect) {\n let wrap = \"<div class='dataTable-dropdown'><label>\"\n wrap += options.labels.perPage\n wrap += \"</label></div>\"\n\n // Create the select\n const select = createElement(\"select\", {\n class: \"dataTable-selector\"\n })\n\n // Create the options\n options.perPageSelect.forEach(val => {\n const selected = val === options.perPage\n const option = new Option(val, val, selected, selected)\n select.add(option)\n })\n\n // Custom label\n wrap = wrap.replace(\"{select}\", select.outerHTML)\n\n // Selector placement\n template = template.replace(\"{select}\", wrap)\n } else {\n template = template.replace(\"{select}\", \"\")\n }\n\n // Searchable\n if (options.searchable) {\n const form =\n `<div class='dataTable-search'><input class='dataTable-input' placeholder='${options.labels.placeholder}' type='text'></div>`\n\n // Search input placement\n template = template.replace(\"{search}\", form)\n } else {\n template = template.replace(\"{search}\", \"\")\n }\n\n if (this.hasHeadings) {\n // Sortable\n this.render(\"header\")\n }\n\n // Add table class\n this.table.classList.add(\"dataTable-table\")\n\n // Paginator\n const paginatorWrapper = createElement(\"nav\", {\n class: \"dataTable-pagination\"\n })\n const paginator = createElement(\"ul\", {\n class: \"dataTable-pagination-list\"\n })\n paginatorWrapper.appendChild(paginator)\n\n // Pager(s) placement\n template = template.replace(/\\{pager\\}/g, paginatorWrapper.outerHTML)\n this.wrapper.innerHTML = template\n\n this.container = this.wrapper.querySelector(\".dataTable-container\")\n\n this.pagers = this.wrapper.querySelectorAll(\".dataTable-pagination-list\")\n\n this.label = this.wrapper.querySelector(\".dataTable-info\")\n\n // Insert in to DOM tree\n this.table.parentNode.replaceChild(this.wrapper, this.table)\n this.container.appendChild(this.table)\n\n // Store the table dimensions\n this.rect = this.table.getBoundingClientRect()\n\n // Convert rows to array for processing\n this.data = Array.from(this.body.rows)\n this.activeRows = this.data.slice()\n this.activeHeadings = this.headings.slice()\n\n // Update\n this.update()\n\n\n this.setColumns()\n\n\n // Fix height\n this.fixHeight()\n\n // Fix columns\n this.fixColumns()\n\n // Class names\n if (!options.header) {\n this.wrapper.classList.add(\"no-header\")\n }\n\n if (!options.footer) {\n this.wrapper.classList.add(\"no-footer\")\n }\n\n if (options.sortable) {\n this.wrapper.classList.add(\"sortable\")\n }\n\n if (options.searchable) {\n this.wrapper.classList.add(\"searchable\")\n }\n\n if (options.fixedHeight) {\n this.wrapper.classList.add(\"fixed-height\")\n }\n\n if (options.fixedColumns) {\n this.wrapper.classList.add(\"fixed-columns\")\n }\n\n this.bindEvents()\n }\n\n /**\n * Render the page\n * @return {Void}\n */\n renderPage() {\n if (this.hasHeadings) {\n flush(this.header)\n\n this.activeHeadings.forEach(th => this.header.appendChild(th))\n }\n\n\n if (this.hasRows && this.totalPages) {\n if (this.currentPage > this.totalPages) {\n this.currentPage = 1\n }\n\n // Use a fragment to limit touching the DOM\n const index = this.currentPage - 1\n\n const frag = document.createDocumentFragment()\n this.pages[index].forEach(row => frag.appendChild(this.rows().render(row)))\n\n this.clear(frag)\n\n this.onFirstPage = this.currentPage === 1\n this.onLastPage = this.currentPage === this.lastPage\n } else {\n this.setMessage(this.options.labels.noRows)\n }\n\n // Update the info\n let current = 0\n\n let f = 0\n let t = 0\n let items\n\n if (this.totalPages) {\n current = this.currentPage - 1\n f = current * this.options.perPage\n t = f + this.pages[current].length\n f = f + 1\n items = this.searching ? this.searchData.length : this.data.length\n }\n\n if (this.label && this.options.labels.info.length) {\n // CUSTOM LABELS\n const string = this.options.labels.info\n .replace(\"{start}\", f)\n .replace(\"{end}\", t)\n .replace(\"{page}\", this.currentPage)\n .replace(\"{pages}\", this.totalPages)\n .replace(\"{rows}\", items)\n\n this.label.innerHTML = items ? string : \"\"\n }\n\n if (this.currentPage == 1) {\n this.fixHeight()\n }\n }\n\n /**\n * Render the pager(s)\n * @return {Void}\n */\n renderPager() {\n flush(this.pagers)\n\n if (this.totalPages > 1) {\n const c = \"pager\"\n const frag = document.createDocumentFragment()\n const prev = this.onFirstPage ? 1 : this.currentPage - 1\n const next = this.onLastPage ? this.totalPages : this.currentPage + 1\n\n // first button\n if (this.options.firstLast) {\n frag.appendChild(button(c, 1, this.options.firstText))\n }\n\n // prev button\n if (this.options.nextPrev) {\n frag.appendChild(button(c, prev, this.options.prevText))\n }\n\n let pager = this.links\n\n // truncate the links\n if (this.options.truncatePager) {\n pager = truncate(\n this.links,\n this.currentPage,\n this.pages.length,\n this.options.pagerDelta,\n this.options.ellipsisText\n )\n }\n\n // active page link\n this.links[this.currentPage - 1].classList.add(\"active\")\n\n // append the links\n pager.forEach(p => {\n p.classList.remove(\"active\")\n frag.appendChild(p)\n })\n\n this.links[this.currentPage - 1].classList.add(\"active\")\n\n // next button\n if (this.options.nextPrev) {\n frag.appendChild(button(c, next, this.options.nextText))\n }\n\n // first button\n if (this.options.firstLast) {\n frag.appendChild(button(c, this.totalPages, this.options.lastText))\n }\n\n // We may have more than one pager\n this.pagers.forEach(pager => {\n pager.appendChild(frag.cloneNode(true))\n })\n }\n }\n\n /**\n * Render the header\n * @return {Void}\n */\n renderHeader() {\n this.labels = []\n\n if (this.headings && this.headings.length) {\n this.headings.forEach((th, i) => {\n\n this.labels[i] = th.textContent\n\n if (th.firstElementChild && th.firstElementChild.classList.contains(\"dataTable-sorter\")) {\n th.innerHTML = th.firstElementChild.innerHTML\n }\n\n th.sortable = th.getAttribute(\"data-sortable\") !== \"false\"\n\n th.originalCellIndex = i\n if (this.options.sortable && th.sortable) {\n const link = createElement(\"a\", {\n href: \"#\",\n class: \"dataTable-sorter\",\n html: th.innerHTML\n })\n\n th.innerHTML = \"\"\n th.setAttribute(\"data-sortable\", \"\")\n th.appendChild(link)\n }\n })\n }\n\n this.fixColumns()\n }\n\n /**\n * Bind event listeners\n * @return {[type]} [description]\n */\n bindEvents() {\n const options = this.options\n // Per page selector\n if (options.perPageSelect) {\n const selector = this.wrapper.querySelector(\".dataTable-selector\")\n if (selector) {\n // Change per page\n selector.addEventListener(\"change\", () => {\n options.perPage = parseInt(selector.value, 10)\n this.update()\n\n this.fixHeight()\n\n this.emit(\"datatable.perpage\", options.perPage)\n }, false)\n }\n }\n\n // Search input\n if (options.searchable) {\n this.input = this.wrapper.querySelector(\".dataTable-input\")\n if (this.input) {\n this.input.addEventListener(\"keyup\", () => this.search(this.input.value), false)\n }\n }\n\n // Pager(s) / sorting\n this.wrapper.addEventListener(\"click\", e => {\n const t = e.target.closest('a')\n if (t && (t.nodeName.toLowerCase() === \"a\")) {\n if (t.hasAttribute(\"data-page\")) {\n this.page(t.getAttribute(\"data-page\"))\n e.preventDefault()\n } else if (\n options.sortable &&\n t.classList.contains(\"dataTable-sorter\") &&\n t.parentNode.getAttribute(\"data-sortable\") != \"false\"\n ) {\n this.columns().sort(this.headings.indexOf(t.parentNode))\n e.preventDefault()\n }\n }\n }, false)\n\n window.addEventListener(\"resize\", this.listeners.onResize)\n }\n\n /**\n * execute on resize\n */\n onResize() {\n this.rect = this.container.getBoundingClientRect()\n if (!this.rect.width) {\n // No longer shown, likely no longer part of DOM. Give up.\n return\n }\n this.fixColumns()\n }\n\n /**\n * Set up columns\n * @return {[type]} [description]\n */\n setColumns(ajax) {\n\n if (!ajax) {\n this.data.forEach(row => {\n Array.from(row.cells).forEach(cell => {\n cell.data = cell.innerHTML\n })\n })\n }\n\n // Check for the columns option\n if (this.options.columns && this.headings.length) {\n\n this.options.columns.forEach(data => {\n\n // convert single column selection to array\n if (!Array.isArray(data.select)) {\n data.select = [data.select]\n }\n\n if (data.hasOwnProperty(\"render\") && typeof data.render === \"function\") {\n this.selectedColumns = this.selectedColumns.concat(data.select)\n\n this.columnRenderers.push({\n columns: data.select,\n renderer: data.render\n })\n }\n\n // Add the data attributes to the th elements\n data.select.forEach(column => {\n const th = this.headings[column]\n if (data.type) {\n th.setAttribute(\"data-type\", data.type)\n }\n if (data.format) {\n th.setAttribute(\"data-format\", data.format)\n }\n if (data.hasOwnProperty(\"sortable\")) {\n th.setAttribute(\"data-sortable\", data.sortable)\n }\n\n if (data.hasOwnProperty(\"hidden\")) {\n if (data.hidden !== false) {\n this.columns().hide([column])\n }\n }\n\n if (data.hasOwnProperty(\"sort\") && data.select.length === 1) {\n this.columns().sort(data.select[0], data.sort, true)\n }\n })\n })\n }\n\n if (this.hasRows) {\n this.data.forEach((row, i) => {\n row.dataIndex = i\n Array.from(row.cells).forEach(cell => {\n cell.data = cell.innerHTML\n })\n })\n\n if (this.selectedColumns.length) {\n this.data.forEach(row => {\n Array.from(row.cells).forEach((cell, i) => {\n if (this.selectedColumns.includes(i)) {\n this.columnRenderers.forEach(options => {\n if (options.columns.includes(i)) {\n cell.innerHTML = options.renderer.call(this, cell.data, cell, row)\n }\n })\n }\n })\n })\n }\n\n this.columns().rebuild()\n }\n\n this.render(\"header\")\n }\n\n /**\n * Destroy the instance\n * @return {void}\n */\n destroy() {\n this.table.innerHTML = this.initialLayout\n\n // Remove the className\n this.table.classList.remove(\"dataTable-table\")\n\n // Remove the containers\n this.wrapper.parentNode.replaceChild(this.table, this.wrapper)\n\n this.initialized = false\n\n window.removeEventListener(\"resize\", this.listeners.onResize)\n }\n\n /**\n * Update the instance\n * @return {Void}\n */\n update() {\n this.wrapper.classList.remove(\"dataTable-empty\")\n\n this.paginate(this)\n this.render(\"page\")\n\n this.links = []\n\n let i = this.pages.length\n while (i--) {\n const num = i + 1\n this.links[i] = button(i === 0 ? \"active\" : \"\", num, num)\n }\n\n this.sorting = false\n\n this.render(\"pager\")\n\n this.rows().update()\n\n this.emit(\"datatable.update\")\n }\n\n /**\n * Sort rows into pages\n * @return {Number}\n */\n paginate() {\n const perPage = this.options.perPage\n let rows = this.activeRows\n\n if (this.searching) {\n rows = []\n\n this.searchData.forEach(index => rows.push(this.activeRows[index]))\n }\n\n if (this.options.paging) {\n // Check for hidden columns\n this.pages = rows\n .map((tr, i) => i % perPage === 0 ? rows.slice(i, i + perPage) : null)\n .filter(page => page)\n } else {\n this.pages = [rows]\n }\n\n this.totalPages = this.lastPage = this.pages.length\n\n return this.totalPages\n }\n\n /**\n * Fix column widths\n * @return {Void}\n */\n fixColumns() {\n\n if ((this.options.scrollY.length || this.options.fixedColumns) && this.activeHeadings && this.activeHeadings.length) {\n let cells\n let hd = false\n this.columnWidths = []\n\n // If we have headings we need only set the widths on them\n // otherwise we need a temp header and the widths need applying to all cells\n if (this.table.tHead) {\n\n if (this.options.scrollY.length) {\n hd = createElement(\"thead\")\n hd.appendChild(createElement(\"tr\"))\n hd.style.height = '0px'\n if (this.headerTable) {\n // move real header back into place\n this.table.tHead = this.headerTable.tHead\n }\n }\n\n // Reset widths\n this.activeHeadings.forEach(cell => {\n cell.style.width = \"\"\n })\n\n this.activeHeadings.forEach((cell, i) => {\n const ow = cell.offsetWidth\n const w = ow / this.rect.width * 100\n cell.style.width = `${w}%`\n this.columnWidths[i] = ow\n if (this.options.scrollY.length) {\n const th = createElement(\"th\")\n hd.firstElementChild.appendChild(th)\n th.style.width = `${w}%`\n th.style.paddingTop = \"0\"\n th.style.paddingBottom = \"0\"\n th.style.border = \"0\"\n }\n })\n\n if (this.options.scrollY.length) {\n const container = this.table.parentElement\n if (!this.headerTable) {\n this.headerTable = createElement(\"table\", {\n class: \"dataTable-table\"\n })\n const headercontainer = createElement(\"div\", {\n class: \"dataTable-headercontainer\"\n })\n headercontainer.appendChild(this.headerTable)\n container.parentElement.insertBefore(headercontainer, container)\n }\n const thd = this.table.tHead\n this.table.replaceChild(hd, thd)\n this.headerTable.tHead = thd\n\n // Compensate for scrollbars.\n this.headerTable.parentElement.style.paddingRight = `${\n this.headerTable.clientWidth -\n this.table.clientWidth +\n parseInt(\n this.headerTable.parentElement.style.paddingRight ||\n '0',\n 10\n )\n }px`\n\n if (container.scrollHeight > container.clientHeight) {\n // scrollbars on one page means scrollbars on all pages.\n container.style.overflowY = 'scroll'\n }\n }\n\n } else {\n cells = []\n\n // Make temperary headings\n hd = createElement(\"thead\")\n const r = createElement(\"tr\")\n Array.from(this.table.tBodies[0].rows[0].cells).forEach(() => {\n const th = createElement(\"th\")\n r.appendChild(th)\n cells.push(th)\n })\n\n hd.appendChild(r)\n this.table.insertBefore(hd, this.body)\n\n const widths = []\n cells.forEach((cell, i) => {\n const ow = cell.offsetWidth\n const w = ow / this.rect.width * 100\n widths.push(w)\n this.columnWidths[i] = ow\n })\n\n this.data.forEach(row => {\n Array.from(row.cells).forEach((cell, i) => {\n if (this.columns(cell.cellIndex).visible())\n cell.style.width = `${widths[i]}%`\n })\n })\n\n // Discard the temp header\n this.table.removeChild(hd)\n }\n }\n }\n\n /**\n * Fix the container height\n * @return {Void}\n */\n fixHeight() {\n if (this.options.fixedHeight) {\n this.container.style.height = null\n this.rect = this.container.getBoundingClientRect()\n this.container.style.height = `${this.rect.height}px`\n }\n }\n\n /**\n * Perform a search of the data set\n * @param {string} query\n * @return {void}\n */\n search(query) {\n if (!this.hasRows) return false\n\n query = query.toLowerCase()\n\n this.currentPage = 1\n this.searching = true\n this.searchData = []\n\n if (!query.length) {\n this.searching = false\n this.update()\n this.emit(\"datatable.search\", query, this.searchData)\n this.wrapper.classList.remove(\"search-results\")\n return false\n }\n\n this.clear()\n\n this.data.forEach((row, idx) => {\n const inArray = this.searchData.includes(row)\n\n // https://github.com/Mobius1/Vanilla-DataTables/issues/12\n const doesQueryMatch = query.split(\" \").reduce((bool, word) => {\n let includes = false\n let cell = null\n let content = null\n\n for (let x = 0; x < row.cells.length; x++) {\n cell = row.cells[x]\n content = cell.hasAttribute('data-content') ? cell.getAttribute('data-content') : cell.textContent\n\n if (\n content.toLowerCase().includes(word) &&\n this.columns(cell.cellIndex).visible()\n ) {\n includes = true\n break\n }\n }\n\n return bool && includes\n }, true)\n\n if (doesQueryMatch && !inArray) {\n row.searchIndex = idx\n this.searchData.push(idx)\n } else {\n row.searchIndex = null\n }\n })\n\n this.wrapper.classList.add(\"search-results\")\n\n if (!this.searchData.length) {\n this.wrapper.classList.remove(\"search-results\")\n\n this.setMessage(this.options.labels.noRows)\n } else {\n this.update()\n }\n\n this.emit(\"datatable.search\", query, this.searchData)\n }\n\n /**\n * Change page\n * @param {int} page\n * @return {void}\n */\n page(page) {\n // We don't want to load the current page again.\n if (page == this.currentPage) {\n return false\n }\n\n if (!isNaN(page)) {\n this.currentPage = parseInt(page, 10)\n }\n\n if (page > this.pages.length || page < 0) {\n return false\n }\n\n this.render(\"page\")\n this.render(\"pager\")\n\n this.emit(\"datatable.page\", page)\n }\n\n /**\n * Sort by column\n * @param {int} column - The column no.\n * @param {string} direction - asc or desc\n * @return {void}\n */\n sortColumn(column, direction) {\n // Use columns API until sortColumn method is removed\n this.columns().sort(column, direction)\n }\n\n /**\n * Add new row data\n * @param {object} data\n */\n insert(data) {\n let rows = []\n if (isObject(data)) {\n if (data.headings) {\n if (!this.hasHeadings && !this.hasRows) {\n const tr = createElement(\"tr\")\n data.headings.forEach(heading => {\n const th = createElement(\"th\", {\n html: heading\n })\n\n tr.appendChild(th)\n })\n this.head.appendChild(tr)\n\n this.header = tr\n this.headings = [].slice.call(tr.cells)\n this.hasHeadings = true\n\n // Re-enable sorting if it was disabled due\n // to missing header\n this.options.sortable = this.initialSortable\n\n // Allow sorting on new header\n this.render(\"header\")\n\n // Activate newly added headings\n this.activeHeadings = this.headings.slice()\n }\n }\n\n if (data.data && Array.isArray(data.data)) {\n rows = data.data\n }\n } else if (Array.isArray(data)) {\n data.forEach(row => {\n const r = []\n Object.entries(row).forEach(([heading, cell]) => {\n\n const index = this.labels.indexOf(heading)\n\n if (index > -1) {\n r[index] = cell\n }\n })\n rows.push(r)\n })\n }\n\n if (rows.length) {\n this.rows().add(rows)\n\n this.hasRows = true\n }\n\n this.update()\n this.setColumns()\n this.fixColumns()\n }\n\n /**\n * Refresh the instance\n * @return {void}\n */\n refresh() {\n if (this.options.searchable) {\n this.input.value = \"\"\n this.searching = false\n }\n this.currentPage = 1\n this.onFirstPage = true\n this.update()\n\n this.emit(\"datatable.refresh\")\n }\n\n /**\n * Truncate the table\n * @param {mixes} html - HTML string or HTMLElement\n * @return {void}\n */\n clear(html) {\n if (this.body) {\n flush(this.body)\n }\n\n let parent = this.body\n if (!this.body) {\n parent = this.table\n }\n\n if (html) {\n if (typeof html === \"string\") {\n const frag = document.createDocumentFragment()\n frag.innerHTML = html\n }\n\n parent.appendChild(html)\n }\n }\n\n /**\n * Export table to various formats (csv, txt or sql)\n * @param {Object} userOptions User options\n * @return {Boolean}\n */\n export(userOptions) {\n if (!this.hasHeadings && !this.hasRows) return false\n\n const headers = this.activeHeadings\n let rows = []\n const arr = []\n let i\n let x\n let str\n let link\n\n const defaults = {\n download: true,\n skipColumn: [],\n\n // csv\n lineDelimiter: \"\\n\",\n columnDelimiter: \",\",\n\n // sql\n tableName: \"myTable\",\n\n // json\n replacer: null,\n space: 4\n }\n\n // Check for the options object\n if (!isObject(userOptions)) {\n return false\n }\n\n const options = {\n ...defaults,\n ...userOptions\n }\n\n if (options.type) {\n if (options.type === \"txt\" || options.type === \"csv\") {\n // Include headings\n rows[0] = this.header\n }\n\n // Selection or whole table\n if (options.selection) {\n // Page number\n if (!isNaN(options.selection)) {\n rows = rows.concat(this.pages[options.selection - 1])\n } else if (Array.isArray(options.selection)) {\n // Array of page numbers\n for (i = 0; i < options.selection.length; i++) {\n rows = rows.concat(this.pages[options.selection[i] - 1])\n }\n }\n } else {\n rows = rows.concat(this.activeRows)\n }\n\n // Only proceed if we have data\n if (rows.length) {\n if (options.type === \"txt\" || options.type === \"csv\") {\n str = \"\"\n\n for (i = 0; i < rows.length; i++) {\n for (x = 0; x < rows[i].cells.length; x++) {\n // Check for column skip and visibility\n if (\n !options.skipColumn.includes(headers[x].originalCellIndex) &&\n this.columns(headers[x].originalCellIndex).visible()\n ) {\n let text = rows[i].cells[x].textContent\n text = text.trim()\n text = text.replace(/\\s{2,}/g, ' ')\n text = text.replace(/\\n/g, ' ')\n text = text.replace(/\"/g, '\"\"')\n //have to manually encode \"#\" as encodeURI leaves it as is.\n text = text.replace(/#/g, \"%23\")\n if (text.includes(\",\"))\n text = `\"${text}\"`\n\n\n str += text + options.columnDelimiter\n }\n }\n // Remove trailing column delimiter\n str = str.trim().substring(0, str.length - 1)\n\n // Apply line delimiter\n str += options.lineDelimiter\n }\n\n // Remove trailing line delimiter\n str = str.trim().substring(0, str.length - 1)\n\n if (options.download) {\n str = `data:text/csv;charset=utf-8,${str}`\n }\n } else if (options.type === \"sql\") {\n // Begin INSERT statement\n str = `INSERT INTO \\`${options.tableName}\\` (`\n\n // Convert table headings to column names\n for (i = 0; i < headers.length; i++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[i].originalCellIndex) &&\n this.columns(headers[i].originalCellIndex).visible()\n ) {\n str += `\\`${headers[i].textContent}\\`,`\n }\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // Begin VALUES\n str += \") VALUES \"\n\n // Iterate rows and convert cell data to column values\n for (i = 0; i < rows.length; i++) {\n str += \"(\"\n\n for (x = 0; x < rows[i].cells.length; x++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[x].originalCellIndex) &&\n this.columns(headers[x].originalCellIndex).visible()\n ) {\n str += `\"${rows[i].cells[x].textContent}\",`\n }\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // end VALUES\n str += \"),\"\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // Add trailing colon\n str += \";\"\n\n if (options.download) {\n str = `data:application/sql;charset=utf-8,${str}`\n }\n } else if (options.type === \"json\") {\n // Iterate rows\n for (x = 0; x < rows.length; x++) {\n arr[x] = arr[x] || {}\n // Iterate columns\n for (i = 0; i < headers.length; i++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[i].originalCellIndex) &&\n this.columns(headers[i].originalCellIndex).visible()\n ) {\n arr[x][headers[i].textContent] = rows[x].cells[i].textContent\n }\n }\n }\n\n // Convert the array of objects to JSON string\n str = JSON.stringify(arr, options.replacer, options.space)\n\n if (options.download) {\n str = `data:application/json;charset=utf-8,${str}`\n }\n }\n\n // Download\n if (options.download) {\n // Filename\n options.filename = options.filename || \"datatable_export\"\n options.filename += `.${options.type}`\n\n str = encodeURI(str)\n\n // Create a link to trigger the download\n link = document.createElement(\"a\")\n link.href = str\n link.download = options.filename\n\n // Append the link\n document.body.appendChild(link)\n\n // Trigger the download\n link.click()\n\n // Remove the link\n document.body.removeChild(link)\n }\n\n return str\n }\n }\n\n return false\n }\n\n /**\n * Import data to the table\n * @param {Object} userOptions User options\n * @return {Boolean}\n */\n import(userOptions) {\n let obj = false\n const defaults = {\n // csv\n lineDelimiter: \"\\n\",\n columnDelimiter: \",\"\n }\n\n // Check for the options object\n if (!isObject(userOptions)) {\n return false\n }\n\n const options = {\n ...defaults,\n ...userOptions\n }\n\n if (options.data.length || isObject(options.data)) {\n // Import CSV\n if (options.type === \"csv\") {\n obj = {\n data: []\n }\n\n // Split the string into rows\n const rows = options.data.split(options.lineDelimiter)\n\n if (rows.length) {\n\n if (options.headings) {\n obj.headings = rows[0].split(options.columnDelimiter)\n\n rows.shift()\n }\n\n rows.forEach((row, i) => {\n obj.data[i] = []\n\n // Split the rows into values\n const values = row.split(options.columnDelimiter)\n\n if (values.length) {\n values.forEach(value => {\n obj.data[i].push(value)\n })\n }\n })\n }\n } else if (options.type === \"json\") {\n const json = isJson(options.data)\n\n // Valid JSON string\n if (json) {\n obj = {\n headings: [],\n data: []\n }\n\n json.forEach((data, i) => {\n obj.data[i] = []\n Object.entries(data).forEach(([column, value]) => {\n if (!obj.headings.includes(column)) {\n obj.headings.push(column)\n }\n\n obj.data[i].push(value)\n })\n })\n } else {\n // console.warn(\"That's not valid JSON!\")\n }\n }\n\n if (isObject(options.data)) {\n obj = options.data\n }\n\n if (obj) {\n // Add the rows\n this.insert(obj)\n }\n }\n\n return false\n }\n\n /**\n * Print the table\n * @return {void}\n */\n print() {\n const headings = this.activeHeadings\n const rows = this.activeRows\n const table = createElement(\"table\")\n const thead = createElement(\"thead\")\n const tbody = createElement(\"tbody\")\n\n const tr = createElement(\"tr\")\n headings.forEach(th => {\n tr.appendChild(\n createElement(\"th\", {\n html: th.textContent\n })\n )\n })\n\n thead.appendChild(tr)\n\n rows.forEach(row => {\n const tr = createElement(\"tr\")\n Array.from(row.cells).forEach(cell => {\n tr.appendChild(\n createElement(\"td\", {\n html: cell.textContent\n })\n )\n })\n tbody.appendChild(tr)\n })\n\n table.appendChild(thead)\n table.appendChild(tbody)\n\n // Open new window\n const w = window.open()\n\n // Append the table to the body\n w.document.body.appendChild(table)\n\n // Print\n w.print()\n }\n\n /**\n * Show a message in the table\n * @param {string} message\n */\n setMessage(message) {\n let colspan = 1\n\n if (this.hasRows) {\n colspan = this.data[0].cells.length\n } else if (this.activeHeadings.length) {\n colspan = this.activeHeadings.length\n }\n\n this.wrapper.classList.add(\"dataTable-empty\")\n\n if (this.label) {\n this.label.innerHTML = \"\"\n }\n this.totalPages = 0\n this.render(\"pager\")\n\n this.clear(\n createElement(\"tr\", {\n html: `<td class=\"dataTables-empty\" colspan=\"${colspan}\">${message}</td>`\n })\n )\n }\n\n /**\n * Columns API access\n * @return {Object} new Columns instance\n */\n columns(columns) {\n return new Columns(this, columns)\n }\n\n /**\n * Rows API access\n * @return {Object} new Rows instance\n */\n rows(rows) {\n return new Rows(this, rows)\n }\n\n /**\n * Add custom event listener\n * @param {String} event\n * @param {Function} callback\n * @return {Void}\n */\n on(event, callback) {\n this.events = this.events || {}\n this.events[event] = this.events[event] || []\n this.events[event].push(callback)\n }\n\n /**\n * Remove custom event listener\n * @param {String} event\n * @param {Function} callback\n * @return {Void}\n */\n off(event, callback) {\n this.events = this.events || {}\n if (event in this.events === false) return\n this.events[event].splice(this.events[event].indexOf(callback), 1)\n }\n\n /**\n * Fire custom event\n * @param {String} event\n * @return {Void}\n */\n emit(event) {\n this.events = this.events || {}\n if (event in this.events === false) return\n for (let i = 0; i < this.events[event].length; i++) {\n this.events[event][i].apply(this, Array.prototype.slice.call(arguments, 1))\n }\n }\n}\n"],"names":["isObject","val","Object","prototype","toString","call","createElement","nodeName","attrs","dom","document","attr","innerHTML","setAttribute","flush","el","NodeList","forEach","e","button","className","page","text","class","html","sortItems","a","b","c","d","length","f","value","g","h","i","Rows","constructor","dt","rows","this","build","row","tr","headings","map","td","data","appendChild","render","add","Array","isArray","push","hasRows","update","columns","rebuild","remove","select","sort","splice","dataIndex","Columns","swap","cols","x","y","order","s","cell","temp","column","getAttribute","cloneNode","originalCellIndex","sortable","hiddenColumns","includes","searchIndex","undefined","cells","activeHeadings","activeRows","hide","show","index","indexOf","visible","th","isNaN","insert","heading","hiddenHeader","type","format","hasOwnProperty","renderHeader","removeChild","filter","dir","init","terms","filterState","originalData","filters","rowFilter","filteredRows","from","content","hasAttribute","innerText","emit","hasHeadings","filterTerms","options","textContent","sorting","alpha","numeric","n","waitFor","Promise","then","parseDate","date","all","importedFunctions","parseFunction","top","btm","num","replace","parseFloat","Number","toLowerCase","classList","contains","lastTh","concat","indexes","v","searchData","cellIndex","dataToTable","thead","tbody","col","Error","table","tHead","tBodies","defaultConfig","searchable","paging","perPage","perPageSelect","nextPrev","firstLast","prevText","nextText","firstText","lastText","ellipsisText","ascText","descText","truncatePager","pagerDelta","scrollY","fixedColumns","fixedHeight","header","footer","labels","placeholder","noRows","info","layout","bottom","DataTable","initialized","querySelector","initialLayout","initialSortable","listeners","onResize","event","prop","assign","currentPage","onFirstPage","columnRenderers","selectedColumns","setTimeout","plugins","entries","plugin","enabled","renderPage","renderPager","template","body","head","foot","tFoot","t","insertBefore","slice","wrapper","wrap","selected","option","Option","outerHTML","form","paginatorWrapper","paginator","container","pagers","querySelectorAll","label","parentNode","replaceChild","rect","getBoundingClientRect","setColumns","fixHeight","fixColumns","bindEvents","totalPages","frag","createDocumentFragment","pages","clear","onLastPage","lastPage","setMessage","items","current","searching","string","prev","next","pager","links","ellipsis","j","k","l","children","truncate","p","firstElementChild","link","href","selector","addEventListener","parseInt","input","search","target","closest","preventDefault","window","width","ajax","renderer","hidden","destroy","removeEventListener","paginate","hd","columnWidths","style","height","headerTable","ow","offsetWidth","w","paddingTop","paddingBottom","border","parentElement","headercontainer","thd","paddingRight","clientWidth","scrollHeight","clientHeight","overflowY","r","widths","query","idx","inArray","split","reduce","bool","word","sortColumn","direction","refresh","parent","export","userOptions","headers","arr","str","download","skipColumn","lineDelimiter","columnDelimiter","tableName","replacer","space","selection","trim","substring","JSON","stringify","filename","encodeURI","click","import","obj","shift","values","json","parse","isJson","print","open","message","colspan","on","callback","events","off","apply","arguments"],"mappings":"oEAIO,MAAMA,EAAWC,GAA+C,oBAAxCC,OAAOC,UAAUC,SAASC,KAAKJ,GAuBjDK,EAAgB,CAACC,EAAUC,WAC9BC,EAAMC,SAASJ,cAAcC,MAC/BC,GAAS,iBAAmBA,MACvB,MAAMG,KAAQH,EACX,SAAWG,EACXF,EAAIG,UAAYJ,EAAMG,GAEtBF,EAAII,aAAaF,EAAMH,EAAMG,WAIlCF,GAGEK,EAAQC,IACbA,aAAcC,SACdD,EAAGE,SAAQC,GAAKJ,EAAMI,KAEtBH,EAAGH,UAAY,IAWVO,EAAS,CAACC,EAAWC,EAAMC,IAAShB,EAC7C,KACA,CACIiB,MAAOH,EACPI,KAAO,0BAAyBH,MAASC,UAOpCG,EAAY,CAACC,EAAGC,SACrBC,EACAC,EACA,IAAMF,GACNC,EAAI,EACJC,EAAIH,EAAEI,SAEK,IAAPH,IACAC,EAAIF,EAAEI,OAAS,EACfD,GAAK,OAGR,IAAIX,GAAI,EAAIA,GAAI,CACjBA,GAAI,MACC,IAAIa,EAAIH,EAAGG,GAAKF,EAAGE,GAAKJ,KACrBD,EAAEK,EAAIJ,IAAMD,EAAEK,GAAGC,MAAQN,EAAEK,EAAIJ,GAAGK,MAAO,OACnCC,EAAIP,EAAEK,GACNG,EAAIR,EAAEK,EAAIJ,GACVQ,EAAIF,EACVP,EAAEK,GAAKG,EACPR,EAAEK,EAAIJ,GAAKQ,EACXjB,GAAI,UAITQ,GCtFJ,MAAMU,EACTC,YAAYC,EAAIC,eACPD,GAAKA,OACLC,KAAOA,EAELC,KAQXC,MAAMC,SACIC,EAAKrC,EAAc,UAErBsC,EAAWJ,KAAKF,GAAGM,gBAElBA,EAASd,SACVc,EAAWF,EAAIG,KAAI,IAAM,MAG7BD,EAAS3B,SAAQ,CAACiB,EAAGC,WACXW,EAAKxC,EAAc,MAGpBoC,EAAIP,IAAOO,EAAIP,GAAGL,SACnBY,EAAIP,GAAK,IAGbW,EAAGlC,UAAY8B,EAAIP,GAEnBW,EAAGC,KAAOL,EAAIP,GAEdQ,EAAGK,YAAYF,MAGZH,EAGXM,OAAOP,UACIA,EAOXQ,IAAIH,MACII,MAAMC,QAAQL,GAAO,OACfT,EAAKE,KAAKF,GAEZa,MAAMC,QAAQL,EAAK,IACnBA,EAAK9B,SAAQyB,IACTJ,EAAGS,KAAKM,KAAKb,KAAKC,MAAMC,OAG5BJ,EAAGS,KAAKM,KAAKb,KAAKC,MAAMM,IAIvBT,EAAGS,KAAKjB,SACTQ,EAAGgB,SAAU,QAIZC,SAELjB,EAAGkB,UAAUC,WAUrBC,OAAOC,SACGrB,EAAKE,KAAKF,GAEZa,MAAMC,QAAQO,IAEdA,EAAOC,MAAK,CAAClC,EAAGC,IAAMA,EAAID,IAE1BiC,EAAO1C,SAAQyB,IACXJ,EAAGS,KAAKc,OAAOnB,EAAK,OAEP,OAAViB,EACPrB,EAAGS,KAAO,GAEVT,EAAGS,KAAKc,OAAOF,EAAQ,GAIrBrB,EAAGS,KAAKjB,SACVQ,EAAGgB,SAAU,QAGZC,SACLjB,EAAGkB,UAAUC,UAOjBF,cACSjB,GAAGS,KAAK9B,SAAQ,CAACyB,EAAKP,KACvBO,EAAIoB,UAAY3B,MC5GrB,MAAM4B,EACT1B,YAAYC,eACHA,GAAKA,EACHE,KAOXwB,KAAKR,MACGA,EAAQ1B,QAA6B,IAAnB0B,EAAQ1B,OAAc,OAClCmC,EAAO,QAGR3B,GAAGM,SAAS3B,SAAQ,CAACiB,EAAGC,KACzB8B,EAAKZ,KAAKlB,YAGR+B,EAAIV,EAAQ,GACZW,EAAIX,EAAQ,GACZ7B,EAAIsC,EAAKE,GACfF,EAAKE,GAAKF,EAAKC,GACfD,EAAKC,GAAKvC,OAELyC,MAAMH,IAQnBG,MAAMZ,OACE9B,EACAC,EACAC,EACAC,EACAK,EACAmC,EACAC,QAEEC,EAAO,CACT,GACA,GACA,GACA,IAGEjC,EAAKE,KAAKF,GAGhBkB,EAAQvC,SAAQ,CAACuD,EAAQN,KACrBhC,EAAII,EAAGM,SAAS4B,GAChBH,EAAwC,UAApCnC,EAAEuC,aAAa,iBACnB/C,EAAIQ,EAAEwC,WAAU,GAChBhD,EAAEiD,kBAAoBT,EACtBxC,EAAEkD,SAAWP,EAEbE,EAAK,GAAGlB,KAAK3B,GAERY,EAAGuC,cAAcC,SAASN,KAC3B7C,EAAIO,EAAEwC,WAAU,GAChB/C,EAAEgD,kBAAoBT,EACtBvC,EAAEiD,SAAWP,EAEbE,EAAK,GAAGlB,KAAK1B,OAKrBW,EAAGS,KAAK9B,SAAQ,CAACyB,EAAKP,KAClBP,EAAIc,EAAIgC,WAAU,GAClB7C,EAAIa,EAAIgC,WAAU,GAElB9C,EAAEkC,UAAYjC,EAAEiC,UAAY3B,EAEJ,OAApBO,EAAIqC,kBAA4CC,IAApBtC,EAAIqC,cAChCnD,EAAEmD,YAAclD,EAAEkD,YAAcrC,EAAIqC,aAIxCvB,EAAQvC,SAAQuD,IACZF,EAAO5B,EAAIuC,MAAMT,GAAQE,WAAU,GACnCJ,EAAKvB,KAAOL,EAAIuC,MAAMT,GAAQzB,KAC9BnB,EAAEoB,YAAYsB,GAEThC,EAAGuC,cAAcC,SAASN,KAC3BF,EAAO5B,EAAIuC,MAAMT,GAAQE,WAAU,GACnCJ,EAAKvB,KAAOL,EAAIuC,MAAMT,GAAQzB,KAC9BlB,EAAEmB,YAAYsB,OAItBC,EAAK,GAAGlB,KAAKzB,GACb2C,EAAK,GAAGlB,KAAKxB,MAGjBS,EAAGM,SAAW2B,EAAK,GACnBjC,EAAG4C,eAAiBX,EAAK,GAEzBjC,EAAGS,KAAOwB,EAAK,GACfjC,EAAG6C,WAAaZ,EAAK,GAGrBjC,EAAGiB,SAOP6B,KAAK5B,MACGA,EAAQ1B,OAAQ,OACVQ,EAAKE,KAAKF,GAEhBkB,EAAQvC,SAAQuD,IACPlC,EAAGuC,cAAcC,SAASN,IAC3BlC,EAAGuC,cAAcxB,KAAKmB,WAIzBf,WAQb4B,KAAK7B,MACGA,EAAQ1B,OAAQ,KACZwD,QACEhD,EAAKE,KAAKF,GAEhBkB,EAAQvC,SAAQuD,IACZc,EAAQhD,EAAGuC,cAAcU,QAAQf,GAC7Bc,GAAS,GACThD,EAAGuC,cAAchB,OAAOyB,EAAO,WAIlC7B,WAQb+B,QAAQhC,OACAS,QACE3B,EAAKE,KAAKF,UAEhBkB,EAAUA,GAAWlB,EAAGM,SAASC,KAAI4C,GAAMA,EAAGd,oBAEzCe,MAAMlC,GAEAL,MAAMC,QAAQI,KACrBS,EAAO,GACPT,EAAQvC,SAAQuD,IACZP,EAAKZ,MAAMf,EAAGuC,cAAcC,SAASN,QAJzCP,GAAQ3B,EAAGuC,cAAcC,SAAStB,GAQ/BS,EAOXf,IAAIH,OACID,QACE2C,EAAK/E,SAASJ,cAAc,UAE7BkC,KAAKF,GAAGM,SAASd,mBACbQ,GAAGqD,OAAO,CACX/C,SAAU,CAACG,EAAK6C,SAChB7C,KAAMA,EAAKA,KAAKF,KAAIV,GAAK,CAACA,iBAEzBsB,UAIJjB,KAAKF,GAAGuD,aAOTJ,EAAG7E,UAAY,GANXmC,EAAK6C,QAAQrF,SACbkF,EAAGzC,YAAYD,EAAK6C,SAEpBH,EAAG7E,UAAYmC,EAAK6C,aAMvBtD,GAAGM,SAASS,KAAKoC,QAEjBnD,GAAGS,KAAK9B,SAAQ,CAACyB,EAAKP,KACnBY,EAAKA,KAAKZ,KACVW,EAAKpC,SAASJ,cAAc,MAExByC,EAAKA,KAAKZ,GAAG5B,SACbuC,EAAGE,YAAYD,EAAKA,KAAKZ,IAEzBW,EAAGlC,UAAYmC,EAAKA,KAAKZ,GAG7BW,EAAGC,KAAOD,EAAGlC,UAETmC,EAAKE,SACLH,EAAGlC,UAAYmC,EAAKE,OAAO5C,KAAKmC,KAAMM,EAAGC,KAAMD,EAAIJ,IAGvDA,EAAIM,YAAYF,OAIpBC,EAAK+C,MACLL,EAAG5E,aAAa,YAAakC,EAAK+C,MAElC/C,EAAKgD,QACLN,EAAG5E,aAAa,cAAekC,EAAKgD,QAGpChD,EAAKiD,eAAe,cACpBP,EAAGb,SAAW7B,EAAK6B,SACnBa,EAAG5E,aAAa,iBAAmC,IAAlBkC,EAAK6B,SAAoB,OAAS,eAGlEnB,eAEAnB,GAAG2D,eAQZvC,OAAOC,GACCR,MAAMC,QAAQO,IAEdA,EAAOC,MAAK,CAAClC,EAAGC,IAAMA,EAAID,IAC1BiC,EAAO1C,SAAQuD,GAAUhC,KAAKkB,OAAOc,YAEhClC,GAAGM,SAASiB,OAAOF,EAAQ,QAE3BrB,GAAGS,KAAK9B,SAAQyB,IACjBA,EAAIwD,YAAYxD,EAAIuC,MAAMtB,aAI7BF,UAUT0C,OAAO3B,EAAQ4B,EAAKC,EAAMC,SAChBhE,EAAKE,KAAKF,MAGVA,EAAGiE,cACLjE,EAAGiE,YAAc,CACbC,aAAclE,EAAGS,QAKnBT,EAAGiE,YAAY/B,GAAU,OAGrBiC,EAAU,IAAIH,EAAO,KAAM,GAEjChE,EAAGiE,YAAY/B,GACX,eACQrC,EAAI,QACD,IAAMsE,EAAQtE,IAAOsE,EAAQ3E,QAFxC,SAQF4E,EAAYpE,EAAGiE,YAAY/B,KAC3BmC,EAAexD,MAAMyD,KAAKtE,EAAGiE,YAAYC,cAAcL,QAAOxD,UAC1D2B,EAAO3B,EAAGsC,MAAMT,GAChBqC,EAAUvC,EAAKwC,aAAa,gBAAkBxC,EAAKG,aAAa,gBAAkBH,EAAKyC,gBAG/D,mBAAfL,EAA4BA,EAAUG,GAAWA,IAAYH,KAGhFpE,EAAGS,KAAO4D,OACLlD,UACLnB,EAAGiB,SACE8C,GACD/D,EAAG0E,KAAK,iBAAkBxC,EAAQ4B,GAU1CxC,KAAKY,EAAQ4B,EAAKC,SACR/D,EAAKE,KAAKF,MAGZA,EAAG2E,cAAgBzC,EAAS,GAAKA,EAASlC,EAAGM,SAASd,eAC/C,QAILoF,EAAc5E,EAAG6E,QAAQV,SACzBnE,EAAG6E,QAAQV,QAAQnE,EAAGM,SAAS4B,GAAQ4C,gBACxCF,GAAsC,IAAvBA,EAAYpF,wBACvBqE,OAAO3B,EAAQ4B,EAAKC,EAAMa,GAInC5E,EAAG+E,SAAU,EAERhB,GACD/D,EAAG0E,KAAK,oBAAqBxC,EAAQ4B,OAGrC7D,EAAOD,EAAGS,WACRuE,EAAQ,GACRC,EAAU,OACZ7F,EAAI,EACJ8F,EAAI,QACF/B,EAAKnD,EAAGM,SAAS4B,GAEjBiD,EAAU,MAGqB,SAAjChC,EAAGhB,aAAa,aAAyB,KACrCsB,GAAS,EACKN,EAAGqB,aAAa,iBAG9Bf,EAASN,EAAGhB,aAAa,gBAE7BgD,EAAQpE,KAAKqE,kDAAO,yBAAUC,MAAK,EAAEC,UAAAA,KAAeC,GAAQD,EAAUC,EAAM9B,MAGhF2B,QAAQI,IAAIL,GAASE,MAAKI,UAChBC,EAAgBD,EAAkB,OAkCpCE,EACAC,EAlCJ/E,MAAMyD,KAAKrE,GAAMtB,SAAQ0B,UACf2B,EAAO3B,EAAGsC,MAAMT,GAChBqC,EAAUvC,EAAKwC,aAAa,gBAAkBxC,EAAKG,aAAa,gBAAkBH,EAAKyC,cACzFoB,EAEAA,EADAH,EACMA,EAAcnB,GACI,iBAAVA,EACRA,EAAQuB,QAAQ,eAAgB,IAEhCvB,EAGNwB,WAAWF,IAAQA,EACnBZ,EAAQC,KAAO,CACXxF,MAAOsG,OAAOH,GACdzF,IAAKC,GAGT2E,EAAM5F,KAAO,CACTM,MAAwB,iBAAV6E,EAAqBA,EAAQ0B,cAAgB1B,EAC3DnE,IAAKC,MAMZyD,IAEGA,EADAX,EAAG+C,UAAUC,SAAS,OAChB,OAEA,OAKH,QAAPrC,GACA6B,EAAMxG,EAAU6F,GAAQ,GACxBY,EAAMzG,EAAU8F,GAAU,GAC1B9B,EAAG+C,UAAU9E,OAAO,OACpB+B,EAAG+C,UAAUtF,IAAI,UAEjB+E,EAAMxG,EAAU8F,EAAS,GACzBW,EAAMzG,EAAU6F,EAAO,GACvB7B,EAAG+C,UAAU9E,OAAO,QACpB+B,EAAG+C,UAAUtF,IAAI,QAIjBZ,EAAGoG,QAAUjD,GAAMnD,EAAGoG,SACtBpG,EAAGoG,OAAOF,UAAU9E,OAAO,QAC3BpB,EAAGoG,OAAOF,UAAU9E,OAAO,QAG/BpB,EAAGoG,OAASjD,EAGZlD,EAAO0F,EAAIU,OAAOT,GAElB5F,EAAGS,KAAO,SACJ6F,EAAU,GAEhBrG,EAAKtB,SAAQ,CAAC4H,EAAG1G,KACbG,EAAGS,KAAKM,KAAKwF,EAAEnG,KAEW,OAAtBmG,EAAEnG,IAAIqC,kBAA8CC,IAAtB6D,EAAEnG,IAAIqC,aACpC6D,EAAQvF,KAAKlB,MAIrBG,EAAGwG,WAAaF,OAEXnF,UAELnB,EAAGiB,SAEE8C,GACD/D,EAAG0E,KAAK,iBAAkBxC,EAAQ4B,MAS9C3C,cACQ/B,EACAC,EACAC,EACAC,QACES,EAAKE,KAAKF,GACViC,EAAO,GAEbjC,EAAG6C,WAAa,GAChB7C,EAAG4C,eAAiB,GAEpB5C,EAAGM,SAAS3B,SAAQ,CAACwE,EAAItD,KACrBsD,EAAGd,kBAAoBxC,EACvBsD,EAAGb,SAAgD,UAArCa,EAAGhB,aAAa,iBACzBnC,EAAGuC,cAAcC,SAAS3C,IAC3BG,EAAG4C,eAAe7B,KAAKoC,MAK/BnD,EAAGS,KAAK9B,SAAQ,CAACyB,EAAKP,KAClBT,EAAIgB,EAAIgC,WAAU,GAClB/C,EAAIe,EAAIgC,WAAU,GAElBhD,EAAEoC,UAAYnC,EAAEmC,UAAY3B,EAEJ,OAApBO,EAAIqC,kBAA4CC,IAApBtC,EAAIqC,cAChCrD,EAAEqD,YAAcpD,EAAEoD,YAAcrC,EAAIqC,aAIxC5B,MAAMyD,KAAKlE,EAAIuC,OAAOhE,SAAQqD,IAC1B1C,EAAI0C,EAAKI,WAAU,GACnB9C,EAAEmB,KAAOuB,EAAKvB,KACdrB,EAAEsB,YAAYpB,GAETU,EAAGuC,cAAcC,SAASlD,EAAEmH,aAC7BlH,EAAID,EAAE8C,WAAU,GAChB7C,EAAEkB,KAAOnB,EAAEmB,KACXpB,EAAEqB,YAAYnB,OAKtB0C,EAAKlB,KAAK3B,GACVY,EAAG6C,WAAW9B,KAAK1B,MAGvBW,EAAGS,KAAOwB,EAEVjC,EAAGiB,UC3eJ,MAAMyF,EAAc,SAAUjG,OAC7BkG,GAAQ,EACRC,GAAQ,MAEZnG,EAAOA,GAAQP,KAAK2E,QAAQpE,MAEnBH,SAAU,CACfqG,EAAQ3I,EAAc,eAChBqC,EAAKrC,EAAc,MACzByC,EAAKH,SAAS3B,SAAQkI,UACZrG,EAAKxC,EAAc,KAAM,CAC3BkB,KAAM2H,IAEVxG,EAAGK,YAAYF,MAGnBmG,EAAMjG,YAAYL,GAGlBI,EAAKA,MAAQA,EAAKA,KAAKjB,SACvBoH,EAAQ5I,EAAc,SACtByC,EAAKA,KAAK9B,SAAQsB,OACVQ,EAAKH,UACDG,EAAKH,SAASd,SAAWS,EAAKT,aACxB,IAAIsH,MACN,iEAINzG,EAAKrC,EAAc,MACzBiC,EAAKtB,SAAQe,UACHc,EAAKxC,EAAc,KAAM,CAC3BkB,KAAMQ,IAEVW,EAAGK,YAAYF,MAEnBoG,EAAMlG,YAAYL,OAItBsG,IACyB,OAArBzG,KAAK6G,MAAMC,YACND,MAAMnD,YAAY1D,KAAK6G,MAAMC,YAEjCD,MAAMrG,YAAYiG,IAGvBC,IACI1G,KAAK6G,MAAME,QAAQzH,aACduH,MAAMnD,YAAY1D,KAAK6G,MAAME,QAAQ,SAEzCF,MAAMrG,YAAYkG,KCpDlBM,EAAgB,CACzB5E,UAAU,EACV6E,YAAY,EAGZC,QAAQ,EACRC,QAAS,GACTC,cAAe,CAAC,EAAG,GAAI,GAAI,GAAI,IAC/BC,UAAU,EACVC,WAAW,EACXC,SAAU,WACVC,SAAU,WACVC,UAAW,UACXC,SAAU,UACVC,aAAc,WACdC,QAAS,IACTC,SAAU,IACVC,eAAe,EACfC,WAAY,EAEZC,QAAS,GAETC,cAAc,EACdC,aAAa,EAEbC,QAAQ,EACR9E,cAAc,EACd+E,QAAQ,EAGRC,OAAQ,CACJC,YAAa,YACbnB,QAAS,4BACToB,OAAQ,mBACRC,KAAM,8CAIVC,OAAQ,CACJhD,IAAK,mBACLiD,OAAQ,kBC9BT,MAAMC,EACT9I,YAAYgH,EAAOlC,EAAU,YACpBiE,aAAc,OAGdjE,QAAU,IACRqC,KACArC,EACH8D,OAAQ,IACDzB,EAAcyB,UACd9D,EAAQ8D,QAEfJ,OAAQ,IACDrB,EAAcqB,UACd1D,EAAQ0D,SAIE,iBAAVxB,IACPA,EAAQ3I,SAAS2K,cAAchC,SAG9BiC,cAAgBjC,EAAMzI,eACtB2K,gBAAkB/I,KAAK2E,QAAQvC,SAG/BpC,KAAK2E,QAAQwD,cACTxD,QAAQvC,UAAW,GAGR,OAAhByE,EAAMC,SACD9G,KAAK2E,QAAQpE,MACbP,KAAK2E,QAAQpE,OAASP,KAAK2E,QAAQpE,KAAKH,iBAEpCuE,QAAQvC,UAAW,GAI5ByE,EAAME,QAAQzH,SAAWuH,EAAME,QAAQ,GAAGhH,KAAKT,QAC3CU,KAAK2E,QAAQpE,OACRP,KAAK2E,QAAQpE,KAAKA,WACb,IAAIqG,MACN,+EAMXC,MAAQA,OAERmC,UAAY,CACbC,SAAUC,GAASlJ,KAAKiJ,SAASC,SAGhCrF,qBASKsF,EAAM1L,GACG,mBAARA,EACPkL,EAAUhL,UAAUwL,GAAQ1L,EAE5BkL,EAAUQ,GAAQ1L,EAS1BoG,KAAKc,MACG3E,KAAK4I,aAAe5I,KAAK6G,MAAMb,UAAUC,SAAS,0BAC3C,EAGXvI,OAAO0L,OAAOpJ,KAAK2E,QAASA,GAAW,SAElC0E,YAAc,OACdC,aAAc,OAEdjH,cAAgB,QAChBkH,gBAAkB,QAClBC,gBAAkB,QAElB/I,SAELgJ,YAAW,UACFjF,KAAK,uBACLoE,aAAc,EAEf5I,KAAK2E,QAAQ+E,SACbhM,OAAOiM,QAAQ3J,KAAK2E,QAAQ+E,SAASjL,SAAQ,EAAEmL,EAAQjF,MAC/C3E,KAAK4J,IAAmC,mBAAjB5J,KAAK4J,UACvBA,GAAU5J,KAAK4J,GAAQjF,EAAS,CAAC7G,cAAAA,IAGlC6G,EAAQkF,SAAW7J,KAAK4J,GAAQ/F,MAAqC,mBAAtB7D,KAAK4J,GAAQ/F,WACvD+F,GAAQ/F,aAK9B,IAQPpD,OAAO6C,MACCA,EAAM,QACEA,OACH,YACIwG,uBAEJ,aACIC,wBAEJ,cACItG,sBAIF,QAGLkB,EAAU3E,KAAK2E,YACjBqF,EAAW,MAGXrF,EAAQpE,MACRiG,EAAY3I,KAAKmC,WAIhBiK,KAAOjK,KAAK6G,MAAME,QAAQ,QAC1BmD,KAAOlK,KAAK6G,MAAMC,WAClBqD,KAAOnK,KAAK6G,MAAMuD,MAElBpK,KAAKiK,YACDA,KAAOnM,EAAc,cAErB+I,MAAMrG,YAAYR,KAAKiK,YAG3BnJ,QAAUd,KAAKiK,KAAKlK,KAAKT,OAAS,GAGlCU,KAAKkK,KAAM,OACNxK,EAAI5B,EAAc,SAClBuM,EAAIvM,EAAc,MAEpBkC,KAAKc,UACLH,MAAMyD,KAAKpE,KAAKiK,KAAKlK,KAAK,GAAG0C,OAAOhE,SAAQ,KACxC4L,EAAE7J,YAAY1C,EAAc,UAGhC4B,EAAEc,YAAY6J,SAGbH,KAAOxK,OAEPmH,MAAMyD,aAAatK,KAAKkK,KAAMlK,KAAKiK,WAEnC5G,aAAesB,EAAQtB,qBAG3BjD,SAAW,QACXqE,YAAczE,KAAKkK,KAAKnK,KAAKT,OAAS,EAEvCU,KAAKyE,mBACA0D,OAASnI,KAAKkK,KAAKnK,KAAK,QACxBK,SAAW,GAAGmK,MAAM1M,KAAKmC,KAAKmI,OAAO1F,QAIzCkC,EAAQwD,QACLnI,KAAKkK,WACArD,MAAMnD,YAAY1D,KAAK6G,MAAMC,OAKtCnC,EAAQyD,OACJpI,KAAKkK,OAASlK,KAAKmK,YACdA,KAAOrM,EAAc,QAAS,CAC/BkB,KAAMgB,KAAKkK,KAAK9L,iBAEfyI,MAAMrG,YAAYR,KAAKmK,OAG5BnK,KAAKmK,WACAtD,MAAMnD,YAAY1D,KAAK6G,MAAMuD,YAKrCI,QAAU1M,EAAc,MAAO,CAChCiB,MAAO,wCAIXiL,GAAY,8BACZA,GAAYrF,EAAQ8D,OAAOhD,IAC3BuE,GAAY,SACRrF,EAAQqD,QAAQ1I,OAChB0K,GAAa,mDAAkDrF,EAAQqD,qCAEvEgC,GAAY,0CAEhBA,GAAY,iCACZA,GAAYrF,EAAQ8D,OAAOC,OAC3BsB,GAAY,SAGZA,EAAWA,EAASpE,QAAQ,SAAUjB,EAAQuC,OAAS,qCAAuC,IAG1FvC,EAAQuC,QAAUvC,EAAQyC,cAAe,KACrCqD,EAAO,0CACXA,GAAQ9F,EAAQ0D,OAAOlB,QACvBsD,GAAQ,uBAGFtJ,EAASrD,EAAc,SAAU,CACnCiB,MAAO,uBAIX4F,EAAQyC,cAAc3I,SAAQhB,UACpBiN,EAAWjN,IAAQkH,EAAQwC,QAC3BwD,EAAS,IAAIC,OAAOnN,EAAKA,EAAKiN,EAAUA,GAC9CvJ,EAAOT,IAAIiK,MAIfF,EAAOA,EAAK7E,QAAQ,WAAYzE,EAAO0J,WAGvCb,EAAWA,EAASpE,QAAQ,WAAY6E,QAExCT,EAAWA,EAASpE,QAAQ,WAAY,OAIxCjB,EAAQsC,WAAY,OACd6D,EACD,6EAA4EnG,EAAQ0D,OAAOC,kCAGhG0B,EAAWA,EAASpE,QAAQ,WAAYkF,QAExCd,EAAWA,EAASpE,QAAQ,WAAY,IAGxC5F,KAAKyE,kBAEAhE,OAAO,eAIXoG,MAAMb,UAAUtF,IAAI,yBAGnBqK,EAAmBjN,EAAc,MAAO,CAC1CiB,MAAO,yBAELiM,EAAYlN,EAAc,KAAM,CAClCiB,MAAO,8BAEXgM,EAAiBvK,YAAYwK,GAG7BhB,EAAWA,EAASpE,QAAQ,aAAcmF,EAAiBF,gBACtDL,QAAQpM,UAAY4L,OAEpBiB,UAAYjL,KAAKwK,QAAQ3B,cAAc,6BAEvCqC,OAASlL,KAAKwK,QAAQW,iBAAiB,mCAEvCC,MAAQpL,KAAKwK,QAAQ3B,cAAc,wBAGnChC,MAAMwE,WAAWC,aAAatL,KAAKwK,QAASxK,KAAK6G,YACjDoE,UAAUzK,YAAYR,KAAK6G,YAG3B0E,KAAOvL,KAAK6G,MAAM2E,6BAGlBjL,KAAOI,MAAMyD,KAAKpE,KAAKiK,KAAKlK,WAC5B4C,WAAa3C,KAAKO,KAAKgK,aACvB7H,eAAiB1C,KAAKI,SAASmK,aAG/BxJ,cAGA0K,kBAIAC,iBAGAC,aAGAhH,EAAQwD,aACJqC,QAAQxE,UAAUtF,IAAI,aAG1BiE,EAAQyD,aACJoC,QAAQxE,UAAUtF,IAAI,aAG3BiE,EAAQvC,eACHoI,QAAQxE,UAAUtF,IAAI,YAG3BiE,EAAQsC,iBACHuD,QAAQxE,UAAUtF,IAAI,cAG3BiE,EAAQuD,kBACHsC,QAAQxE,UAAUtF,IAAI,gBAG3BiE,EAAQsD,mBACHuC,QAAQxE,UAAUtF,IAAI,sBAG1BkL,aAOT9B,gBACQ9J,KAAKyE,cACLnG,EAAM0B,KAAKmI,aAENzF,eAAejE,SAAQwE,GAAMjD,KAAKmI,OAAO3H,YAAYyC,MAI1DjD,KAAKc,SAAWd,KAAK6L,WAAY,CAC7B7L,KAAKqJ,YAAcrJ,KAAK6L,kBACnBxC,YAAc,SAIjBvG,EAAQ9C,KAAKqJ,YAAc,EAE3ByC,EAAO5N,SAAS6N,8BACjBC,MAAMlJ,GAAOrE,SAAQyB,GAAO4L,EAAKtL,YAAYR,KAAKD,OAAOU,OAAOP,WAEhE+L,MAAMH,QAENxC,YAAmC,IAArBtJ,KAAKqJ,iBACnB6C,WAAalM,KAAKqJ,cAAgBrJ,KAAKmM,mBAEvCC,WAAWpM,KAAK2E,QAAQ0D,OAAOE,YAQpC8D,EAJAC,EAAU,EAEV/M,EAAI,EACJ8K,EAAI,KAGJrK,KAAK6L,aACLS,EAAUtM,KAAKqJ,YAAc,EAC7B9J,EAAI+M,EAAUtM,KAAK2E,QAAQwC,QAC3BkD,EAAI9K,EAAIS,KAAKgM,MAAMM,GAAShN,OAC5BC,GAAQ,EACR8M,EAAQrM,KAAKuM,UAAYvM,KAAKsG,WAAWhH,OAASU,KAAKO,KAAKjB,QAG5DU,KAAKoL,OAASpL,KAAK2E,QAAQ0D,OAAOG,KAAKlJ,OAAQ,OAEzCkN,EAASxM,KAAK2E,QAAQ0D,OAAOG,KAC9B5C,QAAQ,UAAWrG,GACnBqG,QAAQ,QAASyE,GACjBzE,QAAQ,SAAU5F,KAAKqJ,aACvBzD,QAAQ,UAAW5F,KAAK6L,YACxBjG,QAAQ,SAAUyG,QAElBjB,MAAMhN,UAAYiO,EAAQG,EAAS,GAGpB,GAApBxM,KAAKqJ,kBACAqC,YAQb3B,iBACIzL,EAAM0B,KAAKkL,QAEPlL,KAAK6L,WAAa,EAAG,OACfzM,EAAI,QACJ0M,EAAO5N,SAAS6N,yBAChBU,EAAOzM,KAAKsJ,YAAc,EAAItJ,KAAKqJ,YAAc,EACjDqD,EAAO1M,KAAKkM,WAAalM,KAAK6L,WAAa7L,KAAKqJ,YAAc,EAGhErJ,KAAK2E,QAAQ2C,WACbwE,EAAKtL,YAAY7B,EAAOS,EAAG,EAAGY,KAAK2E,QAAQ8C,YAI3CzH,KAAK2E,QAAQ0C,UACbyE,EAAKtL,YAAY7B,EAAOS,EAAGqN,EAAMzM,KAAK2E,QAAQ4C,eAG9CoF,EAAQ3M,KAAK4M,MAGb5M,KAAK2E,QAAQmD,gBACb6E,EL5VQ,EAACzN,EAAGC,EAAGC,EAAGC,EAAGwN,SAE7BC,QACEpO,EAAI,GAFVW,EAAIA,GAAK,OAGLE,EAAIJ,EAAIE,EACRI,EAAIN,EAAIE,QACNK,EAAI,GACJC,EAAI,GACNR,EAAI,EAAIE,EAAIX,EACZe,EAAI,EAAIf,EACDS,EAAIC,GAAK,EAAIC,EAAIX,KACxBa,EAAIH,GAAK,EAAIV,QAEZ,IAAIqO,EAAI,EAAGA,GAAK3N,EAAG2N,OAChB,GAAKA,GAAKA,GAAK3N,GAAM2N,GAAKxN,GAAKwN,GAAKtN,EAAI,OAClCuN,EAAI9N,EAAE6N,EAAI,GAChBC,EAAEhH,UAAU9E,OAAO,UACnBxB,EAAEmB,KAAKmM,UAGftN,EAAEjB,SAAQW,UACAC,EAAID,EAAE6N,SAAS,GAAGhL,aAAa,gBACjC6K,EAAG,OACGpO,EAAIoO,EAAEG,SAAS,GAAGhL,aAAa,gBACjC5C,EAAIX,GAAK,EAAGiB,EAAEkB,KAAK3B,EAAER,SACpB,GAAIW,EAAIX,GAAK,EAAG,OACXa,EAAIzB,EAAc,KAAM,CAC1BiB,MAAO,WACPC,KAAO,eAAc6N,UAEzBlN,EAAEkB,KAAKtB,IAGfI,EAAEkB,KAAKzB,GACP0N,EAAI1N,KAGDO,GKuTauN,CACJlN,KAAK4M,MACL5M,KAAKqJ,YACLrJ,KAAKgM,MAAM1M,OACXU,KAAK2E,QAAQoD,WACb/H,KAAK2E,QAAQgD,oBAKhBiF,MAAM5M,KAAKqJ,YAAc,GAAGrD,UAAUtF,IAAI,UAG/CiM,EAAMlO,SAAQ0O,IACVA,EAAEnH,UAAU9E,OAAO,UACnB4K,EAAKtL,YAAY2M,WAGhBP,MAAM5M,KAAKqJ,YAAc,GAAGrD,UAAUtF,IAAI,UAG3CV,KAAK2E,QAAQ0C,UACbyE,EAAKtL,YAAY7B,EAAOS,EAAGsN,EAAM1M,KAAK2E,QAAQ6C,WAI9CxH,KAAK2E,QAAQ2C,WACbwE,EAAKtL,YAAY7B,EAAOS,EAAGY,KAAK6L,WAAY7L,KAAK2E,QAAQ+C,gBAIxDwD,OAAOzM,SAAQkO,IAChBA,EAAMnM,YAAYsL,EAAK5J,WAAU,QAS7CuB,oBACS4E,OAAS,GAEVrI,KAAKI,UAAYJ,KAAKI,SAASd,aAC1Bc,SAAS3B,SAAQ,CAACwE,EAAItD,aAElB0I,OAAO1I,GAAKsD,EAAG2B,YAEhB3B,EAAGmK,mBAAqBnK,EAAGmK,kBAAkBpH,UAAUC,SAAS,sBAChEhD,EAAG7E,UAAY6E,EAAGmK,kBAAkBhP,WAGxC6E,EAAGb,SAAgD,UAArCa,EAAGhB,aAAa,iBAE9BgB,EAAGd,kBAAoBxC,EACnBK,KAAK2E,QAAQvC,UAAYa,EAAGb,SAAU,OAChCiL,EAAOvP,EAAc,IAAK,CAC5BwP,KAAM,IACNvO,MAAO,mBACPC,KAAMiE,EAAG7E,YAGb6E,EAAG7E,UAAY,GACf6E,EAAG5E,aAAa,gBAAiB,IACjC4E,EAAGzC,YAAY6M,YAKtB1B,aAOTC,mBACUjH,EAAU3E,KAAK2E,WAEjBA,EAAQyC,cAAe,OACjBmG,EAAWvN,KAAKwK,QAAQ3B,cAAc,uBACxC0E,GAEAA,EAASC,iBAAiB,UAAU,KAChC7I,EAAQwC,QAAUsG,SAASF,EAAS/N,MAAO,SACtCuB,cAEA2K,iBAEAlH,KAAK,oBAAqBG,EAAQwC,YACxC,GAKPxC,EAAQsC,kBACHyG,MAAQ1N,KAAKwK,QAAQ3B,cAAc,oBACpC7I,KAAK0N,YACAA,MAAMF,iBAAiB,SAAS,IAAMxN,KAAK2N,OAAO3N,KAAK0N,MAAMlO,SAAQ,SAK7EgL,QAAQgD,iBAAiB,SAAS9O,UAC7B2L,EAAI3L,EAAEkP,OAAOC,QAAQ,KACvBxD,GAAmC,MAA7BA,EAAEtM,SAASgI,gBACbsE,EAAE/F,aAAa,mBACVzF,KAAKwL,EAAEpI,aAAa,cACzBvD,EAAEoP,kBAEFnJ,EAAQvC,UACRiI,EAAErE,UAAUC,SAAS,qBACyB,SAA9CoE,EAAEgB,WAAWpJ,aAAa,wBAErBjB,UAAUI,KAAKpB,KAAKI,SAAS2C,QAAQsH,EAAEgB,aAC5C3M,EAAEoP,sBAGX,GAEHC,OAAOP,iBAAiB,SAAUxN,KAAKgJ,UAAUC,UAMrDA,gBACSsC,KAAOvL,KAAKiL,UAAUO,wBACtBxL,KAAKuL,KAAKyC,YAIVrC,aAOTF,WAAWwC,GAEFA,QACI1N,KAAK9B,SAAQyB,IACdS,MAAMyD,KAAKlE,EAAIuC,OAAOhE,SAAQqD,IAC1BA,EAAKvB,KAAOuB,EAAK1D,gBAMzB4B,KAAK2E,QAAQ3D,SAAWhB,KAAKI,SAASd,aAEjCqF,QAAQ3D,QAAQvC,SAAQ8B,IAGpBI,MAAMC,QAAQL,EAAKY,UACpBZ,EAAKY,OAAS,CAACZ,EAAKY,SAGpBZ,EAAKiD,eAAe,WAAoC,mBAAhBjD,EAAKE,cACxC+I,gBAAkBxJ,KAAKwJ,gBAAgBrD,OAAO5F,EAAKY,aAEnDoI,gBAAgB1I,KAAK,CACtBG,QAAST,EAAKY,OACd+M,SAAU3N,EAAKE,UAKvBF,EAAKY,OAAO1C,SAAQuD,UACViB,EAAKjD,KAAKI,SAAS4B,GACrBzB,EAAK+C,MACLL,EAAG5E,aAAa,YAAakC,EAAK+C,MAElC/C,EAAKgD,QACLN,EAAG5E,aAAa,cAAekC,EAAKgD,QAEpChD,EAAKiD,eAAe,aACpBP,EAAG5E,aAAa,gBAAiBkC,EAAK6B,UAGtC7B,EAAKiD,eAAe,YACA,IAAhBjD,EAAK4N,aACAnN,UAAU4B,KAAK,CAACZ,IAIzBzB,EAAKiD,eAAe,SAAkC,IAAvBjD,EAAKY,OAAO7B,aACtC0B,UAAUI,KAAKb,EAAKY,OAAO,GAAIZ,EAAKa,MAAM,SAM3DpB,KAAKc,eACAP,KAAK9B,SAAQ,CAACyB,EAAKP,KACpBO,EAAIoB,UAAY3B,EAChBgB,MAAMyD,KAAKlE,EAAIuC,OAAOhE,SAAQqD,IAC1BA,EAAKvB,KAAOuB,EAAK1D,gBAIrB4B,KAAKwJ,gBAAgBlK,aAChBiB,KAAK9B,SAAQyB,IACdS,MAAMyD,KAAKlE,EAAIuC,OAAOhE,SAAQ,CAACqD,EAAMnC,KAC7BK,KAAKwJ,gBAAgBlH,SAAS3C,SACzB4J,gBAAgB9K,SAAQkG,IACrBA,EAAQ3D,QAAQsB,SAAS3C,KACzBmC,EAAK1D,UAAYuG,EAAQuJ,SAASrQ,KAAKmC,KAAM8B,EAAKvB,KAAMuB,EAAM5B,kBAQjFc,UAAUC,gBAGdR,OAAO,UAOhB2N,eACSvH,MAAMzI,UAAY4B,KAAK8I,mBAGvBjC,MAAMb,UAAU9E,OAAO,wBAGvBsJ,QAAQa,WAAWC,aAAatL,KAAK6G,MAAO7G,KAAKwK,cAEjD5B,aAAc,EAEnBmF,OAAOM,oBAAoB,SAAUrO,KAAKgJ,UAAUC,UAOxDlI,cACSyJ,QAAQxE,UAAU9E,OAAO,wBAEzBoN,SAAStO,WACTS,OAAO,aAEPmM,MAAQ,OAETjN,EAAIK,KAAKgM,MAAM1M,YACZK,KAAK,OACFgG,EAAMhG,EAAI,OACXiN,MAAMjN,GAAKhB,EAAa,IAANgB,EAAU,SAAW,GAAIgG,EAAKA,QAGpDd,SAAU,OAEVpE,OAAO,cAEPV,OAAOgB,cAEPyD,KAAK,oBAOd8J,iBACUnH,EAAUnH,KAAK2E,QAAQwC,YACzBpH,EAAOC,KAAK2C,kBAEZ3C,KAAKuM,YACLxM,EAAO,QAEFuG,WAAW7H,SAAQqE,GAAS/C,EAAKc,KAAKb,KAAK2C,WAAWG,OAG3D9C,KAAK2E,QAAQuC,YAER8E,MAAQjM,EACRM,KAAI,CAACF,EAAIR,IAAMA,EAAIwH,GAAY,EAAIpH,EAAKwK,MAAM5K,EAAGA,EAAIwH,GAAW,OAChExD,QAAO9E,GAAQA,SAEfmN,MAAQ,CAACjM,QAGb8L,WAAa7L,KAAKmM,SAAWnM,KAAKgM,MAAM1M,OAEtCU,KAAK6L,WAOhBF,iBAES3L,KAAK2E,QAAQqD,QAAQ1I,QAAUU,KAAK2E,QAAQsD,eAAiBjI,KAAK0C,gBAAkB1C,KAAK0C,eAAepD,OAAQ,KAC7GmD,EACA8L,GAAK,UACJC,aAAe,GAIhBxO,KAAK6G,MAAMC,UAEP9G,KAAK2E,QAAQqD,QAAQ1I,SACrBiP,EAAKzQ,EAAc,SACnByQ,EAAG/N,YAAY1C,EAAc,OAC7ByQ,EAAGE,MAAMC,OAAS,MACd1O,KAAK2O,mBAEA9H,MAAMC,MAAQ9G,KAAK2O,YAAY7H,aAKvCpE,eAAejE,SAAQqD,IACxBA,EAAK2M,MAAMT,MAAQ,WAGlBtL,eAAejE,SAAQ,CAACqD,EAAMnC,WACzBiP,EAAK9M,EAAK+M,YACVC,EAAIF,EAAK5O,KAAKuL,KAAKyC,MAAQ,OACjClM,EAAK2M,MAAMT,MAAS,GAAEc,UACjBN,aAAa7O,GAAKiP,EACnB5O,KAAK2E,QAAQqD,QAAQ1I,OAAQ,OACvB2D,EAAKnF,EAAc,MACzByQ,EAAGnB,kBAAkB5M,YAAYyC,GACjCA,EAAGwL,MAAMT,MAAS,GAAEc,KACpB7L,EAAGwL,MAAMM,WAAa,IACtB9L,EAAGwL,MAAMO,cAAgB,IACzB/L,EAAGwL,MAAMQ,OAAS,QAItBjP,KAAK2E,QAAQqD,QAAQ1I,OAAQ,OACvB2L,EAAYjL,KAAK6G,MAAMqI,kBACxBlP,KAAK2O,YAAa,MACdA,YAAc7Q,EAAc,QAAS,CACtCiB,MAAO,0BAELoQ,EAAkBrR,EAAc,MAAO,CACzCiB,MAAO,8BAEXoQ,EAAgB3O,YAAYR,KAAK2O,aACjC1D,EAAUiE,cAAc5E,aAAa6E,EAAiBlE,SAEpDmE,EAAMpP,KAAK6G,MAAMC,WAClBD,MAAMyE,aAAaiD,EAAIa,QACvBT,YAAY7H,MAAQsI,OAGpBT,YAAYO,cAAcT,MAAMY,aAAgB,GACjDrP,KAAK2O,YAAYW,YACjBtP,KAAK6G,MAAMyI,YACX7B,SACIzN,KAAK2O,YAAYO,cAAcT,MAAMY,cACrC,IACA,QAIJpE,EAAUsE,aAAetE,EAAUuE,eAEnCvE,EAAUwD,MAAMgB,UAAY,eAIjC,CACHhN,EAAQ,GAGR8L,EAAKzQ,EAAc,eACb4R,EAAI5R,EAAc,MACxB6C,MAAMyD,KAAKpE,KAAK6G,MAAME,QAAQ,GAAGhH,KAAK,GAAG0C,OAAOhE,SAAQ,WAC9CwE,EAAKnF,EAAc,MACzB4R,EAAElP,YAAYyC,GACdR,EAAM5B,KAAKoC,MAGfsL,EAAG/N,YAAYkP,QACV7I,MAAMyD,aAAaiE,EAAIvO,KAAKiK,YAE3B0F,EAAS,GACflN,EAAMhE,SAAQ,CAACqD,EAAMnC,WACXiP,EAAK9M,EAAK+M,YACVC,EAAIF,EAAK5O,KAAKuL,KAAKyC,MAAQ,IACjC2B,EAAO9O,KAAKiO,QACPN,aAAa7O,GAAKiP,UAGtBrO,KAAK9B,SAAQyB,IACdS,MAAMyD,KAAKlE,EAAIuC,OAAOhE,SAAQ,CAACqD,EAAMnC,KAC7BK,KAAKgB,QAAQc,EAAKyE,WAAWvD,YAC7BlB,EAAK2M,MAAMT,MAAS,GAAE2B,EAAOhQ,kBAKpCkH,MAAMnD,YAAY6K,KASnC7C,YACQ1L,KAAK2E,QAAQuD,mBACR+C,UAAUwD,MAAMC,OAAS,UACzBnD,KAAOvL,KAAKiL,UAAUO,6BACtBP,UAAUwD,MAAMC,OAAU,GAAE1O,KAAKuL,KAAKmD,YASnDf,OAAOiC,WACE5P,KAAKc,UAEV8O,EAAQA,EAAM7J,mBAETsD,YAAc,OACdkD,WAAY,OACZjG,WAAa,GAEbsJ,EAAMtQ,aAQN2M,aAEA1L,KAAK9B,SAAQ,CAACyB,EAAK2P,WACdC,EAAU9P,KAAKsG,WAAWhE,SAASpC,GAGlB0P,EAAMG,MAAM,KAAKC,QAAO,CAACC,EAAMC,SAC9C5N,GAAW,EACXR,EAAO,KACPuC,EAAU,SAET,IAAI3C,EAAI,EAAGA,EAAIxB,EAAIuC,MAAMnD,OAAQoC,OAClCI,EAAO5B,EAAIuC,MAAMf,GACjB2C,EAAUvC,EAAKwC,aAAa,gBAAkBxC,EAAKG,aAAa,gBAAkBH,EAAK8C,YAGnFP,EAAQ0B,cAAczD,SAAS4N,IAC/BlQ,KAAKgB,QAAQc,EAAKyE,WAAWvD,UAC/B,CACEV,GAAW,eAKZ2N,GAAQ3N,KAChB,KAEoBwN,GACnB5P,EAAIqC,YAAcsN,OACbvJ,WAAWzF,KAAKgP,IAErB3P,EAAIqC,YAAc,aAIrBiI,QAAQxE,UAAUtF,IAAI,kBAEtBV,KAAKsG,WAAWhH,YAKZyB,eAJAyJ,QAAQxE,UAAU9E,OAAO,uBAEzBkL,WAAWpM,KAAK2E,QAAQ0D,OAAOE,mBAKnC/D,KAAK,mBAAoBoL,EAAO5P,KAAKsG,mBApDjCiG,WAAY,OACZxL,cACAyD,KAAK,mBAAoBoL,EAAO5P,KAAKsG,iBACrCkE,QAAQxE,UAAU9E,OAAO,mBACvB,IAwDfrC,KAAKA,UAEGA,GAAQmB,KAAKqJ,cAIZnG,MAAMrE,UACFwK,YAAcoE,SAAS5O,EAAM,OAGlCA,EAAOmB,KAAKgM,MAAM1M,QAAUT,EAAO,UAIlC4B,OAAO,aACPA,OAAO,mBAEP+D,KAAK,iBAAkB3F,KAShCsR,WAAWnO,EAAQoO,QAEVpP,UAAUI,KAAKY,EAAQoO,GAOhCjN,OAAO5C,OACCR,EAAO,MACPvC,EAAS+C,GAAO,IACZA,EAAKH,WACAJ,KAAKyE,cAAgBzE,KAAKc,QAAS,OAC9BX,EAAKrC,EAAc,MACzByC,EAAKH,SAAS3B,SAAQ2E,UACZH,EAAKnF,EAAc,KAAM,CAC3BkB,KAAMoE,IAGVjD,EAAGK,YAAYyC,WAEdiH,KAAK1J,YAAYL,QAEjBgI,OAAShI,OACTC,SAAW,GAAGmK,MAAM1M,KAAKsC,EAAGsC,YAC5BgC,aAAc,OAIdE,QAAQvC,SAAWpC,KAAK+I,qBAGxBtI,OAAO,eAGPiC,eAAiB1C,KAAKI,SAASmK,QAIxChK,EAAKA,MAAQI,MAAMC,QAAQL,EAAKA,QAChCR,EAAOQ,EAAKA,WAETI,MAAMC,QAAQL,IACrBA,EAAK9B,SAAQyB,UACHwP,EAAI,GACVhS,OAAOiM,QAAQzJ,GAAKzB,SAAQ,EAAE2E,EAAStB,YAE7BgB,EAAQ9C,KAAKqI,OAAOtF,QAAQK,GAE9BN,GAAS,IACT4M,EAAE5M,GAAShB,MAGnB/B,EAAKc,KAAK6O,MAId3P,EAAKT,cACAS,OAAOW,IAAIX,QAEXe,SAAU,QAGdC,cACA0K,kBACAE,aAOT0E,UACQrQ,KAAK2E,QAAQsC,kBACRyG,MAAMlO,MAAQ,QACd+M,WAAY,QAEhBlD,YAAc,OACdC,aAAc,OACdvI,cAEAyD,KAAK,qBAQdyH,MAAMjN,GACEgB,KAAKiK,MACL3L,EAAM0B,KAAKiK,UAGXqG,EAAStQ,KAAKiK,QACbjK,KAAKiK,OACNqG,EAAStQ,KAAK6G,OAGd7H,EAAM,IACc,iBAATA,EAAmB,CACbd,SAAS6N,yBACjB3N,UAAYY,EAGrBsR,EAAO9P,YAAYxB,IAS3BuR,OAAOC,OACExQ,KAAKyE,cAAgBzE,KAAKc,QAAS,OAAO,QAEzC2P,EAAUzQ,KAAK0C,mBACjB3C,EAAO,SACL2Q,EAAM,OACR/Q,EACA+B,EACAiP,EACAtD,MAmBC7P,EAASgT,UACH,QAGL7L,EAAU,CApBZiM,UAAU,EACVC,WAAY,GAGZC,cAAe,KACfC,gBAAiB,IAGjBC,UAAW,UAGXC,SAAU,KACVC,MAAO,KAUJV,MAGH7L,EAAQrB,KAAM,IACO,QAAjBqB,EAAQrB,MAAmC,QAAjBqB,EAAQrB,OAElCvD,EAAK,GAAKC,KAAKmI,QAIfxD,EAAQwM,aAEHjO,MAAMyB,EAAQwM,YAEZ,GAAIxQ,MAAMC,QAAQ+D,EAAQwM,eAExBxR,EAAI,EAAGA,EAAIgF,EAAQwM,UAAU7R,OAAQK,IACtCI,EAAOA,EAAKoG,OAAOnG,KAAKgM,MAAMrH,EAAQwM,UAAUxR,GAAK,SAJzDI,EAAOA,EAAKoG,OAAOnG,KAAKgM,MAAMrH,EAAQwM,UAAY,SAQtDpR,EAAOA,EAAKoG,OAAOnG,KAAK2C,eAIxB5C,EAAKT,OAAQ,IACQ,QAAjBqF,EAAQrB,MAAmC,QAAjBqB,EAAQrB,KAAgB,KAClDqN,EAAM,GAEDhR,EAAI,EAAGA,EAAII,EAAKT,OAAQK,IAAK,KACzB+B,EAAI,EAAGA,EAAI3B,EAAKJ,GAAG8C,MAAMnD,OAAQoC,QAG7BiD,EAAQkM,WAAWvO,SAASmO,EAAQ/O,GAAGS,oBACxCnC,KAAKgB,QAAQyP,EAAQ/O,GAAGS,mBAAmBa,UAC7C,KACMlE,EAAOiB,EAAKJ,GAAG8C,MAAMf,GAAGkD,YAC5B9F,EAAOA,EAAKsS,OACZtS,EAAOA,EAAK8G,QAAQ,UAAW,KAC/B9G,EAAOA,EAAK8G,QAAQ,MAAO,MAC3B9G,EAAOA,EAAK8G,QAAQ,KAAM,MAE1B9G,EAAOA,EAAK8G,QAAQ,KAAM,OACtB9G,EAAKwD,SAAS,OACdxD,EAAQ,IAAGA,MAGf6R,GAAO7R,EAAO6F,EAAQoM,gBAI9BJ,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIrR,OAAS,GAG3CqR,GAAOhM,EAAQmM,cAInBH,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIrR,OAAS,GAEvCqF,EAAQiM,WACRD,EAAO,+BAA8BA,UAEtC,GAAqB,QAAjBhM,EAAQrB,KAAgB,KAE/BqN,EAAO,iBAAgBhM,EAAQqM,gBAG1BrR,EAAI,EAAGA,EAAI8Q,EAAQnR,OAAQK,KAGvBgF,EAAQkM,WAAWvO,SAASmO,EAAQ9Q,GAAGwC,oBACxCnC,KAAKgB,QAAQyP,EAAQ9Q,GAAGwC,mBAAmBa,YAE3C2N,GAAQ,KAAIF,EAAQ9Q,GAAGiF,sBAK/B+L,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIrR,OAAS,GAG3CqR,GAAO,YAGFhR,EAAI,EAAGA,EAAII,EAAKT,OAAQK,IAAK,KAC9BgR,GAAO,IAEFjP,EAAI,EAAGA,EAAI3B,EAAKJ,GAAG8C,MAAMnD,OAAQoC,KAG7BiD,EAAQkM,WAAWvO,SAASmO,EAAQ/O,GAAGS,oBACxCnC,KAAKgB,QAAQyP,EAAQ/O,GAAGS,mBAAmBa,YAE3C2N,GAAQ,IAAG5Q,EAAKJ,GAAG8C,MAAMf,GAAGkD,iBAKpC+L,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIrR,OAAS,GAG3CqR,GAAO,KAIXA,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIrR,OAAS,GAG3CqR,GAAO,IAEHhM,EAAQiM,WACRD,EAAO,sCAAqCA,UAE7C,GAAqB,SAAjBhM,EAAQrB,KAAiB,KAE3B5B,EAAI,EAAGA,EAAI3B,EAAKT,OAAQoC,QACzBgP,EAAIhP,GAAKgP,EAAIhP,IAAM,GAEd/B,EAAI,EAAGA,EAAI8Q,EAAQnR,OAAQK,KAGvBgF,EAAQkM,WAAWvO,SAASmO,EAAQ9Q,GAAGwC,oBACxCnC,KAAKgB,QAAQyP,EAAQ9Q,GAAGwC,mBAAmBa,YAE3C0N,EAAIhP,GAAG+O,EAAQ9Q,GAAGiF,aAAe7E,EAAK2B,GAAGe,MAAM9C,GAAGiF,aAM9D+L,EAAMW,KAAKC,UAAUb,EAAK/L,EAAQsM,SAAUtM,EAAQuM,OAEhDvM,EAAQiM,WACRD,EAAO,uCAAsCA,YAKjDhM,EAAQiM,WAERjM,EAAQ6M,SAAW7M,EAAQ6M,UAAY,mBACvC7M,EAAQ6M,UAAa,IAAG7M,EAAQrB,OAEhCqN,EAAMc,UAAUd,GAGhBtD,EAAOnP,SAASJ,cAAc,KAC9BuP,EAAKC,KAAOqD,EACZtD,EAAKuD,SAAWjM,EAAQ6M,SAGxBtT,SAAS+L,KAAKzJ,YAAY6M,GAG1BA,EAAKqE,QAGLxT,SAAS+L,KAAKvG,YAAY2J,IAGvBsD,UAIR,EAQXgB,OAAOnB,OACCoB,GAAM,MAQLpU,EAASgT,UACH,QAGL7L,EAAU,CATZmM,cAAe,KACfC,gBAAiB,OAUdP,MAGH7L,EAAQpE,KAAKjB,QAAU9B,EAASmH,EAAQpE,MAAO,IAE1B,QAAjBoE,EAAQrB,KAAgB,CACxBsO,EAAM,CACFrR,KAAM,UAIJR,EAAO4E,EAAQpE,KAAKwP,MAAMpL,EAAQmM,eAEpC/Q,EAAKT,SAEDqF,EAAQvE,WACRwR,EAAIxR,SAAWL,EAAK,GAAGgQ,MAAMpL,EAAQoM,iBAErChR,EAAK8R,SAGT9R,EAAKtB,SAAQ,CAACyB,EAAKP,KACfiS,EAAIrR,KAAKZ,GAAK,SAGRmS,EAAS5R,EAAI6P,MAAMpL,EAAQoM,iBAE7Be,EAAOxS,QACPwS,EAAOrT,SAAQe,IACXoS,EAAIrR,KAAKZ,GAAGkB,KAAKrB,eAK9B,GAAqB,SAAjBmF,EAAQrB,KAAiB,OAC1ByO,ELlzCApB,CAAAA,QACdtG,GAAI,MAEJA,EAAIiH,KAAKU,MAAMrB,GACjB,MAAOjS,UACE,UAEF,OAAS2L,IAAO1J,MAAMC,QAAQyJ,KAAO7M,EAAS6M,KAAQA,GK2yCtC4H,CAAOtN,EAAQpE,MAGxBwR,IACAH,EAAM,CACFxR,SAAU,GACVG,KAAM,IAGVwR,EAAKtT,SAAQ,CAAC8B,EAAMZ,KAChBiS,EAAIrR,KAAKZ,GAAK,GACdjC,OAAOiM,QAAQpJ,GAAM9B,SAAQ,EAAEuD,EAAQxC,MAC9BoS,EAAIxR,SAASkC,SAASN,IACvB4P,EAAIxR,SAASS,KAAKmB,GAGtB4P,EAAIrR,KAAKZ,GAAGkB,KAAKrB,UAQ7BhC,EAASmH,EAAQpE,QACjBqR,EAAMjN,EAAQpE,MAGdqR,QAEKzO,OAAOyO,UAIb,EAOXM,cACU9R,EAAWJ,KAAK0C,eAChB3C,EAAOC,KAAK2C,WACZkE,EAAQ/I,EAAc,SACtB2I,EAAQ3I,EAAc,SACtB4I,EAAQ5I,EAAc,SAEtBqC,EAAKrC,EAAc,MACzBsC,EAAS3B,SAAQwE,IACb9C,EAAGK,YACC1C,EAAc,KAAM,CAChBkB,KAAMiE,EAAG2B,kBAKrB6B,EAAMjG,YAAYL,GAElBJ,EAAKtB,SAAQyB,UACHC,EAAKrC,EAAc,MACzB6C,MAAMyD,KAAKlE,EAAIuC,OAAOhE,SAAQqD,IAC1B3B,EAAGK,YACC1C,EAAc,KAAM,CAChBkB,KAAM8C,EAAK8C,kBAIvB8B,EAAMlG,YAAYL,MAGtB0G,EAAMrG,YAAYiG,GAClBI,EAAMrG,YAAYkG,SAGZoI,EAAIf,OAAOoE,OAGjBrD,EAAE5Q,SAAS+L,KAAKzJ,YAAYqG,GAG5BiI,EAAEoD,QAON9F,WAAWgG,OACHC,EAAU,EAEVrS,KAAKc,QACLuR,EAAUrS,KAAKO,KAAK,GAAGkC,MAAMnD,OACtBU,KAAK0C,eAAepD,SAC3B+S,EAAUrS,KAAK0C,eAAepD,aAG7BkL,QAAQxE,UAAUtF,IAAI,mBAEvBV,KAAKoL,aACAA,MAAMhN,UAAY,SAEtByN,WAAa,OACbpL,OAAO,cAEPwL,MACDnO,EAAc,KAAM,CAChBkB,KAAO,yCAAwCqT,MAAYD,YASvEpR,QAAQA,UACG,IAAIO,EAAQvB,KAAMgB,GAO7BjB,KAAKA,UACM,IAAIH,EAAKI,KAAMD,GAS1BuS,GAAGpJ,EAAOqJ,QACDC,OAASxS,KAAKwS,QAAU,QACxBA,OAAOtJ,GAASlJ,KAAKwS,OAAOtJ,IAAU,QACtCsJ,OAAOtJ,GAAOrI,KAAK0R,GAS5BE,IAAIvJ,EAAOqJ,QACFC,OAASxS,KAAKwS,QAAU,GACzBtJ,KAASlJ,KAAKwS,SAAW,QACxBA,OAAOtJ,GAAO7H,OAAOrB,KAAKwS,OAAOtJ,GAAOnG,QAAQwP,GAAW,GAQpE/N,KAAK0E,WACIsJ,OAASxS,KAAKwS,QAAU,GACzBtJ,KAASlJ,KAAKwS,SAAW,MACxB,IAAI7S,EAAI,EAAGA,EAAIK,KAAKwS,OAAOtJ,GAAO5J,OAAQK,SACtC6S,OAAOtJ,GAAOvJ,GAAG+S,MAAM1S,KAAMW,MAAMhD,UAAU4M,MAAM1M,KAAK8U,UAAW"}