[
  {
    "path": ".browserslistrc",
    "content": "> 1%\nlast 2 versions\nnot ie <= 8\n"
  },
  {
    "path": ".circleci/config.yml",
    "content": "version: 2.1\njobs:\n  build:\n    docker:\n      - image: circleci/node\n    steps:\n      - checkout\n      - run: yarn install\n      - run: yarn test:unit\n      - store_test_results:\n          path: tests/results\n"
  },
  {
    "path": ".editorconfig",
    "content": "[*.{js,jsx,ts,tsx,vue}]\nindent_style = space\nindent_size = 2\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": ".eslintignore",
    "content": "/dist\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  root: true,\n  env: {\n    node: true\n  },\n  'extends': [\n    'plugin:vue/essential',\n    '@vue/standard'\n  ],\n  rules: {\n    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',\n    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'\n  },\n  parserOptions: {\n    parser: 'babel-eslint'\n  }\n}\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\nnode_modules\ndist\n\ntests/results\n\n# local env files\n.env.local\n.env.*.local\n\n# Log files\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Editor directories and files\n.idea\n.vscode\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw*\n\ndocs/.vuepress/dist\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Hector Romero\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": ":fire::fire::fire: Vue 3 support is comming :fire::fire::fire:\n\nVue 3 support is already in beta in the `next` branch, the next version also supports Vue 2, you can take a look in the [new documentation site](https://vue-smart-table.netlify.app/).\n\n# VueJs Smart Table\n\nVue Smart Table was created out of the need for a simple highly customizable data table plugin \nthat could take advantage of Vue's slots. It has no dependencies but Vue and because it \nrenders as a standard HTML table it is compatible with CSS Frameworks such as Bootstrap and Foundation.\n\nOut of the box you will get filtering, column sorting, client side pagination and row selection.\n\n## Full Documentation\nPlease read the [documentation](https://tochoromero.github.io/vuejs-smart-table/) to learn how to use it.\n\n## Installation\nTo install simply run\n```\nnpm add vuejs-smart-table\n```\nor\n```\nyarn add vuejs-smart-table\n```\n\nThen in your `main.js`\n```js\nimport SmartTable from 'vuejs-smart-table'\n\nVue.use(SmartTable)\n```\nThis will globally register four Components: `v-table`, `v-th`, `v-tr` and `smart-pagination`\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: [\n    '@vue/app'\n  ]\n}\n"
  },
  {
    "path": "deploy.sh",
    "content": "#!/usr/bin/env sh\n\nset -e\n\nnpm run docs:build\ncd docs/.vuepress/dist\n\ngit init\ngit add -A\ngit commit -m 'deploy'\n\ngit push -f git@github.com:tochoromero/vuejs-smart-table.git master:gh-pages\n\ncd -\n"
  },
  {
    "path": "docs/.vuepress/components/BasicFiltering.vue",
    "content": "<template>\n  <div class=\"card mt-3\">\n    <div class=\"card-body\">\n      <label>Filter by Name:</label>\n      <input class=\"form-control\" v-model=\"filters.name.value\"/>\n\n      <v-table\n        :data=\"users\"\n        :filters=\"filters\"\n      >\n        <thead slot=\"head\">\n        <th>Name</th>\n        <th>Age</th>\n        <th>Email</th>\n        <th>Address</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <tr v-for=\"row in displayData\" :key=\"row.guid\">\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.email }}</td>\n          <td>{{ row.address.street }}, {{ row.address.city }} {{ row.address.state}}</td>\n        </tr>\n        </tbody>\n      </v-table>\n    </div>\n  </div>\n</template>\n\n<script>\nimport users from './data.json'\nimport VTable from '../../../src/VTable.vue'\n\nexport default {\n  name: 'BasicFiltering',\n  components: { VTable },\n  data: () => ({\n    users: users.slice(0, 10),\n    filters: {\n      name: { value: '', keys: ['name'] }\n    }\n  })\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  @import '~bootstrap/dist/css/bootstrap.min.css';\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/CustomFiltering.vue",
    "content": "<template>\n  <div class=\"card mt-3\">\n    <div class=\"card-body\">\n      <label>Min Age:</label>\n\n      <InputSpinner\n        v-model=\"filters.age.value.min\"\n        :min=\"0\"\n        :max=\"filters.age.value.max\"\n        inputWidth=\"100px\"\n      />\n\n      <label>Max Age:</label>\n      <InputSpinner\n        v-model=\"filters.age.value.max\"\n        :min=\"filters.age.value.min\"\n        :max=\"99\"\n        inputWidth=\"100px\"\n      />\n\n      <v-table\n        :data=\"users\"\n        :filters=\"filters\"\n      >\n        <thead slot=\"head\">\n        <th>Name</th>\n        <th>Age</th>\n        <th>Email</th>\n        <th>Address</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <tr v-for=\"row in displayData\" :key=\"row.guid\">\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.email }}</td>\n          <td>\n            {{ row.address.street }},\n            {{ row.address.city }}\n            {{ row.address.state}}\n          </td>\n        </tr>\n        </tbody>\n      </v-table>\n    </div>\n  </div>\n</template>\n\n<script>\nimport users from './data.json'\nimport VTable from '../../../src/VTable.vue'\nimport InputSpinner from './InputSpinner'\n\nexport default {\n  name: 'CustomFiltering',\n  components: { InputSpinner, VTable },\n  data () {\n    return {\n      users,\n      filters: {\n        age: { value: { min: 21, max: 22 }, custom: this.ageFilter }\n      }\n    }\n  },\n  methods: {\n    ageFilter (filterValue, row) {\n      return row.age >= filterValue.min && row.age <= filterValue.max\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n  @import '~bootstrap/dist/css/bootstrap.min.css';\n  @import '~@fortawesome/fontawesome-free/css/all.css';\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/InputSpinner.vue",
    "content": "<template>\n  <div>\n    <div class=\"input-group input-spinner\"\n         :style=\"{width: componentWidth, 'min-width': '9rem'}\">\n      <div class=\"input-group-prepend\">\n        <button class=\"btn btn-outline-secondary\"\n                type=\"button\"\n                :disabled=\"isSubtractDisabled || disabled\"\n                @click=\"subtract\">\n          <i class=\"fas fa-minus\"/>\n        </button>\n      </div>\n\n      <input type=\"number\"\n             class=\"form-control inputSpinner\"\n             v-model.number.trim=\"numValue\"\n             :style=\"inputWidthStyle\"\n             :readonly=\"readonly || disabled\"\n             @input=\"onInput\"/>\n\n      <div class=\"input-group-append\">\n        <button class=\"btn btn-outline-secondary\"\n                type=\"button\"\n                :disabled=\"isAddDisabled || disabled\"\n                @click=\"add\">\n          <i class=\"fas fa-plus\"/>\n        </button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\n\nexport default {\n  name: 'InputSpinner',\n  props: {\n    min: {\n      type: Number,\n      required: false\n    },\n    max: {\n      type: Number,\n      required: false\n    },\n    value: {\n      type: Number,\n      required: false,\n      default: 0\n    },\n    precision: {\n      type: Number,\n      required: false,\n      default: 0\n    },\n    step: {\n      type: Number,\n      required: false,\n      default: 1\n    },\n    inputWidth: {\n      type: String,\n      required: false,\n      default: null\n    },\n    componentWidth: {\n      type: String,\n      required: false,\n      default: '100%'\n    },\n    readonly: {\n      type: Boolean,\n      required: false,\n      default: true\n    },\n    disabled: {\n      type: Boolean,\n      required: false,\n      default: false\n    }\n  },\n  data () {\n    return {\n      numValue: this.value\n    }\n  },\n  computed: {\n    isAddDisabled () {\n      if (!Number.isFinite(this.max)) {\n        return false\n      }\n\n      return this.numValue + this.step > this.max\n    },\n    isSubtractDisabled () {\n      if (!Number.isFinite(this.min)) {\n        return false\n      }\n\n      return this.numValue - this.step < this.min\n    },\n    inputWidthStyle () {\n      if (this.inputWidth) {\n        return {\n          'max-width': this.inputWidth,\n          'width': this.inputWidth\n        }\n      }\n    }\n  },\n  watch: {\n    value (newValue, oldValue) {\n      if (newValue !== oldValue) {\n        this.numValue = newValue\n      }\n    }\n  },\n  methods: {\n    add () {\n      if (this.isAddDisabled) {\n        return\n      }\n      this.numValue = Number(this.numValue) + this.step\n      this.numValue = Number(this.numValue.toFixed(this.precision))\n\n      this.$emit('input', this.numValue)\n    },\n    subtract () {\n      if (this.isSubtractDisabled) {\n        return\n      }\n      this.numValue = Number(this.numValue) - this.step\n      this.numValue = Number(this.numValue.toFixed(this.precision))\n\n      this.$emit('input', this.numValue)\n    },\n    onInput (event) {\n      const inputValue = event.target.value\n      let parsed = Number(parseFloat(inputValue).toFixed(this.precision))\n\n      if (isNaN(parsed)) {\n        if (typeof this.min === 'number') {\n          parsed = this.min\n        } else {\n          parsed = 0\n        }\n      }\n\n      if (typeof this.min === 'number' && parsed < this.min) {\n        parsed = this.min\n      }\n\n      if (typeof this.max === 'number' && parsed > this.max) {\n        parsed = this.max\n      }\n\n      if (inputValue[0] === '0' && !inputValue.includes('.')) {\n        event.target.value = parsed\n      }\n      this.numValue = parsed\n\n      this.$emit('input', this.numValue)\n    }\n  }\n}\n</script>\n\n<style scoped>\n  .inputSpinner {\n    background-color: white !important;\n    text-align: center;\n  }\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Pagination.vue",
    "content": "<template>\n  <div class=\"card mt-3\">\n    <div class=\"card-body\">\n      <v-table\n        :data=\"users\"\n        :currentPage.sync=\"currentPage\"\n        :pageSize=\"5\"\n        @totalPagesChanged=\"totalPages = $event\"\n      >\n        <thead slot=\"head\">\n          <th>Name</th>\n          <th>Age</th>\n          <th>State</th>\n          <th>Registered</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <tr v-for=\"row in displayData\" :key=\"row.guid\">\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.address.state }}</td>\n          <td>{{ row.registered }}</td>\n        </tr>\n        </tbody>\n      </v-table>\n\n      <smart-pagination\n        :currentPage.sync=\"currentPage\"\n        :totalPages=\"totalPages\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\nimport users from './data.json'\nimport VTable from '../../../src/VTable.vue'\nimport SmartPagination from '../../../src/SmartPagination.vue'\n\nexport default {\n  name: 'Pagination',\n  components: { VTable, SmartPagination },\n  data: () => ({\n    users: users.slice(0, 30),\n    currentPage: 1,\n    totalPages: 0\n  })\n}\n</script>\n\n<style>\n  @import \"~bootstrap/dist/css/bootstrap.css\";\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Selection.vue",
    "content": "<template>\n  <div class=\"card mt-3\">\n    <div class=\"card-body\">\n      <v-table\n        class=\"table-hover\"\n        ref=\"usersTable\"\n        :data=\"users\"\n        selectionMode=\"multiple\"\n        selectedClass=\"table-info\"\n        @selectionChanged=\"selectedRows = $event\"\n      >\n        <thead slot=\"head\">\n        <th>Name</th>\n        <th>Age</th>\n        <th>State</th>\n        <th>Registered</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <v-tr\n          v-for=\"row in displayData\"\n          :key=\"row.guid\"\n          :row=\"row\"\n        >\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.address.state }}</td>\n          <td>{{ row.registered }}</td>\n        </v-tr>\n        </tbody>\n      </v-table>\n\n      <strong>Selected:</strong>\n      <div v-if=\"selectedRows.length === 0\" class=\"text-muted\">No Rows Selected</div>\n      <ul>\n        <li v-for=\"selected in selectedRows\">\n          {{ selected.name }}\n        </li>\n      </ul>\n    </div>\n  </div>\n</template>\n\n<script>\n  import users from './data.json'\n  import VTable from '../../../src/VTable.vue'\n  import VTr from '../../../src/VTr.vue'\n\n  export default {\n    name: 'Selection',\n    components: { VTable, VTr },\n    data: () => ({\n      users: users.slice(0, 10),\n      selectedRows: []\n    })\n  }\n</script>\n\n<style>\n  @import \"~bootstrap/dist/css/bootstrap.css\";\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/SelectionApi.vue",
    "content": "<template>\n  <div class=\"card mt-3\">\n    <div class=\"card-body\">\n      <button\n        class=\"btn btn-outline-secondary\"\n        @click=\"selectAll\"\n      >\n        Select All\n      </button>\n\n      <button\n        class=\"btn btn-outline-secondary\"\n        @click=\"deselectAll\"\n      >\n        Deselect All\n      </button>\n      <v-table\n        ref=\"usersTable\"\n        :data=\"users\"\n        selectionMode=\"multiple\"\n        selectedClass=\"table-info\"\n        @selectionChanged=\"selectedRows = $event\"\n      >\n        <thead slot=\"head\">\n        <th>Name</th>\n        <th>Age</th>\n        <th>State</th>\n        <th>Registered</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <v-tr\n          v-for=\"row in displayData\"\n          :key=\"row.guid\"\n          :row=\"row\"\n        >\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.address.state }}</td>\n          <td>{{ row.registered }}</td>\n        </v-tr>\n        </tbody>\n      </v-table>\n\n      <strong>Selected:</strong>\n      <div v-if=\"selectedRows.length === 0\" class=\"text-muted\">No Rows Selected</div>\n      <ul>\n        <li v-for=\"selected in selectedRows\">\n          {{ selected.name }}\n        </li>\n      </ul>\n    </div>\n  </div>\n</template>\n\n<script>\n  import users from './data.json'\n  import VTable from '../../../src/VTable.vue'\n  import VTr from '../../../src/VTr.vue'\n\n  export default {\n    name: 'Sorting',\n    components: { VTable, VTr },\n    data: () => ({\n      users: users.slice(0, 10),\n      selectedRows: []\n    }),\n    mounted () {\n      this.$refs.usersTable.selectRows(this.users.slice(1, 4))\n    },\n    methods: {\n      selectAll () {\n        this.$refs.usersTable.selectAll()\n      },\n      deselectAll () {\n        this.$refs.usersTable.deselectAll()\n      }\n    }\n  }\n</script>\n\n<style>\n  @import \"~bootstrap/dist/css/bootstrap.css\";\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Sorting.vue",
    "content": "<template>\n  <div class=\"card mt-3\">\n    <div class=\"card-body\">\n      <v-table\n        :data=\"users\"\n      >\n        <thead slot=\"head\">\n          <v-th :sortKey=\"nameLength\" defaultSort=\"desc\">Name</v-th>\n          <v-th sortKey=\"age\">Age</v-th>\n          <v-th sortKey=\"address.state\">State</v-th>\n          <v-th :customSort=\"dateSort\">Registered</v-th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n          <tr v-for=\"row in displayData\" :key=\"row.guid\">\n            <td>{{ row.name }}</td>\n            <td>{{ row.age }}</td>\n            <td>{{ row.address.state }}</td>\n            <td>{{ row.registered }}</td>\n          </tr>\n        </tbody>\n      </v-table>\n    </div>\n  </div>\n</template>\n\n<script>\nimport users from './data.json'\nimport VTable from '../../../src/VTable.vue'\nimport VTh from '../../../src/VTh.vue'\n\nexport default {\n  name: 'Sorting',\n  components: { VTable, VTh },\n  data: () => ({\n    users: users.slice(0, 10)\n  }),\n  methods: {\n    nameLength (row) {\n      return row.name.length\n    },\n    dateSort(a, b) {\n      let date1 = new Date(a.registered).getTime();\n      let date2 = new Date(b.registered).getTime();\n\n      return date1 - date2;\n    }\n  }\n}\n</script>\n\n<style>\n  @import \"~bootstrap/dist/css/bootstrap.css\";\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/SortingFA.vue",
    "content": "<template>\n  <div class=\"card mt-3\">\n    <div class=\"card-body\">\n      <v-table\n        :data=\"users\"\n        :hideSortIcons=\"true\"\n      >\n        <thead slot=\"head\">\n          <v-th sortKey=\"name\" defaultSort=\"asc\">Name</v-th>\n          <v-th sortKey=\"age\">Age</v-th>\n          <v-th sortKey=\"address.state\">State</v-th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n          <tr v-for=\"row in displayData\" :key=\"row.guid\">\n            <td>{{ row.name }}</td>\n            <td>{{ row.age }}</td>\n            <td>{{ row.address.state }}</td>\n          </tr>\n        </tbody>\n      </v-table>\n    </div>\n  </div>\n</template>\n\n<script>\nimport users from './data.json'\nimport VTable from '../../../src/VTable.vue'\nimport VTh from '../../../src/VTh.vue'\n\nexport default {\n  name: 'SortingFA',\n  components: { VTable, VTh },\n  data: () => ({\n    users: users.slice(20, 30)\n  })\n}\n</script>\n\n<style>\n  @import \"~@fortawesome/fontawesome-free/css/all.css\";\n  @import \"~bootstrap/dist/css/bootstrap.css\";\n\n  .vt-sort:before{\n    font-family: \"Font Awesome 5 Free\";\n    padding-right: 0.5em;\n    width: 1.28571429em;\n    display: inline-block;\n    text-align: center;\n  }\n\n  .vt-sortable:before{\n    content: \"\\f338\";\n  }\n\n  .vt-asc:before{\n    content: \"\\f160\";\n  }\n\n  .vt-desc:before{\n    content: \"\\f161\";\n  }\n</style>\n\n\n"
  },
  {
    "path": "docs/.vuepress/components/TheBasics.vue",
    "content": "<template>\n  <v-table\n    :data=\"data\"\n  >\n    <thead slot=\"head\">\n    <th>Name</th>\n    <th>Age</th>\n    <th>Email</th>\n    <th>Address</th>\n    </thead>\n    <tbody slot=\"body\" slot-scope=\"{displayData}\">\n    <tr v-for=\"row in displayData\" :key=\"row.guid\">\n      <td>{{ row.name }}</td>\n      <td>{{ row.age }}</td>\n      <td>{{ row.email }}</td>\n      <td>{{ row.address.street }}, {{ row.address.city }} {{ row.address.state}}</td>\n    </tr>\n    </tbody>\n  </v-table>\n</template>\n\n<script>\nimport data from './data.json'\nimport VTable from '../../../src/VTable.vue'\n\nexport default {\n  name: 'TheBasics',\n  components: { VTable },\n  data: () => ({\n    data: data.slice(0, 5)\n  })\n}\n</script>\n"
  },
  {
    "path": "docs/.vuepress/components/data.json",
    "content": "[\n  {\n    \"_id\": \"57ef9cd8e22df324d77c4f07\",\n    \"index\": 0,\n    \"guid\": \"9bc8e89d-658c-47cf-acc3-b0e225ddb549\",\n    \"isActive\": false,\n    \"balance\": \"$1,029.59\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 25,\n    \"eyeColor\": \"green\",\n    \"name\": \"Deana Lindsay\",\n    \"gender\": \"female\",\n    \"company\": \"TERRAGO\",\n    \"email\": \"deanalindsay@terrago.com\",\n    \"phone\": \"+1 (858) 506-2166\",\n    \"address\": {\n      \"street\": \"268 Garnet Street\",\n      \"city\": \"Chicopee\",\n      \"state\": \"Pennsylvania\"\n    },\n    \"registered\": \"2015-10-30\",\n    \"tags\": [\n      \"reprehenderit\",\n      \"duis\",\n      \"mollit\",\n      \"eiusmod\",\n      \"incididunt\",\n      \"nisi\",\n      \"sunt\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8392af802937a0974\",\n    \"index\": 1,\n    \"guid\": \"1436aae5-4540-474a-8bad-4ca6b9c903ac\",\n    \"isActive\": true,\n    \"balance\": \"$1,302.22\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Wyatt Kline\",\n    \"gender\": \"male\",\n    \"company\": \"MEDMEX\",\n    \"email\": \"wyattkline@medmex.com\",\n    \"phone\": \"+1 (827) 579-2502\",\n    \"address\": {\n      \"street\": \"234 Irwin Street\",\n      \"city\": \"Irwin\",\n      \"state\": \"Maine\"\n    },\n    \"registered\": \"2014-06-17\",\n    \"tags\": [\n      \"aute\",\n      \"laboris\",\n      \"sit\",\n      \"voluptate\",\n      \"magna\",\n      \"voluptate\",\n      \"occaecat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd865c7f5203dc5e126\",\n    \"index\": 2,\n    \"guid\": \"2bc5aad6-2172-4041-a949-b31729290f25\",\n    \"isActive\": true,\n    \"balance\": \"$3,066.01\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 29,\n    \"eyeColor\": \"green\",\n    \"name\": \"Harmon Huber\",\n    \"gender\": \"male\",\n    \"company\": \"SNIPS\",\n    \"email\": \"harmonhuber@snips.com\",\n    \"phone\": \"+1 (931) 482-3018\",\n    \"address\": {\n      \"street\": \"913 Gerritsen Avenue\",\n      \"city\": \"Nash\",\n      \"state\": \"American Samoa\"\n    },\n    \"registered\": \"2016-01-25\",\n    \"tags\": [\n      \"do\",\n      \"voluptate\",\n      \"id\",\n      \"do\",\n      \"occaecat\",\n      \"minim\",\n      \"tempor\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8594cc4bc18a121f7\",\n    \"index\": 3,\n    \"guid\": \"5d48aae2-9e3c-434e-a835-3abdab56e240\",\n    \"isActive\": false,\n    \"balance\": \"$3,574.33\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 29,\n    \"eyeColor\": \"green\",\n    \"name\": \"Penny Maddox\",\n    \"gender\": \"female\",\n    \"company\": \"BALUBA\",\n    \"email\": \"pennymaddox@baluba.com\",\n    \"phone\": \"+1 (873) 552-2338\",\n    \"address\": {\n      \"street\": \"218 Agate Court\",\n      \"city\": \"Sandston\",\n      \"state\": \"Oregon\"\n    },\n    \"registered\": \"2016-01-08\",\n    \"tags\": [\n      \"anim\",\n      \"aliqua\",\n      \"consequat\",\n      \"tempor\",\n      \"excepteur\",\n      \"est\",\n      \"enim\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd846b7cd74053c10c9\",\n    \"index\": 4,\n    \"guid\": \"3c4a0399-68c9-4741-8c77-0e7e0dd9ed00\",\n    \"isActive\": true,\n    \"balance\": \"$1,363.39\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Morgan Gomez\",\n    \"gender\": \"male\",\n    \"company\": \"AFFLUEX\",\n    \"email\": \"morgangomez@affluex.com\",\n    \"phone\": \"+1 (976) 466-3779\",\n    \"address\": {\n      \"street\": \"632 Highland Avenue\",\n      \"city\": \"Tuttle\",\n      \"state\": \"Connecticut\"\n    },\n    \"registered\": \"2014-04-10\",\n    \"tags\": [\n      \"duis\",\n      \"deserunt\",\n      \"id\",\n      \"nostrud\",\n      \"mollit\",\n      \"consequat\",\n      \"ea\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8d429bf34a0c2dc36\",\n    \"index\": 5,\n    \"guid\": \"d321b26f-f8ce-461e-9673-5b9497aacea7\",\n    \"isActive\": false,\n    \"balance\": \"$1,469.54\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 35,\n    \"eyeColor\": \"green\",\n    \"name\": \"Beck Mckay\",\n    \"gender\": \"male\",\n    \"company\": \"GEOLOGIX\",\n    \"email\": \"beckmckay@geologix.com\",\n    \"phone\": \"+1 (879) 477-3341\",\n    \"address\": {\n      \"street\": \"936 Woodpoint Road\",\n      \"city\": \"Wakulla\",\n      \"state\": \"Mississippi\"\n    },\n    \"registered\": \"2016-05-06\",\n    \"tags\": [\n      \"non\",\n      \"cillum\",\n      \"culpa\",\n      \"irure\",\n      \"nulla\",\n      \"non\",\n      \"occaecat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd86866468dc1c20447\",\n    \"index\": 6,\n    \"guid\": \"c097a185-98ee-4bdd-a6ec-a3e5e40801be\",\n    \"isActive\": true,\n    \"balance\": \"$3,125.22\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Massey Carlson\",\n    \"gender\": \"male\",\n    \"company\": \"EARTHWAX\",\n    \"email\": \"masseycarlson@earthwax.com\",\n    \"phone\": \"+1 (871) 471-2647\",\n    \"address\": {\n      \"street\": \"278 Chapel Street\",\n      \"city\": \"Taycheedah\",\n      \"state\": \"Hawaii\"\n    },\n    \"registered\": \"2014-10-22\",\n    \"tags\": [\n      \"ullamco\",\n      \"fugiat\",\n      \"consequat\",\n      \"nostrud\",\n      \"aliqua\",\n      \"consequat\",\n      \"fugiat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd83f55c1d078fc6cfd\",\n    \"index\": 7,\n    \"guid\": \"29e53cbb-6353-44a3-a2c8-e7b3176d00af\",\n    \"isActive\": false,\n    \"balance\": \"$3,663.46\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 33,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Hill Hale\",\n    \"gender\": \"male\",\n    \"company\": \"CALCU\",\n    \"email\": \"hillhale@calcu.com\",\n    \"phone\": \"+1 (877) 598-2610\",\n    \"address\": {\n      \"street\": \"618 Newport Street\",\n      \"city\": \"Deercroft\",\n      \"state\": \"Colorado\"\n    },\n    \"registered\": \"2016-04-18\",\n    \"tags\": [\n      \"nostrud\",\n      \"duis\",\n      \"Lorem\",\n      \"ex\",\n      \"elit\",\n      \"labore\",\n      \"in\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8f8863a277e1c2055\",\n    \"index\": 8,\n    \"guid\": \"955a6cd5-b73c-4a6c-9280-76cbc4e232b2\",\n    \"isActive\": false,\n    \"balance\": \"$2,451.20\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 26,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Stokes Hurst\",\n    \"gender\": \"male\",\n    \"company\": \"DATAGEN\",\n    \"email\": \"stokeshurst@datagen.com\",\n    \"phone\": \"+1 (897) 537-2718\",\n    \"address\": {\n      \"street\": \"146 Conover Street\",\n      \"city\": \"Dahlen\",\n      \"state\": \"North Dakota\"\n    },\n    \"registered\": \"2016-01-30\",\n    \"tags\": [\n      \"est\",\n      \"eu\",\n      \"anim\",\n      \"eiusmod\",\n      \"exercitation\",\n      \"commodo\",\n      \"nulla\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd86b62971bb96f7603\",\n    \"index\": 9,\n    \"guid\": \"239a3301-1dae-4ef8-ae30-7e92a84c78a2\",\n    \"isActive\": false,\n    \"balance\": \"$1,753.67\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 20,\n    \"eyeColor\": \"green\",\n    \"name\": \"Cain Knapp\",\n    \"gender\": \"male\",\n    \"company\": \"NAMEBOX\",\n    \"email\": \"cainknapp@namebox.com\",\n    \"phone\": \"+1 (873) 435-3377\",\n    \"address\": {\n      \"street\": \"460 Bridgewater Street\",\n      \"city\": \"Manchester\",\n      \"state\": \"Michigan\"\n    },\n    \"registered\": \"2016-01-04\",\n    \"tags\": [\n      \"fugiat\",\n      \"non\",\n      \"adipisicing\",\n      \"id\",\n      \"incididunt\",\n      \"do\",\n      \"enim\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8431bccda13eea218\",\n    \"index\": 10,\n    \"guid\": \"b5671cc8-2776-4180-9cab-2f26fd38c720\",\n    \"isActive\": false,\n    \"balance\": \"$1,619.16\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 22,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Ramirez Valdez\",\n    \"gender\": \"male\",\n    \"company\": \"SOLAREN\",\n    \"email\": \"ramirezvaldez@solaren.com\",\n    \"phone\": \"+1 (820) 465-2360\",\n    \"address\": {\n      \"street\": \"932 Battery Avenue\",\n      \"city\": \"Iola\",\n      \"state\": \"Virginia\"\n    },\n    \"registered\": \"2014-01-27\",\n    \"tags\": [\n      \"minim\",\n      \"aliqua\",\n      \"culpa\",\n      \"dolore\",\n      \"excepteur\",\n      \"minim\",\n      \"sit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e7379045d04a0540\",\n    \"index\": 11,\n    \"guid\": \"19b39b01-74e1-495c-b7a6-a88d66420fba\",\n    \"isActive\": false,\n    \"balance\": \"$1,638.78\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Alisha Michael\",\n    \"gender\": \"female\",\n    \"company\": \"STUCCO\",\n    \"email\": \"alishamichael@stucco.com\",\n    \"phone\": \"+1 (800) 497-2778\",\n    \"address\": {\n      \"street\": \"184 Coffey Street\",\n      \"city\": \"Trucksville\",\n      \"state\": \"New York\"\n    },\n    \"registered\": \"2015-03-31\",\n    \"tags\": [\n      \"irure\",\n      \"dolore\",\n      \"minim\",\n      \"excepteur\",\n      \"aliquip\",\n      \"officia\",\n      \"fugiat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8059fd44b460b7c38\",\n    \"index\": 12,\n    \"guid\": \"2a3054d0-a2ea-4ee2-a2f5-f5d1d0573b11\",\n    \"isActive\": true,\n    \"balance\": \"$1,156.43\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 21,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Shepard Russo\",\n    \"gender\": \"male\",\n    \"company\": \"MAXIMIND\",\n    \"email\": \"shepardrusso@maximind.com\",\n    \"phone\": \"+1 (810) 417-3060\",\n    \"address\": {\n      \"street\": \"450 Stryker Court\",\n      \"city\": \"Eagleville\",\n      \"state\": \"South Dakota\"\n    },\n    \"registered\": \"2014-12-17\",\n    \"tags\": [\n      \"qui\",\n      \"irure\",\n      \"pariatur\",\n      \"eiusmod\",\n      \"tempor\",\n      \"ullamco\",\n      \"aliquip\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8afc877c47ac02b6a\",\n    \"index\": 13,\n    \"guid\": \"7ad0c0a8-59ca-457f-9b41-fd1ae83b4f60\",\n    \"isActive\": false,\n    \"balance\": \"$2,376.34\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Joyner Cohen\",\n    \"gender\": \"male\",\n    \"company\": \"LYRIA\",\n    \"email\": \"joynercohen@lyria.com\",\n    \"phone\": \"+1 (962) 595-2903\",\n    \"address\": {\n      \"street\": \"304 Calder Place\",\n      \"city\": \"Choctaw\",\n      \"state\": \"Louisiana\"\n    },\n    \"registered\": \"2016-04-30\",\n    \"tags\": [\n      \"in\",\n      \"sunt\",\n      \"cupidatat\",\n      \"nostrud\",\n      \"laboris\",\n      \"culpa\",\n      \"consequat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8aa516857d091b670\",\n    \"index\": 14,\n    \"guid\": \"47be1205-5fde-4a1b-ba80-5ab56e659c32\",\n    \"isActive\": false,\n    \"balance\": \"$1,837.95\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 32,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Doreen Vincent\",\n    \"gender\": \"female\",\n    \"company\": \"VANTAGE\",\n    \"email\": \"doreenvincent@vantage.com\",\n    \"phone\": \"+1 (972) 484-2153\",\n    \"address\": {\n      \"street\": \"520 Greenpoint Avenue\",\n      \"city\": \"Chapin\",\n      \"state\": \"Rhode Island\"\n    },\n    \"registered\": \"2015-12-11\",\n    \"tags\": [\n      \"cillum\",\n      \"aute\",\n      \"Lorem\",\n      \"occaecat\",\n      \"eu\",\n      \"voluptate\",\n      \"ea\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8778023bd5ebc71df\",\n    \"index\": 15,\n    \"guid\": \"3efedc36-6bcd-4f78-b64e-11f6c3374ff0\",\n    \"isActive\": true,\n    \"balance\": \"$3,412.92\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 34,\n    \"eyeColor\": \"green\",\n    \"name\": \"Felicia Osborne\",\n    \"gender\": \"female\",\n    \"company\": \"XELEGYL\",\n    \"email\": \"feliciaosborne@xelegyl.com\",\n    \"phone\": \"+1 (884) 448-3923\",\n    \"address\": {\n      \"street\": \"895 Luquer Street\",\n      \"city\": \"Bluffview\",\n      \"state\": \"Alabama\"\n    },\n    \"registered\": \"2015-04-11\",\n    \"tags\": [\n      \"elit\",\n      \"veniam\",\n      \"consectetur\",\n      \"sunt\",\n      \"ipsum\",\n      \"incididunt\",\n      \"adipisicing\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd862a19b82a2b57c2a\",\n    \"index\": 16,\n    \"guid\": \"2a08992f-b1ca-4a75-9b4c-df4ba052f3b2\",\n    \"isActive\": false,\n    \"balance\": \"$2,053.01\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 35,\n    \"eyeColor\": \"green\",\n    \"name\": \"Dillon Schmidt\",\n    \"gender\": \"male\",\n    \"company\": \"KEEG\",\n    \"email\": \"dillonschmidt@keeg.com\",\n    \"phone\": \"+1 (869) 554-3796\",\n    \"address\": {\n      \"street\": \"344 Sullivan Place\",\n      \"city\": \"Bawcomville\",\n      \"state\": \"Palau\"\n    },\n    \"registered\": \"2016-07-04\",\n    \"tags\": [\n      \"mollit\",\n      \"duis\",\n      \"pariatur\",\n      \"velit\",\n      \"Lorem\",\n      \"Lorem\",\n      \"anim\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8b2b36698294cfb64\",\n    \"index\": 17,\n    \"guid\": \"9644a804-0216-49c7-8625-d15a3bfb31c5\",\n    \"isActive\": false,\n    \"balance\": \"$2,507.00\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 40,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Melody Miranda\",\n    \"gender\": \"female\",\n    \"company\": \"ENTHAZE\",\n    \"email\": \"melodymiranda@enthaze.com\",\n    \"phone\": \"+1 (849) 464-3618\",\n    \"address\": {\n      \"street\": \"418 Whitney Avenue\",\n      \"city\": \"Sanders\",\n      \"state\": \"Indiana\"\n    },\n    \"registered\": \"2014-04-22\",\n    \"tags\": [\n      \"consequat\",\n      \"commodo\",\n      \"magna\",\n      \"aute\",\n      \"occaecat\",\n      \"ea\",\n      \"minim\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8410de3de4768210a\",\n    \"index\": 18,\n    \"guid\": \"3859f0d4-cc87-4d6b-b101-e867b8e5c0cc\",\n    \"isActive\": false,\n    \"balance\": \"$2,737.68\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 36,\n    \"eyeColor\": \"green\",\n    \"name\": \"Wilkerson Melendez\",\n    \"gender\": \"male\",\n    \"company\": \"TECHMANIA\",\n    \"email\": \"wilkersonmelendez@techmania.com\",\n    \"phone\": \"+1 (952) 481-3063\",\n    \"address\": {\n      \"street\": \"818 Ocean Parkway\",\n      \"city\": \"Kerby\",\n      \"state\": \"Iowa\"\n    },\n    \"registered\": \"2014-11-14\",\n    \"tags\": [\n      \"sit\",\n      \"cupidatat\",\n      \"aliqua\",\n      \"in\",\n      \"officia\",\n      \"pariatur\",\n      \"ex\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8bda3e38af810f58a\",\n    \"index\": 19,\n    \"guid\": \"90af70fd-1241-4d07-b3f0-727f7987a60c\",\n    \"isActive\": true,\n    \"balance\": \"$1,028.57\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 37,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Rivera Velazquez\",\n    \"gender\": \"male\",\n    \"company\": \"GLEAMINK\",\n    \"email\": \"riveravelazquez@gleamink.com\",\n    \"phone\": \"+1 (973) 597-3283\",\n    \"address\": {\n      \"street\": \"330 Monaco Place\",\n      \"city\": \"Grahamtown\",\n      \"state\": \"Northern Mariana Islands\"\n    },\n    \"registered\": \"2016-01-10\",\n    \"tags\": [\n      \"excepteur\",\n      \"est\",\n      \"occaecat\",\n      \"nulla\",\n      \"nostrud\",\n      \"eu\",\n      \"ipsum\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8351d9509288c8469\",\n    \"index\": 20,\n    \"guid\": \"c9f0b7e4-f7ec-44b5-ba6b-d9991bb3404b\",\n    \"isActive\": true,\n    \"balance\": \"$2,456.41\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 35,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Reese Velez\",\n    \"gender\": \"male\",\n    \"company\": \"POLARIA\",\n    \"email\": \"reesevelez@polaria.com\",\n    \"phone\": \"+1 (950) 549-3805\",\n    \"address\": {\n      \"street\": \"571 Wilson Avenue\",\n      \"city\": \"Hannasville\",\n      \"state\": \"Tennessee\"\n    },\n    \"registered\": \"2016-07-24\",\n    \"tags\": [\n      \"veniam\",\n      \"occaecat\",\n      \"irure\",\n      \"consequat\",\n      \"labore\",\n      \"laboris\",\n      \"Lorem\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8014e14851bee0084\",\n    \"index\": 21,\n    \"guid\": \"6691378e-7cb9-4bff-ac93-a79fadfa49d1\",\n    \"isActive\": false,\n    \"balance\": \"$3,892.36\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 33,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Kayla Morgan\",\n    \"gender\": \"female\",\n    \"company\": \"VIDTO\",\n    \"email\": \"kaylamorgan@vidto.com\",\n    \"phone\": \"+1 (976) 499-2436\",\n    \"address\": {\n      \"street\": \"188 Lancaster Avenue\",\n      \"city\": \"Bowden\",\n      \"state\": \"District Of Columbia\"\n    },\n    \"registered\": \"2015-12-16\",\n    \"tags\": [\n      \"minim\",\n      \"proident\",\n      \"sunt\",\n      \"nostrud\",\n      \"adipisicing\",\n      \"cupidatat\",\n      \"veniam\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd810b76a3d60fb0b9b\",\n    \"index\": 22,\n    \"guid\": \"26e927c7-63c5-4e82-bdc0-7832cb890156\",\n    \"isActive\": false,\n    \"balance\": \"$3,668.66\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 20,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Benson Snyder\",\n    \"gender\": \"male\",\n    \"company\": \"ZOSIS\",\n    \"email\": \"bensonsnyder@zosis.com\",\n    \"phone\": \"+1 (923) 595-3264\",\n    \"address\": {\n      \"street\": \"294 Douglass Street\",\n      \"city\": \"Hiseville\",\n      \"state\": \"Marshall Islands\"\n    },\n    \"registered\": \"2016-07-02\",\n    \"tags\": [\n      \"sint\",\n      \"amet\",\n      \"cillum\",\n      \"exercitation\",\n      \"Lorem\",\n      \"amet\",\n      \"ad\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8d6e3b40316003054\",\n    \"index\": 23,\n    \"guid\": \"248e3d33-6827-461b-a92e-408a4927d5dc\",\n    \"isActive\": true,\n    \"balance\": \"$2,253.39\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 32,\n    \"eyeColor\": \"green\",\n    \"name\": \"Strickland Andrews\",\n    \"gender\": \"male\",\n    \"company\": \"COMBOT\",\n    \"email\": \"stricklandandrews@combot.com\",\n    \"phone\": \"+1 (969) 560-2376\",\n    \"address\": {\n      \"street\": \"677 Albemarle Road\",\n      \"city\": \"Thornport\",\n      \"state\": \"Florida\"\n    },\n    \"registered\": \"2015-06-15\",\n    \"tags\": [\n      \"culpa\",\n      \"nulla\",\n      \"excepteur\",\n      \"incididunt\",\n      \"nulla\",\n      \"mollit\",\n      \"occaecat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8bbf66c3b7757b773\",\n    \"index\": 24,\n    \"guid\": \"303c36fd-14e0-49f7-b6de-01c6cf866313\",\n    \"isActive\": false,\n    \"balance\": \"$1,248.11\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 21,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Castro Hanson\",\n    \"gender\": \"male\",\n    \"company\": \"FURNITECH\",\n    \"email\": \"castrohanson@furnitech.com\",\n    \"phone\": \"+1 (901) 512-2724\",\n    \"address\": {\n      \"street\": \"932 Herkimer Court\",\n      \"city\": \"Cavalero\",\n      \"state\": \"Texas\"\n    },\n    \"registered\": \"2014-12-07\",\n    \"tags\": [\n      \"est\",\n      \"aliqua\",\n      \"enim\",\n      \"ex\",\n      \"Lorem\",\n      \"nostrud\",\n      \"eiusmod\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8aa22d92e5c82b2f6\",\n    \"index\": 25,\n    \"guid\": \"fd997458-836f-4d24-bbab-a0aa26e68c2d\",\n    \"isActive\": false,\n    \"balance\": \"$1,264.43\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 21,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Iris Nielsen\",\n    \"gender\": \"female\",\n    \"company\": \"ROUGHIES\",\n    \"email\": \"irisnielsen@roughies.com\",\n    \"phone\": \"+1 (916) 468-3250\",\n    \"address\": {\n      \"street\": \"824 Doscher Street\",\n      \"city\": \"Goodville\",\n      \"state\": \"South Carolina\"\n    },\n    \"registered\": \"2015-08-01\",\n    \"tags\": [\n      \"sint\",\n      \"voluptate\",\n      \"adipisicing\",\n      \"id\",\n      \"eiusmod\",\n      \"veniam\",\n      \"excepteur\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e00712c4924d6413\",\n    \"index\": 26,\n    \"guid\": \"f6b3c048-e563-4fa6-a28f-d358c5b4f74c\",\n    \"isActive\": true,\n    \"balance\": \"$1,462.23\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 23,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Dionne Boyer\",\n    \"gender\": \"female\",\n    \"company\": \"PETIGEMS\",\n    \"email\": \"dionneboyer@petigems.com\",\n    \"phone\": \"+1 (826) 510-3961\",\n    \"address\": {\n      \"street\": \"483 Prospect Avenue\",\n      \"city\": \"Forestburg\",\n      \"state\": \"Nevada\"\n    },\n    \"registered\": \"2016-09-09\",\n    \"tags\": [\n      \"ipsum\",\n      \"id\",\n      \"eiusmod\",\n      \"laboris\",\n      \"incididunt\",\n      \"deserunt\",\n      \"anim\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8a25729d7ccb55e01\",\n    \"index\": 27,\n    \"guid\": \"376807be-1fdc-4d6a-961c-84b313b81f70\",\n    \"isActive\": true,\n    \"balance\": \"$1,384.08\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 33,\n    \"eyeColor\": \"green\",\n    \"name\": \"Cooke Alford\",\n    \"gender\": \"male\",\n    \"company\": \"PROXSOFT\",\n    \"email\": \"cookealford@proxsoft.com\",\n    \"phone\": \"+1 (850) 486-2468\",\n    \"address\": {\n      \"street\": \"870 High Street\",\n      \"city\": \"Reinerton\",\n      \"state\": \"Delaware\"\n    },\n    \"registered\": \"2016-03-25\",\n    \"tags\": [\n      \"id\",\n      \"amet\",\n      \"irure\",\n      \"eiusmod\",\n      \"excepteur\",\n      \"nostrud\",\n      \"qui\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8998c6d6498836a72\",\n    \"index\": 28,\n    \"guid\": \"fe5ad1f3-c898-4635-bbd8-6c3185e9415f\",\n    \"isActive\": false,\n    \"balance\": \"$1,658.18\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 24,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Goff Lamb\",\n    \"gender\": \"male\",\n    \"company\": \"GLOBOIL\",\n    \"email\": \"gofflamb@globoil.com\",\n    \"phone\": \"+1 (996) 400-2491\",\n    \"address\": {\n      \"street\": \"361 Interborough Parkway\",\n      \"city\": \"Dodge\",\n      \"state\": \"Kansas\"\n    },\n    \"registered\": \"2016-09-12\",\n    \"tags\": [\n      \"nisi\",\n      \"cupidatat\",\n      \"aliquip\",\n      \"non\",\n      \"et\",\n      \"sint\",\n      \"enim\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd82e0778dff1ee3579\",\n    \"index\": 29,\n    \"guid\": \"ea213edd-47dd-4fd5-be36-27e34fa7fba1\",\n    \"isActive\": false,\n    \"balance\": \"$2,355.96\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 21,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Barry Ramsey\",\n    \"gender\": \"male\",\n    \"company\": \"ACCUPHARM\",\n    \"email\": \"barryramsey@accupharm.com\",\n    \"phone\": \"+1 (841) 406-3771\",\n    \"address\": {\n      \"street\": \"220 Henderson Walk\",\n      \"city\": \"Gerber\",\n      \"state\": \"California\"\n    },\n    \"registered\": \"2014-11-15\",\n    \"tags\": [\n      \"cillum\",\n      \"esse\",\n      \"aliqua\",\n      \"do\",\n      \"irure\",\n      \"eu\",\n      \"eu\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8b7a3f7141cd6787a\",\n    \"index\": 30,\n    \"guid\": \"05148b5f-e9b2-4697-a25c-b9de7473f4bc\",\n    \"isActive\": true,\n    \"balance\": \"$1,262.77\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 31,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Aguilar Koch\",\n    \"gender\": \"male\",\n    \"company\": \"EMERGENT\",\n    \"email\": \"aguilarkoch@emergent.com\",\n    \"phone\": \"+1 (829) 518-3177\",\n    \"address\": {\n      \"street\": \"929 Himrod Street\",\n      \"city\": \"Leeper\",\n      \"state\": \"New Jersey\"\n    },\n    \"registered\": \"2015-07-12\",\n    \"tags\": [\n      \"ipsum\",\n      \"eu\",\n      \"cillum\",\n      \"aute\",\n      \"labore\",\n      \"ea\",\n      \"eiusmod\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd83f6b95641c5e3c75\",\n    \"index\": 31,\n    \"guid\": \"27304437-1b44-4ad8-81e8-710b4b8345ff\",\n    \"isActive\": false,\n    \"balance\": \"$3,601.82\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 24,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Oconnor Hopper\",\n    \"gender\": \"male\",\n    \"company\": \"FUELWORKS\",\n    \"email\": \"oconnorhopper@fuelworks.com\",\n    \"phone\": \"+1 (891) 493-3016\",\n    \"address\": {\n      \"street\": \"426 Montieth Street\",\n      \"city\": \"Hegins\",\n      \"state\": \"Wyoming\"\n    },\n    \"registered\": \"2015-07-24\",\n    \"tags\": [\n      \"minim\",\n      \"voluptate\",\n      \"elit\",\n      \"incididunt\",\n      \"ut\",\n      \"fugiat\",\n      \"occaecat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8369d6e4b835f3fcd\",\n    \"index\": 32,\n    \"guid\": \"721a77b7-b011-47f4-a810-e7f29e7006c9\",\n    \"isActive\": true,\n    \"balance\": \"$1,915.04\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 20,\n    \"eyeColor\": \"green\",\n    \"name\": \"Daugherty White\",\n    \"gender\": \"male\",\n    \"company\": \"BOLAX\",\n    \"email\": \"daughertywhite@bolax.com\",\n    \"phone\": \"+1 (826) 594-2129\",\n    \"address\": {\n      \"street\": \"449 Lester Court\",\n      \"city\": \"Joes\",\n      \"state\": \"Massachusetts\"\n    },\n    \"registered\": \"2014-10-13\",\n    \"tags\": [\n      \"Lorem\",\n      \"enim\",\n      \"nostrud\",\n      \"nisi\",\n      \"consequat\",\n      \"ullamco\",\n      \"laborum\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd86305c595658af48b\",\n    \"index\": 33,\n    \"guid\": \"1cfc8de2-d36c-4ef1-9e40-f088cf75eb82\",\n    \"isActive\": true,\n    \"balance\": \"$2,866.63\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 40,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Kane Mclaughlin\",\n    \"gender\": \"male\",\n    \"company\": \"BUZZNESS\",\n    \"email\": \"kanemclaughlin@buzzness.com\",\n    \"phone\": \"+1 (832) 531-3366\",\n    \"address\": {\n      \"street\": \"661 Apollo Street\",\n      \"city\": \"Crayne\",\n      \"state\": \"Kentucky\"\n    },\n    \"registered\": \"2014-07-08\",\n    \"tags\": [\n      \"laboris\",\n      \"quis\",\n      \"enim\",\n      \"ea\",\n      \"cupidatat\",\n      \"nisi\",\n      \"ipsum\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8306a49b3a4173669\",\n    \"index\": 34,\n    \"guid\": \"0bf330e0-c370-466d-9a5e-4506272fd132\",\n    \"isActive\": false,\n    \"balance\": \"$1,185.64\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 40,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Berry Moore\",\n    \"gender\": \"male\",\n    \"company\": \"MOBILDATA\",\n    \"email\": \"berrymoore@mobildata.com\",\n    \"phone\": \"+1 (868) 455-2610\",\n    \"address\": {\n      \"street\": \"655 Eldert Street\",\n      \"city\": \"Camino\",\n      \"state\": \"Arizona\"\n    },\n    \"registered\": \"2015-10-08\",\n    \"tags\": [\n      \"labore\",\n      \"dolore\",\n      \"labore\",\n      \"proident\",\n      \"aute\",\n      \"amet\",\n      \"quis\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd80ae90356bd04b760\",\n    \"index\": 35,\n    \"guid\": \"2be39caa-9fcc-4616-a7b5-f72e3d3cbdaf\",\n    \"isActive\": true,\n    \"balance\": \"$1,185.60\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 26,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Gwendolyn Hunt\",\n    \"gender\": \"female\",\n    \"company\": \"DIGIAL\",\n    \"email\": \"gwendolynhunt@digial.com\",\n    \"phone\": \"+1 (853) 562-3237\",\n    \"address\": {\n      \"street\": \"597 Hart Street\",\n      \"city\": \"Kenmar\",\n      \"state\": \"Maryland\"\n    },\n    \"registered\": \"2015-10-27\",\n    \"tags\": [\n      \"Lorem\",\n      \"officia\",\n      \"adipisicing\",\n      \"velit\",\n      \"tempor\",\n      \"eiusmod\",\n      \"labore\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd884359a9538967098\",\n    \"index\": 36,\n    \"guid\": \"63ab3d9c-8138-4f09-baf9-6d76c5ba573a\",\n    \"isActive\": true,\n    \"balance\": \"$2,469.48\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 23,\n    \"eyeColor\": \"green\",\n    \"name\": \"Willie Garrett\",\n    \"gender\": \"female\",\n    \"company\": \"BALOOBA\",\n    \"email\": \"williegarrett@balooba.com\",\n    \"phone\": \"+1 (843) 425-3145\",\n    \"address\": {\n      \"street\": \"456 Maple Avenue\",\n      \"city\": \"Hackneyville\",\n      \"state\": \"Illinois\"\n    },\n    \"registered\": \"2014-02-09\",\n    \"tags\": [\n      \"est\",\n      \"aliqua\",\n      \"in\",\n      \"excepteur\",\n      \"ut\",\n      \"eu\",\n      \"fugiat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8db282c5f4f1448d4\",\n    \"index\": 37,\n    \"guid\": \"bc8ce4f1-6cc4-4925-9046-3a5e91f858bc\",\n    \"isActive\": true,\n    \"balance\": \"$1,067.32\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 29,\n    \"eyeColor\": \"green\",\n    \"name\": \"Christina Good\",\n    \"gender\": \"female\",\n    \"company\": \"APPLIDECK\",\n    \"email\": \"christinagood@applideck.com\",\n    \"phone\": \"+1 (851) 462-3278\",\n    \"address\": {\n      \"street\": \"650 Arlington Place\",\n      \"city\": \"Wheaton\",\n      \"state\": \"West Virginia\"\n    },\n    \"registered\": \"2015-01-28\",\n    \"tags\": [\n      \"cupidatat\",\n      \"ad\",\n      \"consequat\",\n      \"proident\",\n      \"ex\",\n      \"officia\",\n      \"adipisicing\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd88452ab36aa70f054\",\n    \"index\": 38,\n    \"guid\": \"4db3de26-08ae-40a0-9dc6-cd9aad7bdc25\",\n    \"isActive\": false,\n    \"balance\": \"$3,016.01\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 35,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Hooper Blair\",\n    \"gender\": \"male\",\n    \"company\": \"ANARCO\",\n    \"email\": \"hooperblair@anarco.com\",\n    \"phone\": \"+1 (877) 468-2384\",\n    \"address\": {\n      \"street\": \"535 Bancroft Place\",\n      \"city\": \"National\",\n      \"state\": \"Alaska\"\n    },\n    \"registered\": \"2015-02-24\",\n    \"tags\": [\n      \"non\",\n      \"laboris\",\n      \"aliqua\",\n      \"velit\",\n      \"officia\",\n      \"aliqua\",\n      \"in\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8fd30953315b376ce\",\n    \"index\": 39,\n    \"guid\": \"2537139a-70e6-438b-980f-a43ee251db50\",\n    \"isActive\": true,\n    \"balance\": \"$1,259.80\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 26,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Wilson Whitley\",\n    \"gender\": \"male\",\n    \"company\": \"BUNGA\",\n    \"email\": \"wilsonwhitley@bunga.com\",\n    \"phone\": \"+1 (881) 545-2408\",\n    \"address\": {\n      \"street\": \"536 Delevan Street\",\n      \"city\": \"Clara\",\n      \"state\": \"Oklahoma\"\n    },\n    \"registered\": \"2015-05-15\",\n    \"tags\": [\n      \"sunt\",\n      \"officia\",\n      \"officia\",\n      \"est\",\n      \"Lorem\",\n      \"elit\",\n      \"exercitation\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd88d9237233ce5a603\",\n    \"index\": 40,\n    \"guid\": \"407cc2cb-7eb0-4614-97d8-85a2b0ca2c55\",\n    \"isActive\": false,\n    \"balance\": \"$1,954.73\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 28,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Hilda Osborn\",\n    \"gender\": \"female\",\n    \"company\": \"SLOGANAUT\",\n    \"email\": \"hildaosborn@sloganaut.com\",\n    \"phone\": \"+1 (975) 466-3813\",\n    \"address\": {\n      \"street\": \"412 Tudor Terrace\",\n      \"city\": \"Brecon\",\n      \"state\": \"Federated States Of Micronesia\"\n    },\n    \"registered\": \"2016-06-23\",\n    \"tags\": [\n      \"anim\",\n      \"culpa\",\n      \"fugiat\",\n      \"minim\",\n      \"occaecat\",\n      \"sit\",\n      \"excepteur\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd839131d7d2e092514\",\n    \"index\": 41,\n    \"guid\": \"0eb0fb97-2de9-4815-a533-7ac084b94863\",\n    \"isActive\": false,\n    \"balance\": \"$2,347.37\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 29,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Denise Griffin\",\n    \"gender\": \"female\",\n    \"company\": \"ATOMICA\",\n    \"email\": \"denisegriffin@atomica.com\",\n    \"phone\": \"+1 (858) 538-2320\",\n    \"address\": {\n      \"street\": \"415 Catherine Street\",\n      \"city\": \"Onton\",\n      \"state\": \"Vermont\"\n    },\n    \"registered\": \"2014-06-17\",\n    \"tags\": [\n      \"qui\",\n      \"sunt\",\n      \"commodo\",\n      \"tempor\",\n      \"exercitation\",\n      \"nisi\",\n      \"exercitation\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd89974d5066113c5eb\",\n    \"index\": 42,\n    \"guid\": \"03ba8cb5-6ad5-47f9-a0f1-28939ade5983\",\n    \"isActive\": true,\n    \"balance\": \"$3,867.30\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 26,\n    \"eyeColor\": \"green\",\n    \"name\": \"Neal Castro\",\n    \"gender\": \"male\",\n    \"company\": \"OVATION\",\n    \"email\": \"nealcastro@ovation.com\",\n    \"phone\": \"+1 (967) 436-2454\",\n    \"address\": {\n      \"street\": \"119 Harrison Avenue\",\n      \"city\": \"Volta\",\n      \"state\": \"Idaho\"\n    },\n    \"registered\": \"2014-06-22\",\n    \"tags\": [\n      \"Lorem\",\n      \"cupidatat\",\n      \"et\",\n      \"quis\",\n      \"voluptate\",\n      \"incididunt\",\n      \"dolore\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd88d860c6070fafef1\",\n    \"index\": 43,\n    \"guid\": \"e14b2f74-0aaa-4218-940d-5f7fb2551151\",\n    \"isActive\": true,\n    \"balance\": \"$3,011.45\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 22,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Rich Montoya\",\n    \"gender\": \"male\",\n    \"company\": \"ORBAXTER\",\n    \"email\": \"richmontoya@orbaxter.com\",\n    \"phone\": \"+1 (866) 530-3039\",\n    \"address\": {\n      \"street\": \"134 Blake Court\",\n      \"city\": \"Kaka\",\n      \"state\": \"Arkansas\"\n    },\n    \"registered\": \"2016-06-21\",\n    \"tags\": [\n      \"sunt\",\n      \"cillum\",\n      \"enim\",\n      \"occaecat\",\n      \"minim\",\n      \"reprehenderit\",\n      \"nulla\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e093c420b70f6787\",\n    \"index\": 44,\n    \"guid\": \"1cabe364-180d-4147-88c7-2154241c22f2\",\n    \"isActive\": false,\n    \"balance\": \"$2,413.74\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 37,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Galloway Wilcox\",\n    \"gender\": \"male\",\n    \"company\": \"KENEGY\",\n    \"email\": \"gallowaywilcox@kenegy.com\",\n    \"phone\": \"+1 (806) 596-3339\",\n    \"address\": {\n      \"street\": \"131 Kay Court\",\n      \"city\": \"Bannock\",\n      \"state\": \"Ohio\"\n    },\n    \"registered\": \"2014-12-04\",\n    \"tags\": [\n      \"consequat\",\n      \"elit\",\n      \"in\",\n      \"mollit\",\n      \"nostrud\",\n      \"amet\",\n      \"irure\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8a07f64e3585adaa4\",\n    \"index\": 45,\n    \"guid\": \"9a0ba82c-3a59-4b8c-a735-16f57c4e5b7b\",\n    \"isActive\": true,\n    \"balance\": \"$1,419.98\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 25,\n    \"eyeColor\": \"green\",\n    \"name\": \"Estela Johnson\",\n    \"gender\": \"female\",\n    \"company\": \"LUNCHPOD\",\n    \"email\": \"estelajohnson@lunchpod.com\",\n    \"phone\": \"+1 (857) 457-3968\",\n    \"address\": {\n      \"street\": \"909 Cheever Place\",\n      \"city\": \"Clarence\",\n      \"state\": \"Missouri\"\n    },\n    \"registered\": \"2015-06-19\",\n    \"tags\": [\n      \"sint\",\n      \"velit\",\n      \"ut\",\n      \"minim\",\n      \"ad\",\n      \"proident\",\n      \"labore\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd863d1b1a4acb74988\",\n    \"index\": 46,\n    \"guid\": \"8154d3fc-2b77-4107-ab34-42bb23f470e6\",\n    \"isActive\": false,\n    \"balance\": \"$2,049.10\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 27,\n    \"eyeColor\": \"green\",\n    \"name\": \"Lorrie Huffman\",\n    \"gender\": \"female\",\n    \"company\": \"SPHERIX\",\n    \"email\": \"lorriehuffman@spherix.com\",\n    \"phone\": \"+1 (855) 535-2317\",\n    \"address\": {\n      \"street\": \"221 Essex Street\",\n      \"city\": \"Tedrow\",\n      \"state\": \"Washington\"\n    },\n    \"registered\": \"2016-09-27\",\n    \"tags\": [\n      \"consequat\",\n      \"excepteur\",\n      \"ipsum\",\n      \"ipsum\",\n      \"esse\",\n      \"cillum\",\n      \"qui\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e0a6bad7cf9ec1dc\",\n    \"index\": 47,\n    \"guid\": \"d44f213d-7164-4aba-b5e1-5e8646853e41\",\n    \"isActive\": true,\n    \"balance\": \"$1,958.21\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 37,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Celia Burnett\",\n    \"gender\": \"female\",\n    \"company\": \"ENORMO\",\n    \"email\": \"celiaburnett@enormo.com\",\n    \"phone\": \"+1 (834) 438-2214\",\n    \"address\": {\n      \"street\": \"315 Louisiana Avenue\",\n      \"city\": \"Wauhillau\",\n      \"state\": \"New Hampshire\"\n    },\n    \"registered\": \"2014-02-21\",\n    \"tags\": [\n      \"officia\",\n      \"cupidatat\",\n      \"ullamco\",\n      \"velit\",\n      \"ad\",\n      \"ea\",\n      \"nostrud\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e0617ebaf2a76998\",\n    \"index\": 48,\n    \"guid\": \"9d09a10a-6b16-44c5-bd72-20ee3188432c\",\n    \"isActive\": false,\n    \"balance\": \"$3,027.42\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 31,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Delaney Hamilton\",\n    \"gender\": \"male\",\n    \"company\": \"ACCUSAGE\",\n    \"email\": \"delaneyhamilton@accusage.com\",\n    \"phone\": \"+1 (862) 425-3630\",\n    \"address\": {\n      \"street\": \"407 Oceanview Avenue\",\n      \"city\": \"Waikele\",\n      \"state\": \"New Mexico\"\n    },\n    \"registered\": \"2014-07-06\",\n    \"tags\": [\n      \"aliquip\",\n      \"fugiat\",\n      \"cillum\",\n      \"id\",\n      \"excepteur\",\n      \"ad\",\n      \"non\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd831ecdff3ea6aba9e\",\n    \"index\": 49,\n    \"guid\": \"f5212db5-dfe2-426e-a4e0-83331831bbe8\",\n    \"isActive\": false,\n    \"balance\": \"$2,970.07\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"green\",\n    \"name\": \"Elma Baldwin\",\n    \"gender\": \"female\",\n    \"company\": \"XANIDE\",\n    \"email\": \"elmabaldwin@xanide.com\",\n    \"phone\": \"+1 (991) 445-3729\",\n    \"address\": {\n      \"street\": \"817 Loring Avenue\",\n      \"city\": \"Jenkinsville\",\n      \"state\": \"Virgin Islands\"\n    },\n    \"registered\": \"2015-03-13\",\n    \"tags\": [\n      \"aute\",\n      \"nisi\",\n      \"laborum\",\n      \"incididunt\",\n      \"non\",\n      \"eiusmod\",\n      \"ad\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd86e789f3db59cc997\",\n    \"index\": 50,\n    \"guid\": \"c24777cb-e9c6-451a-b70b-9ffeefb35ee0\",\n    \"isActive\": false,\n    \"balance\": \"$1,072.96\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 24,\n    \"eyeColor\": \"green\",\n    \"name\": \"Roxie Butler\",\n    \"gender\": \"female\",\n    \"company\": \"ISOLOGICA\",\n    \"email\": \"roxiebutler@isologica.com\",\n    \"phone\": \"+1 (919) 442-2920\",\n    \"address\": {\n      \"street\": \"512 Dewey Place\",\n      \"city\": \"Lacomb\",\n      \"state\": \"Montana\"\n    },\n    \"registered\": \"2015-05-26\",\n    \"tags\": [\n      \"qui\",\n      \"labore\",\n      \"non\",\n      \"quis\",\n      \"id\",\n      \"quis\",\n      \"anim\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd882f83000536be05a\",\n    \"index\": 51,\n    \"guid\": \"2798139e-b8ec-409e-aa87-613149059143\",\n    \"isActive\": false,\n    \"balance\": \"$3,771.00\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 38,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Margie Davenport\",\n    \"gender\": \"female\",\n    \"company\": \"MALATHION\",\n    \"email\": \"margiedavenport@malathion.com\",\n    \"phone\": \"+1 (976) 567-3933\",\n    \"address\": {\n      \"street\": \"241 Lloyd Court\",\n      \"city\": \"Stockwell\",\n      \"state\": \"Puerto Rico\"\n    },\n    \"registered\": \"2016-04-05\",\n    \"tags\": [\n      \"et\",\n      \"reprehenderit\",\n      \"dolor\",\n      \"consequat\",\n      \"sit\",\n      \"qui\",\n      \"mollit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8199466c0f80eaef0\",\n    \"index\": 52,\n    \"guid\": \"0d8ea36b-df98-4b07-952a-4cbac7c92c64\",\n    \"isActive\": false,\n    \"balance\": \"$2,047.61\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 31,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Zelma Macias\",\n    \"gender\": \"female\",\n    \"company\": \"ECLIPSENT\",\n    \"email\": \"zelmamacias@eclipsent.com\",\n    \"phone\": \"+1 (893) 522-3991\",\n    \"address\": {\n      \"street\": \"812 Morgan Avenue\",\n      \"city\": \"Moquino\",\n      \"state\": \"Minnesota\"\n    },\n    \"registered\": \"2014-03-14\",\n    \"tags\": [\n      \"quis\",\n      \"aliquip\",\n      \"occaecat\",\n      \"ut\",\n      \"duis\",\n      \"est\",\n      \"Lorem\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e332fa4683ed0ef2\",\n    \"index\": 53,\n    \"guid\": \"992c8935-6934-4b46-be34-bb81f596d0cc\",\n    \"isActive\": true,\n    \"balance\": \"$3,363.81\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 32,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Dominique Best\",\n    \"gender\": \"female\",\n    \"company\": \"SNOWPOKE\",\n    \"email\": \"dominiquebest@snowpoke.com\",\n    \"phone\": \"+1 (941) 596-2718\",\n    \"address\": {\n      \"street\": \"851 Turnbull Avenue\",\n      \"city\": \"Ruffin\",\n      \"state\": \"Wisconsin\"\n    },\n    \"registered\": \"2016-03-04\",\n    \"tags\": [\n      \"magna\",\n      \"velit\",\n      \"Lorem\",\n      \"culpa\",\n      \"mollit\",\n      \"adipisicing\",\n      \"eu\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8b65cc853f277c21a\",\n    \"index\": 54,\n    \"guid\": \"8f690f7b-cdc8-4c84-b928-44fe3e7bc4b4\",\n    \"isActive\": false,\n    \"balance\": \"$3,463.40\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Meyers Navarro\",\n    \"gender\": \"male\",\n    \"company\": \"VALREDA\",\n    \"email\": \"meyersnavarro@valreda.com\",\n    \"phone\": \"+1 (969) 596-2487\",\n    \"address\": {\n      \"street\": \"692 Lake Street\",\n      \"city\": \"Marienthal\",\n      \"state\": \"Guam\"\n    },\n    \"registered\": \"2015-06-22\",\n    \"tags\": [\n      \"mollit\",\n      \"laboris\",\n      \"deserunt\",\n      \"sit\",\n      \"excepteur\",\n      \"ut\",\n      \"ut\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd88d03578a7c15a598\",\n    \"index\": 55,\n    \"guid\": \"46cd7eac-1353-4bd2-99cc-2a9b5264a966\",\n    \"isActive\": false,\n    \"balance\": \"$1,911.65\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 24,\n    \"eyeColor\": \"green\",\n    \"name\": \"Holland Hess\",\n    \"gender\": \"male\",\n    \"company\": \"IDEALIS\",\n    \"email\": \"hollandhess@idealis.com\",\n    \"phone\": \"+1 (867) 599-2608\",\n    \"address\": {\n      \"street\": \"934 Stoddard Place\",\n      \"city\": \"Frizzleburg\",\n      \"state\": \"Nebraska\"\n    },\n    \"registered\": \"2015-02-19\",\n    \"tags\": [\n      \"dolor\",\n      \"sint\",\n      \"ipsum\",\n      \"ex\",\n      \"et\",\n      \"aute\",\n      \"elit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8a1f6180aec4821e5\",\n    \"index\": 56,\n    \"guid\": \"eb23120a-a47d-499d-a3a5-9a5cc0d40233\",\n    \"isActive\": true,\n    \"balance\": \"$3,547.64\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 25,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Mckay Fields\",\n    \"gender\": \"male\",\n    \"company\": \"SLAX\",\n    \"email\": \"mckayfields@slax.com\",\n    \"phone\": \"+1 (802) 483-2694\",\n    \"address\": {\n      \"street\": \"595 Jerome Street\",\n      \"city\": \"Oneida\",\n      \"state\": \"Utah\"\n    },\n    \"registered\": \"2014-11-18\",\n    \"tags\": [\n      \"reprehenderit\",\n      \"pariatur\",\n      \"aliquip\",\n      \"ullamco\",\n      \"veniam\",\n      \"labore\",\n      \"velit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8c473ecd605a3b6ca\",\n    \"index\": 57,\n    \"guid\": \"84c4fe9c-6917-49ce-a7a4-71ba9a7cba69\",\n    \"isActive\": true,\n    \"balance\": \"$1,731.31\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Melanie Austin\",\n    \"gender\": \"female\",\n    \"company\": \"ANDRYX\",\n    \"email\": \"melanieaustin@andryx.com\",\n    \"phone\": \"+1 (994) 412-2994\",\n    \"address\": {\n      \"street\": \"533 Saratoga Avenue\",\n      \"city\": \"Bangor\",\n      \"state\": \"Georgia\"\n    },\n    \"registered\": \"2014-03-09\",\n    \"tags\": [\n      \"mollit\",\n      \"minim\",\n      \"in\",\n      \"in\",\n      \"Lorem\",\n      \"magna\",\n      \"non\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd891a61ccfd176aeef\",\n    \"index\": 58,\n    \"guid\": \"80295d78-5ce6-4dfe-b945-50e2ce602b44\",\n    \"isActive\": true,\n    \"balance\": \"$2,992.55\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 25,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Peck Schneider\",\n    \"gender\": \"male\",\n    \"company\": \"COFINE\",\n    \"email\": \"peckschneider@cofine.com\",\n    \"phone\": \"+1 (913) 428-3201\",\n    \"address\": {\n      \"street\": \"441 Harbor Lane\",\n      \"city\": \"Tolu\",\n      \"state\": \"Pennsylvania\"\n    },\n    \"registered\": \"2016-05-29\",\n    \"tags\": [\n      \"Lorem\",\n      \"voluptate\",\n      \"ipsum\",\n      \"dolore\",\n      \"aliquip\",\n      \"ad\",\n      \"consequat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e58b17c583b460a7\",\n    \"index\": 59,\n    \"guid\": \"0b18fc0c-f18f-46e3-845a-cd7b15c55865\",\n    \"isActive\": false,\n    \"balance\": \"$1,502.40\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 23,\n    \"eyeColor\": \"green\",\n    \"name\": \"Mcclain Rhodes\",\n    \"gender\": \"male\",\n    \"company\": \"RODEOCEAN\",\n    \"email\": \"mcclainrhodes@rodeocean.com\",\n    \"phone\": \"+1 (842) 446-2464\",\n    \"address\": {\n      \"street\": \"374 Amersfort Place\",\n      \"city\": \"Romeville\",\n      \"state\": \"Maine\"\n    },\n    \"registered\": \"2014-03-19\",\n    \"tags\": [\n      \"dolor\",\n      \"eiusmod\",\n      \"ad\",\n      \"voluptate\",\n      \"ea\",\n      \"deserunt\",\n      \"et\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8724c03c5ad8e4a8e\",\n    \"index\": 60,\n    \"guid\": \"326dce0c-4b47-499b-9489-36acd6dadff8\",\n    \"isActive\": true,\n    \"balance\": \"$1,747.38\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 25,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Cervantes Bright\",\n    \"gender\": \"male\",\n    \"company\": \"VALPREAL\",\n    \"email\": \"cervantesbright@valpreal.com\",\n    \"phone\": \"+1 (873) 587-2025\",\n    \"address\": {\n      \"street\": \"132 Bliss Terrace\",\n      \"city\": \"Winesburg\",\n      \"state\": \"American Samoa\"\n    },\n    \"registered\": \"2016-03-18\",\n    \"tags\": [\n      \"magna\",\n      \"dolore\",\n      \"veniam\",\n      \"veniam\",\n      \"sint\",\n      \"quis\",\n      \"id\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8b398ed2934e4a722\",\n    \"index\": 61,\n    \"guid\": \"4b744dd7-3c86-4bce-a3c8-9eb4359ceed5\",\n    \"isActive\": false,\n    \"balance\": \"$3,697.92\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 34,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Hardin Pittman\",\n    \"gender\": \"male\",\n    \"company\": \"SKINSERVE\",\n    \"email\": \"hardinpittman@skinserve.com\",\n    \"phone\": \"+1 (887) 454-3837\",\n    \"address\": {\n      \"street\": \"617 Robert Street\",\n      \"city\": \"Stevens\",\n      \"state\": \"Oregon\"\n    },\n    \"registered\": \"2015-04-25\",\n    \"tags\": [\n      \"sit\",\n      \"anim\",\n      \"proident\",\n      \"minim\",\n      \"adipisicing\",\n      \"duis\",\n      \"cillum\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd89a9aa77a634b1a47\",\n    \"index\": 62,\n    \"guid\": \"971cfb58-9d8e-4a06-ab1c-c6bc120c1865\",\n    \"isActive\": false,\n    \"balance\": \"$1,121.41\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 35,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Anna Ortega\",\n    \"gender\": \"female\",\n    \"company\": \"PHUEL\",\n    \"email\": \"annaortega@phuel.com\",\n    \"phone\": \"+1 (887) 422-3308\",\n    \"address\": {\n      \"street\": \"809 Vandervoort Place\",\n      \"city\": \"Gibsonia\",\n      \"state\": \"Connecticut\"\n    },\n    \"registered\": \"2016-06-11\",\n    \"tags\": [\n      \"veniam\",\n      \"commodo\",\n      \"incididunt\",\n      \"commodo\",\n      \"ut\",\n      \"irure\",\n      \"aliqua\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8d4ea52c7b0fce734\",\n    \"index\": 63,\n    \"guid\": \"3e62c184-2c7d-4620-be08-4a10ac9f1bce\",\n    \"isActive\": true,\n    \"balance\": \"$3,080.98\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 37,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Juliana Rios\",\n    \"gender\": \"female\",\n    \"company\": \"FIREWAX\",\n    \"email\": \"julianarios@firewax.com\",\n    \"phone\": \"+1 (978) 409-2654\",\n    \"address\": {\n      \"street\": \"893 Heyward Street\",\n      \"city\": \"Fedora\",\n      \"state\": \"Mississippi\"\n    },\n    \"registered\": \"2015-07-21\",\n    \"tags\": [\n      \"sit\",\n      \"sint\",\n      \"eu\",\n      \"quis\",\n      \"do\",\n      \"mollit\",\n      \"magna\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8faa17dc8818830e9\",\n    \"index\": 64,\n    \"guid\": \"d3de53e8-6012-43ea-8c6b-1546739f9455\",\n    \"isActive\": true,\n    \"balance\": \"$3,162.09\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 24,\n    \"eyeColor\": \"green\",\n    \"name\": \"Allison Collier\",\n    \"gender\": \"male\",\n    \"company\": \"ISOLOGICS\",\n    \"email\": \"allisoncollier@isologics.com\",\n    \"phone\": \"+1 (961) 458-2654\",\n    \"address\": {\n      \"street\": \"987 Story Street\",\n      \"city\": \"Fairview\",\n      \"state\": \"Hawaii\"\n    },\n    \"registered\": \"2014-04-11\",\n    \"tags\": [\n      \"nulla\",\n      \"labore\",\n      \"anim\",\n      \"tempor\",\n      \"enim\",\n      \"aliqua\",\n      \"culpa\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8414f04a3dafce7ef\",\n    \"index\": 65,\n    \"guid\": \"d45fc8d9-2f09-42cf-918c-5d9c9b9049fb\",\n    \"isActive\": false,\n    \"balance\": \"$2,228.33\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 33,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Laurel Raymond\",\n    \"gender\": \"female\",\n    \"company\": \"FREAKIN\",\n    \"email\": \"laurelraymond@freakin.com\",\n    \"phone\": \"+1 (845) 411-2269\",\n    \"address\": {\n      \"street\": \"270 Alice Court\",\n      \"city\": \"Bynum\",\n      \"state\": \"Colorado\"\n    },\n    \"registered\": \"2014-09-18\",\n    \"tags\": [\n      \"sit\",\n      \"dolore\",\n      \"eiusmod\",\n      \"dolor\",\n      \"aliquip\",\n      \"est\",\n      \"reprehenderit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e744f8d49ef6d406\",\n    \"index\": 66,\n    \"guid\": \"8fd91938-f5a5-409d-8a97-bf4e683d76a1\",\n    \"isActive\": true,\n    \"balance\": \"$3,892.91\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 38,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Althea Horn\",\n    \"gender\": \"female\",\n    \"company\": \"FILODYNE\",\n    \"email\": \"altheahorn@filodyne.com\",\n    \"phone\": \"+1 (950) 526-2536\",\n    \"address\": {\n      \"street\": \"666 Taylor Street\",\n      \"city\": \"Driftwood\",\n      \"state\": \"North Dakota\"\n    },\n    \"registered\": \"2016-01-13\",\n    \"tags\": [\n      \"cillum\",\n      \"fugiat\",\n      \"incididunt\",\n      \"sunt\",\n      \"proident\",\n      \"et\",\n      \"amet\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd80d3bd026a5b14c3d\",\n    \"index\": 67,\n    \"guid\": \"4a617fa7-dc5a-440a-ab0b-13f6e6ad34fe\",\n    \"isActive\": false,\n    \"balance\": \"$1,371.59\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 22,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Potter Cannon\",\n    \"gender\": \"male\",\n    \"company\": \"MONDICIL\",\n    \"email\": \"pottercannon@mondicil.com\",\n    \"phone\": \"+1 (913) 431-3765\",\n    \"address\": {\n      \"street\": \"762 Drew Street\",\n      \"city\": \"Riceville\",\n      \"state\": \"Michigan\"\n    },\n    \"registered\": \"2015-08-31\",\n    \"tags\": [\n      \"velit\",\n      \"velit\",\n      \"ex\",\n      \"aliqua\",\n      \"consequat\",\n      \"esse\",\n      \"irure\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8218b984cbcc2fcee\",\n    \"index\": 68,\n    \"guid\": \"ebe26092-53b1-4fd9-b48f-37f68a7008b9\",\n    \"isActive\": true,\n    \"balance\": \"$2,799.55\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 23,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Alyson Calhoun\",\n    \"gender\": \"female\",\n    \"company\": \"ZEPITOPE\",\n    \"email\": \"alysoncalhoun@zepitope.com\",\n    \"phone\": \"+1 (820) 510-3098\",\n    \"address\": {\n      \"street\": \"804 Rodney Street\",\n      \"city\": \"Hatteras\",\n      \"state\": \"Virginia\"\n    },\n    \"registered\": \"2014-09-25\",\n    \"tags\": [\n      \"occaecat\",\n      \"officia\",\n      \"enim\",\n      \"eu\",\n      \"ullamco\",\n      \"eu\",\n      \"pariatur\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd88e11ec366ca17611\",\n    \"index\": 69,\n    \"guid\": \"2bb46e78-c42a-449c-93b2-204091ec8296\",\n    \"isActive\": false,\n    \"balance\": \"$3,754.62\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 27,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Zimmerman Hudson\",\n    \"gender\": \"male\",\n    \"company\": \"OVERPLEX\",\n    \"email\": \"zimmermanhudson@overplex.com\",\n    \"phone\": \"+1 (810) 589-3217\",\n    \"address\": {\n      \"street\": \"710 Lombardy Street\",\n      \"city\": \"Tampico\",\n      \"state\": \"New York\"\n    },\n    \"registered\": \"2015-12-05\",\n    \"tags\": [\n      \"aute\",\n      \"Lorem\",\n      \"magna\",\n      \"ut\",\n      \"esse\",\n      \"tempor\",\n      \"voluptate\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8c663c704beb3ba0f\",\n    \"index\": 70,\n    \"guid\": \"3fe808f0-0757-4862-93e1-033724b2d61e\",\n    \"isActive\": false,\n    \"balance\": \"$3,403.56\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 38,\n    \"eyeColor\": \"green\",\n    \"name\": \"Sharon Vargas\",\n    \"gender\": \"female\",\n    \"company\": \"SYNKGEN\",\n    \"email\": \"sharonvargas@synkgen.com\",\n    \"phone\": \"+1 (837) 452-3719\",\n    \"address\": {\n      \"street\": \"451 Eckford Street\",\n      \"city\": \"Wyano\",\n      \"state\": \"South Dakota\"\n    },\n    \"registered\": \"2015-11-19\",\n    \"tags\": [\n      \"consectetur\",\n      \"sint\",\n      \"ad\",\n      \"sunt\",\n      \"ea\",\n      \"velit\",\n      \"officia\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8c23f68e4099957d1\",\n    \"index\": 71,\n    \"guid\": \"79f80e61-d92e-4b97-bea7-0016fb3fbcdc\",\n    \"isActive\": false,\n    \"balance\": \"$1,738.35\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 22,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Herman House\",\n    \"gender\": \"male\",\n    \"company\": \"FRENEX\",\n    \"email\": \"hermanhouse@frenex.com\",\n    \"phone\": \"+1 (928) 579-3978\",\n    \"address\": {\n      \"street\": \"770 Wyckoff Avenue\",\n      \"city\": \"Trail\",\n      \"state\": \"Louisiana\"\n    },\n    \"registered\": \"2015-03-20\",\n    \"tags\": [\n      \"elit\",\n      \"voluptate\",\n      \"sint\",\n      \"laboris\",\n      \"et\",\n      \"nisi\",\n      \"ad\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8f684a162c8263ed1\",\n    \"index\": 72,\n    \"guid\": \"3a82a0ae-ffaa-4833-a4c1-1947eaf2a22a\",\n    \"isActive\": false,\n    \"balance\": \"$3,451.10\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 30,\n    \"eyeColor\": \"green\",\n    \"name\": \"Lenore Hahn\",\n    \"gender\": \"female\",\n    \"company\": \"EXOSIS\",\n    \"email\": \"lenorehahn@exosis.com\",\n    \"phone\": \"+1 (917) 524-3275\",\n    \"address\": {\n      \"street\": \"838 Gold Street\",\n      \"city\": \"Watchtower\",\n      \"state\": \"Rhode Island\"\n    },\n    \"registered\": \"2015-05-28\",\n    \"tags\": [\n      \"id\",\n      \"proident\",\n      \"velit\",\n      \"consequat\",\n      \"non\",\n      \"duis\",\n      \"consectetur\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8a220db71c82724b6\",\n    \"index\": 73,\n    \"guid\": \"3715858a-2b15-40b2-bd25-4c5f27f8a242\",\n    \"isActive\": false,\n    \"balance\": \"$2,007.02\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 40,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Mcfadden Stark\",\n    \"gender\": \"male\",\n    \"company\": \"GEEKOLA\",\n    \"email\": \"mcfaddenstark@geekola.com\",\n    \"phone\": \"+1 (996) 480-2189\",\n    \"address\": {\n      \"street\": \"422 Livonia Avenue\",\n      \"city\": \"Allendale\",\n      \"state\": \"Alabama\"\n    },\n    \"registered\": \"2016-06-04\",\n    \"tags\": [\n      \"qui\",\n      \"consequat\",\n      \"mollit\",\n      \"magna\",\n      \"Lorem\",\n      \"officia\",\n      \"reprehenderit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8ce39d98040920aca\",\n    \"index\": 74,\n    \"guid\": \"015bb1b1-90c7-47a7-8439-1382355e2198\",\n    \"isActive\": false,\n    \"balance\": \"$2,762.45\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Haney Schwartz\",\n    \"gender\": \"male\",\n    \"company\": \"GEOSTELE\",\n    \"email\": \"haneyschwartz@geostele.com\",\n    \"phone\": \"+1 (845) 531-2525\",\n    \"address\": {\n      \"street\": \"308 Poplar Avenue\",\n      \"city\": \"Wolcott\",\n      \"state\": \"Palau\"\n    },\n    \"registered\": \"2016-05-11\",\n    \"tags\": [\n      \"proident\",\n      \"enim\",\n      \"sunt\",\n      \"laborum\",\n      \"exercitation\",\n      \"dolore\",\n      \"cillum\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd890c774293d1b0fb4\",\n    \"index\": 75,\n    \"guid\": \"d073457d-da93-48aa-8c60-02d9d72ef8fb\",\n    \"isActive\": false,\n    \"balance\": \"$1,206.03\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 34,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Bobbie Livingston\",\n    \"gender\": \"female\",\n    \"company\": \"CORPULSE\",\n    \"email\": \"bobbielivingston@corpulse.com\",\n    \"phone\": \"+1 (836) 495-2861\",\n    \"address\": {\n      \"street\": \"655 Laurel Avenue\",\n      \"city\": \"Eastmont\",\n      \"state\": \"Indiana\"\n    },\n    \"registered\": \"2015-09-02\",\n    \"tags\": [\n      \"proident\",\n      \"laboris\",\n      \"ut\",\n      \"exercitation\",\n      \"labore\",\n      \"proident\",\n      \"adipisicing\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e27b869852bce881\",\n    \"index\": 76,\n    \"guid\": \"8f740d74-174c-4383-bf25-d97b57bae01d\",\n    \"isActive\": false,\n    \"balance\": \"$2,399.50\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 35,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Ball Talley\",\n    \"gender\": \"male\",\n    \"company\": \"GOKO\",\n    \"email\": \"balltalley@goko.com\",\n    \"phone\": \"+1 (994) 551-2840\",\n    \"address\": {\n      \"street\": \"271 Hanover Place\",\n      \"city\": \"Kipp\",\n      \"state\": \"Iowa\"\n    },\n    \"registered\": \"2016-04-07\",\n    \"tags\": [\n      \"nisi\",\n      \"consequat\",\n      \"labore\",\n      \"occaecat\",\n      \"magna\",\n      \"duis\",\n      \"ullamco\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8971d5bf7c2ba6a2e\",\n    \"index\": 77,\n    \"guid\": \"df18fc2c-8480-4396-93ea-4db26c228f7e\",\n    \"isActive\": true,\n    \"balance\": \"$3,772.45\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 20,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Tara Mcknight\",\n    \"gender\": \"female\",\n    \"company\": \"COMTENT\",\n    \"email\": \"taramcknight@comtent.com\",\n    \"phone\": \"+1 (932) 574-3393\",\n    \"address\": {\n      \"street\": \"619 Argyle Road\",\n      \"city\": \"Roulette\",\n      \"state\": \"Northern Mariana Islands\"\n    },\n    \"registered\": \"2015-11-21\",\n    \"tags\": [\n      \"reprehenderit\",\n      \"occaecat\",\n      \"culpa\",\n      \"anim\",\n      \"eiusmod\",\n      \"labore\",\n      \"fugiat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd890abec4d44010eea\",\n    \"index\": 78,\n    \"guid\": \"74ee47e9-0a58-4a57-80d9-98571e613ae0\",\n    \"isActive\": true,\n    \"balance\": \"$1,971.96\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 21,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Ebony Miller\",\n    \"gender\": \"female\",\n    \"company\": \"TETRATREX\",\n    \"email\": \"ebonymiller@tetratrex.com\",\n    \"phone\": \"+1 (953) 596-3683\",\n    \"address\": {\n      \"street\": \"451 Landis Court\",\n      \"city\": \"Elrama\",\n      \"state\": \"Tennessee\"\n    },\n    \"registered\": \"2015-05-06\",\n    \"tags\": [\n      \"reprehenderit\",\n      \"voluptate\",\n      \"ipsum\",\n      \"Lorem\",\n      \"ea\",\n      \"deserunt\",\n      \"duis\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e8a49916e0eef4a3\",\n    \"index\": 79,\n    \"guid\": \"1a5eb28e-ba61-4abf-95d1-cf69373ac673\",\n    \"isActive\": true,\n    \"balance\": \"$3,136.92\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 35,\n    \"eyeColor\": \"green\",\n    \"name\": \"Sexton James\",\n    \"gender\": \"male\",\n    \"company\": \"XLEEN\",\n    \"email\": \"sextonjames@xleen.com\",\n    \"phone\": \"+1 (886) 443-3743\",\n    \"address\": {\n      \"street\": \"565 Dobbin Street\",\n      \"city\": \"Hessville\",\n      \"state\": \"District Of Columbia\"\n    },\n    \"registered\": \"2016-03-23\",\n    \"tags\": [\n      \"ea\",\n      \"veniam\",\n      \"ut\",\n      \"aute\",\n      \"aliquip\",\n      \"ea\",\n      \"consectetur\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd89c8e57302ca806f7\",\n    \"index\": 80,\n    \"guid\": \"ad19546d-5b93-4dd0-a19f-53e4eb4d79aa\",\n    \"isActive\": true,\n    \"balance\": \"$2,174.53\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 40,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Barr Espinoza\",\n    \"gender\": \"male\",\n    \"company\": \"PETICULAR\",\n    \"email\": \"barrespinoza@peticular.com\",\n    \"phone\": \"+1 (863) 570-3563\",\n    \"address\": {\n      \"street\": \"492 Underhill Avenue\",\n      \"city\": \"Gratton\",\n      \"state\": \"Marshall Islands\"\n    },\n    \"registered\": \"2016-08-18\",\n    \"tags\": [\n      \"ullamco\",\n      \"cillum\",\n      \"ullamco\",\n      \"exercitation\",\n      \"irure\",\n      \"esse\",\n      \"aliquip\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd84211c7823bf419cf\",\n    \"index\": 81,\n    \"guid\": \"9c75ad58-fbf9-49c3-a3cc-ec0e747cbc2c\",\n    \"isActive\": true,\n    \"balance\": \"$2,401.76\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 29,\n    \"eyeColor\": \"green\",\n    \"name\": \"Christa Lawson\",\n    \"gender\": \"female\",\n    \"company\": \"ENTALITY\",\n    \"email\": \"christalawson@entality.com\",\n    \"phone\": \"+1 (887) 449-2183\",\n    \"address\": {\n      \"street\": \"625 Grafton Street\",\n      \"city\": \"Cresaptown\",\n      \"state\": \"Florida\"\n    },\n    \"registered\": \"2014-03-09\",\n    \"tags\": [\n      \"in\",\n      \"ea\",\n      \"elit\",\n      \"sit\",\n      \"elit\",\n      \"laboris\",\n      \"labore\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8deb2a837eee99361\",\n    \"index\": 82,\n    \"guid\": \"439349b3-b4e5-4e22-b074-d3d8d053986c\",\n    \"isActive\": true,\n    \"balance\": \"$3,718.44\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 38,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Carla Gray\",\n    \"gender\": \"female\",\n    \"company\": \"NETPLODE\",\n    \"email\": \"carlagray@netplode.com\",\n    \"phone\": \"+1 (831) 547-3290\",\n    \"address\": {\n      \"street\": \"129 Mill Street\",\n      \"city\": \"Austinburg\",\n      \"state\": \"Texas\"\n    },\n    \"registered\": \"2014-03-23\",\n    \"tags\": [\n      \"non\",\n      \"tempor\",\n      \"eu\",\n      \"ipsum\",\n      \"voluptate\",\n      \"exercitation\",\n      \"officia\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd846d6320f8ee38cd6\",\n    \"index\": 83,\n    \"guid\": \"ff535f76-d5ed-4d07-9e5d-1426a6a649f1\",\n    \"isActive\": true,\n    \"balance\": \"$2,427.75\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 23,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Aurora Banks\",\n    \"gender\": \"female\",\n    \"company\": \"BEDDER\",\n    \"email\": \"aurorabanks@bedder.com\",\n    \"phone\": \"+1 (936) 433-3077\",\n    \"address\": {\n      \"street\": \"498 Louis Place\",\n      \"city\": \"Canby\",\n      \"state\": \"South Carolina\"\n    },\n    \"registered\": \"2015-08-29\",\n    \"tags\": [\n      \"eu\",\n      \"mollit\",\n      \"et\",\n      \"mollit\",\n      \"laborum\",\n      \"incididunt\",\n      \"aute\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd893f2a82424d8f6ee\",\n    \"index\": 84,\n    \"guid\": \"8b007ae2-3474-4eff-bdad-17cd7c378867\",\n    \"isActive\": true,\n    \"balance\": \"$2,206.37\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 28,\n    \"eyeColor\": \"green\",\n    \"name\": \"Ruth Maxwell\",\n    \"gender\": \"female\",\n    \"company\": \"ZEAM\",\n    \"email\": \"ruthmaxwell@zeam.com\",\n    \"phone\": \"+1 (831) 492-3070\",\n    \"address\": {\n      \"street\": \"106 Utica Avenue\",\n      \"city\": \"Norfolk\",\n      \"state\": \"Nevada\"\n    },\n    \"registered\": \"2015-11-12\",\n    \"tags\": [\n      \"consectetur\",\n      \"aliqua\",\n      \"sit\",\n      \"magna\",\n      \"voluptate\",\n      \"esse\",\n      \"non\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8f8c3e6032c08eab0\",\n    \"index\": 85,\n    \"guid\": \"b9872ffe-a6dc-4525-ac91-75b356a43ac2\",\n    \"isActive\": false,\n    \"balance\": \"$1,234.70\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 20,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Mayer Edwards\",\n    \"gender\": \"male\",\n    \"company\": \"POWERNET\",\n    \"email\": \"mayeredwards@powernet.com\",\n    \"phone\": \"+1 (823) 411-3607\",\n    \"address\": {\n      \"street\": \"539 Jay Street\",\n      \"city\": \"Sena\",\n      \"state\": \"Delaware\"\n    },\n    \"registered\": \"2015-06-07\",\n    \"tags\": [\n      \"officia\",\n      \"occaecat\",\n      \"proident\",\n      \"Lorem\",\n      \"aute\",\n      \"et\",\n      \"sit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd886542a15d66dc2a6\",\n    \"index\": 86,\n    \"guid\": \"a959a4e6-7e0c-41a8-912c-c1280609f486\",\n    \"isActive\": true,\n    \"balance\": \"$1,686.52\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 23,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Caroline Bass\",\n    \"gender\": \"female\",\n    \"company\": \"ARTWORLDS\",\n    \"email\": \"carolinebass@artworlds.com\",\n    \"phone\": \"+1 (932) 419-2973\",\n    \"address\": {\n      \"street\": \"858 Pershing Loop\",\n      \"city\": \"Sidman\",\n      \"state\": \"Kansas\"\n    },\n    \"registered\": \"2015-04-24\",\n    \"tags\": [\n      \"ea\",\n      \"veniam\",\n      \"nulla\",\n      \"sint\",\n      \"proident\",\n      \"esse\",\n      \"nisi\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8f1adf135eb8b5d4f\",\n    \"index\": 87,\n    \"guid\": \"1ae041da-fddc-4df5-8485-aff3eacbdcf4\",\n    \"isActive\": false,\n    \"balance\": \"$2,991.87\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 27,\n    \"eyeColor\": \"green\",\n    \"name\": \"Walsh Mccarthy\",\n    \"gender\": \"male\",\n    \"company\": \"FARMAGE\",\n    \"email\": \"walshmccarthy@farmage.com\",\n    \"phone\": \"+1 (921) 500-3805\",\n    \"address\": {\n      \"street\": \"930 Banker Street\",\n      \"city\": \"Nicholson\",\n      \"state\": \"California\"\n    },\n    \"registered\": \"2014-10-18\",\n    \"tags\": [\n      \"laboris\",\n      \"ad\",\n      \"adipisicing\",\n      \"esse\",\n      \"sit\",\n      \"consequat\",\n      \"magna\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8e292916e52e972ec\",\n    \"index\": 88,\n    \"guid\": \"9207f1d2-870c-466e-a1ad-ed2b9af4ad65\",\n    \"isActive\": true,\n    \"balance\": \"$1,310.82\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 37,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Natalie Bond\",\n    \"gender\": \"female\",\n    \"company\": \"GYNKO\",\n    \"email\": \"nataliebond@gynko.com\",\n    \"phone\": \"+1 (908) 587-2856\",\n    \"address\": {\n      \"street\": \"698 Madoc Avenue\",\n      \"city\": \"Outlook\",\n      \"state\": \"New Jersey\"\n    },\n    \"registered\": \"2016-03-30\",\n    \"tags\": [\n      \"aute\",\n      \"magna\",\n      \"eiusmod\",\n      \"est\",\n      \"officia\",\n      \"adipisicing\",\n      \"amet\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8ff15e5092584605b\",\n    \"index\": 89,\n    \"guid\": \"1cf9890d-2d89-4a98-ac4c-488b47f33ec7\",\n    \"isActive\": false,\n    \"balance\": \"$1,664.41\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 32,\n    \"eyeColor\": \"green\",\n    \"name\": \"Watts Kramer\",\n    \"gender\": \"male\",\n    \"company\": \"MARKETOID\",\n    \"email\": \"wattskramer@marketoid.com\",\n    \"phone\": \"+1 (981) 572-3764\",\n    \"address\": {\n      \"street\": \"460 Caton Place\",\n      \"city\": \"Southmont\",\n      \"state\": \"Wyoming\"\n    },\n    \"registered\": \"2015-02-16\",\n    \"tags\": [\n      \"occaecat\",\n      \"sit\",\n      \"amet\",\n      \"non\",\n      \"sit\",\n      \"enim\",\n      \"ex\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd85d843de02021c7a4\",\n    \"index\": 90,\n    \"guid\": \"095bf361-65f5-42ae-aa51-1973d6ad6a2c\",\n    \"isActive\": true,\n    \"balance\": \"$1,981.37\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 20,\n    \"eyeColor\": \"green\",\n    \"name\": \"Iva Brady\",\n    \"gender\": \"female\",\n    \"company\": \"COMDOM\",\n    \"email\": \"ivabrady@comdom.com\",\n    \"phone\": \"+1 (942) 514-2261\",\n    \"address\": {\n      \"street\": \"525 Hoyts Lane\",\n      \"city\": \"Waterloo\",\n      \"state\": \"Massachusetts\"\n    },\n    \"registered\": \"2015-12-22\",\n    \"tags\": [\n      \"nisi\",\n      \"quis\",\n      \"adipisicing\",\n      \"et\",\n      \"quis\",\n      \"esse\",\n      \"consequat\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8bf5b4c18438c890c\",\n    \"index\": 91,\n    \"guid\": \"bfb1f645-a63e-4fc0-9a94-a208396e32f7\",\n    \"isActive\": true,\n    \"balance\": \"$2,694.33\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 39,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Estella Moses\",\n    \"gender\": \"female\",\n    \"company\": \"UNDERTAP\",\n    \"email\": \"estellamoses@undertap.com\",\n    \"phone\": \"+1 (999) 418-3031\",\n    \"address\": {\n      \"street\": \"127 Liberty Avenue\",\n      \"city\": \"Roy\",\n      \"state\": \"Kentucky\"\n    },\n    \"registered\": \"2014-08-10\",\n    \"tags\": [\n      \"ipsum\",\n      \"ea\",\n      \"eu\",\n      \"duis\",\n      \"enim\",\n      \"consequat\",\n      \"veniam\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd895135c80288cf57e\",\n    \"index\": 92,\n    \"guid\": \"6470c22d-0086-4acf-9fdf-7d1762a17e08\",\n    \"isActive\": true,\n    \"balance\": \"$3,995.47\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 40,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Anthony Knight\",\n    \"gender\": \"male\",\n    \"company\": \"EQUICOM\",\n    \"email\": \"anthonyknight@equicom.com\",\n    \"phone\": \"+1 (873) 569-3224\",\n    \"address\": {\n      \"street\": \"654 Greene Avenue\",\n      \"city\": \"Chamizal\",\n      \"state\": \"Arizona\"\n    },\n    \"registered\": \"2014-02-08\",\n    \"tags\": [\n      \"Lorem\",\n      \"duis\",\n      \"incididunt\",\n      \"nulla\",\n      \"Lorem\",\n      \"dolor\",\n      \"adipisicing\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8ca4056877bc2cb23\",\n    \"index\": 93,\n    \"guid\": \"fc8ea442-c629-42a1-87dd-c58609c0ebdb\",\n    \"isActive\": false,\n    \"balance\": \"$3,017.70\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 40,\n    \"eyeColor\": \"blue\",\n    \"name\": \"Russell Gilliam\",\n    \"gender\": \"male\",\n    \"company\": \"BLUEGRAIN\",\n    \"email\": \"russellgilliam@bluegrain.com\",\n    \"phone\": \"+1 (996) 465-2053\",\n    \"address\": {\n      \"street\": \"400 Columbia Place\",\n      \"city\": \"Summerset\",\n      \"state\": \"Maryland\"\n    },\n    \"registered\": \"2015-01-19\",\n    \"tags\": [\n      \"sit\",\n      \"eu\",\n      \"qui\",\n      \"Lorem\",\n      \"enim\",\n      \"aliquip\",\n      \"enim\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8723a1463115cbf16\",\n    \"index\": 94,\n    \"guid\": \"282ddfb3-7c52-4732-80a2-be8c436ee0c9\",\n    \"isActive\": true,\n    \"balance\": \"$1,448.23\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 35,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Mcmahon Reynolds\",\n    \"gender\": \"male\",\n    \"company\": \"PANZENT\",\n    \"email\": \"mcmahonreynolds@panzent.com\",\n    \"phone\": \"+1 (877) 512-2213\",\n    \"address\": {\n      \"street\": \"452 Kathleen Court\",\n      \"city\": \"Barronett\",\n      \"state\": \"Illinois\"\n    },\n    \"registered\": \"2015-04-03\",\n    \"tags\": [\n      \"qui\",\n      \"in\",\n      \"qui\",\n      \"laboris\",\n      \"et\",\n      \"nulla\",\n      \"id\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8d99535859969e271\",\n    \"index\": 95,\n    \"guid\": \"ac088fe2-019a-4fd7-bd8c-5d21eeb5e731\",\n    \"isActive\": false,\n    \"balance\": \"$2,204.60\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 20,\n    \"eyeColor\": \"green\",\n    \"name\": \"Rosa Myers\",\n    \"gender\": \"female\",\n    \"company\": \"LUNCHPAD\",\n    \"email\": \"rosamyers@lunchpad.com\",\n    \"phone\": \"+1 (847) 423-3501\",\n    \"address\": {\n      \"street\": \"913 Trucklemans Lane\",\n      \"city\": \"Lynn\",\n      \"state\": \"West Virginia\"\n    },\n    \"registered\": \"2016-06-10\",\n    \"tags\": [\n      \"veniam\",\n      \"consectetur\",\n      \"dolor\",\n      \"quis\",\n      \"anim\",\n      \"do\",\n      \"sit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd802b0ae83a4ed2495\",\n    \"index\": 96,\n    \"guid\": \"0507ff39-d0be-4f4d-afc0-01458a66d7a9\",\n    \"isActive\": true,\n    \"balance\": \"$3,655.93\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 28,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Angeline Schroeder\",\n    \"gender\": \"female\",\n    \"company\": \"ZORROMOP\",\n    \"email\": \"angelineschroeder@zorromop.com\",\n    \"phone\": \"+1 (852) 421-2895\",\n    \"address\": {\n      \"street\": \"195 Sumpter Street\",\n      \"city\": \"Washington\",\n      \"state\": \"Alaska\"\n    },\n    \"registered\": \"2015-05-21\",\n    \"tags\": [\n      \"dolor\",\n      \"dolor\",\n      \"nulla\",\n      \"id\",\n      \"mollit\",\n      \"eiusmod\",\n      \"ut\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd82e8295c9e6edee99\",\n    \"index\": 97,\n    \"guid\": \"322617dc-ac2f-4076-bec9-7539ec959ad2\",\n    \"isActive\": true,\n    \"balance\": \"$1,675.25\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 24,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Hall Atkinson\",\n    \"gender\": \"male\",\n    \"company\": \"UNIA\",\n    \"email\": \"hallatkinson@unia.com\",\n    \"phone\": \"+1 (847) 412-2997\",\n    \"address\": {\n      \"street\": \"864 Pierrepont Street\",\n      \"city\": \"Caroleen\",\n      \"state\": \"Oklahoma\"\n    },\n    \"registered\": \"2016-01-02\",\n    \"tags\": [\n      \"quis\",\n      \"id\",\n      \"quis\",\n      \"consequat\",\n      \"enim\",\n      \"esse\",\n      \"elit\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd8864bcc1330fa009c\",\n    \"index\": 98,\n    \"guid\": \"3c336f09-140a-423b-963d-e49a0864b214\",\n    \"isActive\": false,\n    \"balance\": \"$2,141.56\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 28,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Paulette Sellers\",\n    \"gender\": \"female\",\n    \"company\": \"ARCTIQ\",\n    \"email\": \"paulettesellers@arctiq.com\",\n    \"phone\": \"+1 (937) 462-3359\",\n    \"address\": {\n      \"street\": \"130 Ovington Court\",\n      \"city\": \"Diaperville\",\n      \"state\": \"Federated States Of Micronesia\"\n    },\n    \"registered\": \"2014-10-28\",\n    \"tags\": [\n      \"aliqua\",\n      \"occaecat\",\n      \"ut\",\n      \"dolor\",\n      \"dolor\",\n      \"irure\",\n      \"pariatur\"\n    ]\n  },\n  {\n    \"_id\": \"57ef9cd88bbbbcdd7e59618f\",\n    \"index\": 99,\n    \"guid\": \"6854d791-09f7-46c2-b66c-bcc0ba82d654\",\n    \"isActive\": true,\n    \"balance\": \"$1,683.05\",\n    \"picture\": \"http://placehold.it/32x32\",\n    \"age\": 31,\n    \"eyeColor\": \"brown\",\n    \"name\": \"Key Black\",\n    \"gender\": \"male\",\n    \"company\": \"MAINELAND\",\n    \"email\": \"keyblack@maineland.com\",\n    \"phone\": \"+1 (920) 536-2044\",\n    \"address\": {\n      \"street\": \"326 Melrose Street\",\n      \"city\": \"Denio\",\n      \"state\": \"Vermont\"\n    },\n    \"registered\": \"2016-08-06\",\n    \"tags\": [\n      \"tempor\",\n      \"enim\",\n      \"elit\",\n      \"cupidatat\",\n      \"ipsum\",\n      \"ipsum\",\n      \"in\"\n    ]\n  }\n]\n"
  },
  {
    "path": "docs/.vuepress/config.js",
    "content": "module.exports = {\n  title: 'VueJs Smart Table',\n  base: '/vuejs-smart-table/',\n  description: 'Simple yet powerful Data Table for Vue',\n  configurewebpack: {\n    resolve: {\n      alias: {\n        'vue-smart-table': '../../src'\n      }\n    }\n  },\n  themeConfig: {\n    repo: 'tochoromero/vuejs-smart-table',\n    docsDir: 'docs',\n    editLinks: true,\n    sidebarDepth: 1,\n    sidebar: [\n      '/',\n      'the-basics/',\n      'filtering/',\n      'sorting/',\n      'pagination/',\n      'selection/'\n    ]\n  }\n}\n"
  },
  {
    "path": "docs/README.md",
    "content": "# Introduction\n\nVue Smart Table was created out of the need for a simple highly customizable data table plugin \nthat could take advantage of Vue's slots. It has no dependencies but Vue and because it \nrenders as a standard HTML table it is compatible with CSS Frameworks such as Bootstrap and Foundation.\n\nOut of the box you will get filtering, column sorting, client side pagination and row selection.\n\n## Installation\nTo install simply run\n```\nnpm add vuejs-smart-table\n```\nor\n```\nyarn add vuejs-smart-table\n```\n\nThen in your `main.js`\n```js\nimport SmartTable from 'vuejs-smart-table'\n\nVue.use(SmartTable)\n```\nThis will globally register four Components: `v-table`, `v-th`, `v-tr` and `smart-pagination`\n"
  },
  {
    "path": "docs/filtering/README.md",
    "content": "# Filtering\nSmart Table is only on charge of the actual row filtering based on the provided configuration. \nThe visual aspect of it are in your control, allowing you to use any UI Elements to interact while it frees you\nfrom the actual filtering computation.\n\n## Filters <Badge text=\"Property\"/> <Badge text=\"filters: Object\"/>\nTo enable filtering you need to provide the `filters` property on the `v-table` component.\n\nThe `filters` configuration object has the following form:\n\n```js\n{\n  name: {value: '', keys: ['name']}\n}\n```\n\nThe entry Key is just for you, so you can reference any of the filters by its name. \nIt is the entry Value Object what Smart Table will use to perform the filtering.\n\n### value <Badge text=\"String\" type=\"success\"/>\nThis String is the value of the filter, you would normally bind it to the `v-model` of an input element. As you type,\nthe rows will be filtered.\n\nKeep in mind that an empty `value` means there is no filter.\n\n### keys <Badge text=\"Array\" type=\"success\"/>\nThis is an Array of Strings indicating what fields of each row the filter `value` will apply to.\n\nYou must provide at least one key. If more than one key is provided as long as one of the row fields matches the filter,\nthe row will be displayed.\n\n#### Example\n```js\nimport users from './users.json'\n\nexport default {\n  name: 'BasicFiltering',\n  data: () => ({\n    users,\n    filters: {\n      name: { value: '', keys: ['name'] }\n    }\n  })\n}\n```\n\n```html\n<template>\n    <div>\n      <label>Filter by Name:</label>\n      <input class=\"form-control\" v-model=\"filters.name.value\"/>\n    \n      <v-table\n        :data=\"users\"\n        :filters=\"filters\"\n      >\n        <thead slot=\"head\">\n        <th>Name</th>\n        <th>Age</th>\n        <th>Email</th>\n        <th>Address</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <tr v-for=\"row in displayData\" :key=\"row.guid\">\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.email }}</td>\n          <td>\n              {{ row.address.street }}, \n              {{ row.address.city }} \n              {{ row.address.state}}\n          </td>\n        </tr>\n        </tbody>\n      </v-table>\n    </div>\n</template>\n```\n\n<BasicFiltering/>\n\n## Custom Filters\nYou also have the option to provide a custom filter for more complex situations. \nA Custom Filter is a function with two arguments: `filterValue` and `row`.\nIt should return `true` if the row should be displayed and `false` otherwise.\n\n### custom <Badge text=\"Function\" type=\"success\"/>\nTo use a custom filter provide the filtering function on the `custom` property on the filter configuration object:\n\n### value <Badge text=\"Any\" type=\"success\"/>\nWith custom filtering the `value` property is not limited to Strings, you can provide anything as the `value`, \nit will just get passed along to your custom function.\n\n#### Example\n```js\n<script>\nimport users from './users.json'\n\nexport default {\n  name: 'CustomFiltering',\n  data () {\n    return {\n      users,\n      filters: {\n        age: { value: { min: 21, max: 22 }, custom: this.ageFilter }\n      }\n    }\n  },\n  methods: {\n    ageFilter (filterValue, row) {\n      return row.age >= filterValue.min && row.age <= filterValue.max\n    }\n  }\n}\n</script>\n```\n\n```html\n<template>\n    <div>\n      <label>Min Age:</label>\n    \n      <InputSpinner\n        v-model=\"filters.age.value.min\"\n        :min=\"0\"\n        :max=\"filters.age.value.max\"\n      />\n    \n      <label>Max Age:</label>\n      <InputSpinner\n        v-model=\"filters.age.value.max\"\n        :min=\"filters.age.value.min\"\n        :max=\"99\"\n      />\n    \n      <v-table\n        :data=\"users\"\n        :filters=\"filters\"\n      >\n        <thead slot=\"head\">\n        <th>Name</th>\n        <th>Age</th>\n        <th>Email</th>\n        <th>Address</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <tr v-for=\"row in displayData\" :key=\"row.guid\">\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.email }}</td>\n          <td>\n            {{ row.address.street }},\n            {{ row.address.city }}\n            {{ row.address.state}}\n          </td>\n        </tr>\n        </tbody>\n      </v-table>\n    </div>\n</template>\n```\n::: tip\nPlease think of the `InputSpinner` as a fancy `Input` with validation. The important bit is its `v-model`.\n:::\n\n<CustomFiltering/>\n"
  },
  {
    "path": "docs/pagination/README.md",
    "content": "# Pagination\n\nVue Smart Table supports client side pagination. \nTo enable it, you need to provide the `pageSize` and `currentPage` properties on the `v-table` Component.\n\n## Page Size  <Badge text=\"Property\"/> <Badge text=\"pageSize: Number\"/>\nThe `pageSize` property specify the amount of items each page should contain. \nIf this property is present, client side pagination will be enabled.\n\n## Current Page <Badge text=\"Property\"/> <Badge text=\"currentPage: Number\"/>  <Badge text=\"Sync\"/>\nThe `currentPage` property indicates the current active page. \nThis property should be bound with a `sync` modifier, since the `v-table` itself \nmay update its value, e.g. if a new filter is applied and the amount of available items decreases \nso the current active page is no longer valid.\n::: tip\nThe `currentPage` property index starts at `1`, \nthis is to avoid confusion since visually the page links start at `1` not `0`.\n:::\n\n## Total pages  <Badge text=\"Event\"/> <Badge text=\"totalPagesChanged: Number\"/>\nThe total amount of pages is calculated using the Total Items and the Page Size. \nAs the Total Items changes the Total Pages will also change and a `totalPagesChanged` event \nwill be emitted with the new amount as its payload.\n\n## Total Items  <Badge text=\"Event\"/> <Badge text=\"totalItemsChanged: Number\"/>\nThe total amount of items changes as the Filters change. When it changes `v-table` will emit a `totalItemsChanged` Event.\nThis event will also be emitted when the `v-table` mounts so it will have the right amount from the start.\n\n## Pagination Controls\nThe pagination controls are handled outside of `v-table`, you can use whatever you want to control it, but we provide\na `SmartPagination` component so you can have it working out of the box.\n\nThe component requires the following properties:\n\n### Current Page <Badge text=\"Property\"/> <Badge text=\"currentPage: Number\"/>  <Badge text=\"Sync\"/>\nThis should be the same `currentPage` property used for the `v-table` component \nand it should also use the `sync` modifier, that way whenever either of them changes it the other one will be notified.\n\n### Total Pages <Badge text=\"Property\"/> <Badge text=\"totalPages: Number\"/>\nThe `v-table` component emits a `totalPagesChanged` event, when the event happens we should save the event payload and\nuse it for the `totalPages` property on the `SmartPagination` component.\n\n## Example\n```html\n<template>\n    <div>\n      <v-table\n        :data=\"users\"\n        :currentPage.sync=\"currentPage\"\n        :pageSize=\"5\"\n        @totalPagesChanged=\"totalPages = $event\"\n      >\n        <thead slot=\"head\">\n          <th>Name</th>\n          <th>Age</th>\n          <th>State</th>\n          <th>Registered</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <tr v-for=\"row in displayData\" :key=\"row.guid\">\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.address.state }}</td>\n          <td>{{ row.registered }}</td>\n        </tr>\n        </tbody>\n      </v-table>\n    \n      <smart-pagination\n        :currentPage.sync=\"currentPage\"\n        :totalPages=\"totalPages\"\n      />\n    </div>\n</template>\n```\n\n```js\n<script>\nimport users from './users.json'\n\nexport default {\n  name: 'Pagination',\n  data: () => ({\n    users,\n    currentPage: 1,\n    totalPages: 0\n  })\n}\n</script>\n```\n<Pagination/>\n\n## Customizing Smart Pagination\nBesides the `currentPage` and `totalPages` properties, there are many others used to configure the behaviour and look\nand feel of the pagination controls.\n\n### Hide Single Page <Badge text=\"Property\"/> <Badge text=\"hideSinglePage: Boolean\"/> <Badge text=\"default: true\"/>\nDetermines whether or not we show the pagination controls when there is only a single page.\n\n### Max Page Links <Badge text=\"Property\"/> <Badge text=\"maxPageLinks: Number\"/>\nBy default we will show every single page link, but you can use the `maxPageLinks` property to limit the amount of visible links.\n\n### Boundary Links <Badge text=\"Property\"/> <Badge text=\"boundaryLinks: Boolean\"/> <Badge text=\"default: false\"/>\nDetermines whether or not we should show two links to navigate to the First and Last page.\n\n### First Text <Badge text=\"Property\"/> <Badge text=\"firstText: String\"/> <Badge text=\"default: First\"/>\nSpecify the text for the First Page link.\n\n### Last Text <Badge text=\"Property\"/> <Badge text=\"lastText: String\"/> <Badge text=\"default: Last\"/>\nSpecify the text for the Last Page link.\n\n### Direction Links <Badge text=\"Property\"/> <Badge text=\"hideSinglePage: Boolean\"/> <Badge text=\"default: true\"/>\nDetermines whether or not we should have direction links to navigate back and forth between pages.\n\n### CSS Customization\nThe HTML structure for the Smart Pagination component is as follows:\n```html\n<nav class=\"smart-pagination\">\n    <ul class=\"pagination\">\n       <li class=\"page-item\">\n         <a class=\"page-link\">1</a>\n         <a class=\"page-link\">2</a>\n         <a class=\"page-link\">3</a>\n       </li>\n    </ul>\n</nav>\n```\nThis structure is compatible with Bootstrap's Pagination. But you can easily customize it with your own Styles.\n"
  },
  {
    "path": "docs/selection/README.md",
    "content": "# Row Selection\n\n## Table Row <Badge text=\"Component\"/> <Badge text=\"v-tr\"/>\nTo enable row selection you need to use the `v-tr` component. It only has one property: `row`\n\n### Row <Badge text=\"Property\"/> <Badge text=\"row: Object\"/> <Badge text=\"Required\"/>\nYou must provide the `row` property with the current Object for the row.\n\n## Selection Options\nYou can configure the Selection Mode and the Selected Class in the `v-table` component.\n\n### Selection Mode <Badge text=\"Property\"/> <Badge text=\"selectionMode: String\"/> <Badge text=\"default: single\"/>\nBy default the selection mode is `single`, meaning only one row at a time can be selected.\nYou can use the `selectionMode` property in the `v-table` component to set it to `multiple`, so multiple rows\ncan be selected.\n\n### Selected Class <Badge text=\"Property\"/> <Badge text=\"selectedClass: String\"/> <Badge text=\"default: vt-selected\"/>\nWhen a row is selected a class is added to the `tr` element, by default it is `vt-selected` byt you can change it to\nsomething else with the `selectedClass` property in the `v-table` component.\n\n## Selection Changed <Badge text=\"Event\"/> <Badge text=\"selectionChanged: Array\"/>\nWhen the selected items changes the `v-table` component will emit a `selectionChanged` event with the\nlist of selected items as its payload.\n\n## Example\n\n```html\n<template>\n    <div>\n      <v-table\n        class=\"table-hover\"\n        :data=\"users\"\n        selectionMode=\"multiple\"\n        selectedClass=\"table-info\"\n        @selectionChanged=\"selectedRows = $event\"\n      >\n        <thead slot=\"head\">\n        <th>Name</th>\n        <th>Age</th>\n        <th>State</th>\n        <th>Registered</th>\n        </thead>\n        <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <v-tr\n          v-for=\"row in displayData\"\n          :key=\"row.guid\"\n          :row=\"row\"\n        >\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.address.state }}</td>\n          <td>{{ row.registered }}</td>\n        </v-tr>\n        </tbody>\n      </v-table>\n    \n      <strong>Selected:</strong>\n      <div v-if=\"selectedRows.length === 0\" class=\"text-muted\">No Rows Selected</div>\n      <ul>\n        <li v-for=\"selected in selectedRows\">\n          {{ selected.name }}\n        </li>\n      </ul>\n    </div>\n</template>\n```\n\n```js\n<script>\n  import users from './users.json'\n\n  export default {\n    name: 'Selection',\n    data: () => ({\n      users,\n      selectedRows: []\n    })\n  }\n</script>\n```\n<Selection/>\n"
  },
  {
    "path": "docs/sorting/README.md",
    "content": "# Sorting\n\nTo enable column sorting, instead of using vanilla `th` elements we will use `v-th` Components for the columns\nthat will allow sorting.\n\n## Table Header <Badge text=\"Component\"/> <Badge text=\"v-th\"/>\nThe `v-th` component renders to a regular `th` element but it allows you to sort the table, it has three properties:\n`sortKey`, `customSort` and `defaultSort`.\n\n### Sort Key <Badge text=\"Propery\"/> <Badge text=\"sortKey: String | Function\"/>\nThe `sortKey` property is used to get the Row value we will sort by it can either be a `String` or a `Function`.\n\n#### String\nAs a `String`, it represents the path to the property in the Row we want to sort. You can even use nested paths.\n```html\n<thead slot=\"head\">\n    <v-th sortKey=\"name\">Name</v-th>\n    <v-th sortKey=\"address.state\">State</v-th>\n</thead>\n```\n\n#### Function\nIf you instead pass a `Function`, we will call it with the current `row` as a parameter and expect to get back\nthe value used for sorting.\n```html\n<thead slot=\"head\">\n    <v-th :sortKey=\"nameLength\">Name</v-th>\n</thead>\n```\n\n```js\nmethods: {\n  nameLength (row) {\n    return `row.name.length`\n  }\n}\n```\n\nOnce we have used the `key` property to get the column values, we will compare them. \nIf the values are number we will just compare them by subtraction.\nOtherwise we will call `toString()` on them and compare them with `localCompare`.\n\n### Custom Sort <Badge text=\"Property\"/> <Badge text=\"customSort: Function\"/>\nIn some cases you need more control over sorting, \nfor instance if you have a complex object or your sorting depends in two or more values. \nFor those instances instead of providing a `key` property you can use the `custom` property to provide a sorting function.\n\nThe function will receive the 2 rows being compared and a third parameter with the sort order \nwhere `1` represents ascending and `-1` represents descending.\nThe function needs to return `1` if the first row is greater, `-1` if the second row is greater \nor `0` if they are the same.\n\n```html\n<thead slot=\"head\">\n    <v-th :customSort=\"dateSort\">Registered</v-th>\n</thead>\n```\n\n```js\nmethods: {\n  dateSort(a, b) {\n    let date1 = new Date(a.registered).getTime();\n    let date2 = new Date(b.registered).getTime();\n    \n    return date1 - date2;\n  }\n}\n```\n\n### Default Sort <Badge text=\"Property\"/> <Badge text=\"defaultSort: String\"/>\nYou should provide this for the one column you want the table to be sorted by default. \nThe possible values are: `asc` for ascending ordering and `desc` for descending order.\n\n```html\n<thead slot=\"head\">\n    <v-th sortKey=\"name\" defaultSort=\"desc\">Name</v-th>\n</thead>\n```\n\n### Example\n```html\n<template>\n  <v-table\n    :data=\"users\"\n  >\n    <thead slot=\"head\">\n      <v-th :sortKey=\"nameLength\" defaultSort=\"desc\">Name</v-th>\n      <v-th sortKey=\"age\">Age</v-th>\n      <v-th sortKey=\"address.state\">State</v-th>\n      <v-th :customSort=\"dateSort\">Registered</v-th>\n    </thead>\n    <tbody slot=\"body\" slot-scope=\"{displayData}\">\n      <tr v-for=\"row in displayData\" :key=\"row.guid\">\n        <td>{{ row.name }}</td>\n        <td>{{ row.age }}</td>\n        <td>{{ row.address.state }}</td>\n        <td>{{ row.registered }}</td>\n      </tr>\n    </tbody>\n  </v-table>\n</template>\n```\n\n```js\n<script>\nimport users from './users.json'\n\nexport default {\n  name: 'Sorting',\n  data: () => ({\n    users\n  }),\n  methods: {\n    nameLength (row) {\n      return row.name.length\n    },\n    dateSort(a, b) {\n      let date1 = new Date(a.registered).getTime();\n      let date2 = new Date(b.registered).getTime();\n      \n      return date1 - date2;\n    }\n  }\n}\n</script>\n```\n\n<Sorting/>\n\n## CSS icons\nBy default we include three SVG icons to indicate the sorting state of a column. \nBut you can use CSS Styles to change the sort icons.\n\nThe first thing you need to do is to disable the default sort icons with the `hideSortIcons` property on the `v-table` component:\n\n```html\n<v-table\n    :data=\"users\"\n    :hideSortIcons=\"true\"\n>\n...\n</v-table>\n```\n\nThen you will get 4 CSS classes for `th` elements with sorting enabled:\n\n* `vt-sort`: This class is always present, its purpose is to provide a constant CSS class for the columns with sorting.\n* `vt-sortable`: This class indicates the column can be sorted and it is present when the column is not currently sorted.\n* `vt-asc`: This class indicates the column is being sorted by an ascending order.\n* `vt-desc`: This class indicates the column is being sorted by a descending order.\n\nFor this example we will use FontAwesome icons:\n\n```css\n.vt-sort:before{\n    font-family: FontAwesome;\n    padding-right: 0.5em;\n    width: 1.28571429em;\n    display: inline-block;\n    text-align: center;\n}\n\n.vt-sortable:before{\n    content: \"\\f0dc\";\n}\n\n.vt-asc:before{\n    content: \"\\f160\";\n}\n\n.vt-desc:before{\n    content: \"\\f161\";\n}\n```\n\n<SortingFA/>\n"
  },
  {
    "path": "docs/the-basics/README.md",
    "content": "# The Basics\n\nThe main goal for Vue Smart Table is to be intuitive to use while offering powerful features out of the box.\n \nTo achieve this we mix Vue Components and vanilla HTML Elements with the output being the same as a traditional HTML Table.\nThis will allow you to easily customize your tables with CSS or with a framework such as Bootstrap or Foundation.\n\nFor our examples we decided to use Bootstrap and Font Awesome, but you can use whatever your heart desires.\n\nHere is the code for the simplest table you can create:\n\n```js\n<script>\nimport users from './users.json'\n\nexport default {\n  name: 'TheBasics',\n  data: () => ({\n    users\n  })\n}\n</script>\n\n```\n\n```html\n<template>\n  <v-table :data=\"users\">\n    <thead slot=\"head\">\n        <th>Name</th>\n        <th>Age</th>\n        <th>Email</th>\n        <th>Address</th>\n    </thead>\n    <tbody slot=\"body\" slot-scope=\"{displayData}\">\n        <tr v-for=\"row in displayData\" :key=\"row.id\">\n          <td>{{ row.name }}</td>\n          <td>{{ row.age }}</td>\n          <td>{{ row.email }}</td>\n          <td>\n              {{ row.address.street }}, \n              {{ row.address.city }} \n              {{ row.address.state}}\n          </td>\n        </tr>\n    </tbody>\n  </v-table>\n</template>\n```\n\n<TheBasics/>\n\n## Table <Badge text=\"Component\" type=\"success\"/> <Badge text=\"v-table\"/>\n\nThe `v-table` component is the main element of Smart Table, here you will provide most of the configuration and listen for events. \nBut for now we will just focus on the `data` attribute.\n\n### Data <Badge text=\"Property\" type=\"success\"/> <Badge text=\"data: Array\"/>\nEach `v-table` requires a `data` property, it must be an `array` even if it is initially empty.\nEach entry in the array represents a row in the table.\n\nIt is important to note the array will not be mutated by Smart Table, internally it will create a shallow copy of it to perform\nthe operations.\n\n## Head <Badge text=\"Slot\" type=\"success\"/> <Badge text=\"head\"/>\nThe `head` slot is for the table `thead`, other than specifying the slot name with `slot=\"head\"` there is nothing special about this.\nYou just need to provide vanilla `th` elements for each of your columns.\n```html\n<thead slot=\"head\">\n    <th>Name</th>\n    <th>Age</th>\n    ...\n</thead>\n```\n\n## Body <Badge text=\"Scoped Slot\" type=\"success\"/> <Badge text=\"body\"/>\nThe `body` slot is for the table `tbody`. This is a scoped slot which provides a `displayData` property.\n\n### Display Data <Badge text=\"Slot Scope\"/> <Badge text=\"displayData: array\" type=\"success\"/>\nThe `display-data` property provided by the `body` scoped slot is a shallow copy of the `data` array provided to the `v-table` component.\n\nThis array has all the plugins applied to it, for example, if filtering is enabled, this array will only contain the rows that pass the filters.\n\nYou will want to use a `v-for` directive to render the `tr` elements, remember, each entry in the `display-data` array represents a row.\n\n```html\n<tbody slot=\"body\" slot-scope=\"{displayData}\">\n    <tr v-for=\"row in displayData\" :key=\"row.id\">\n      <td>{{ row.name }}</td>\n      <td>{{ row.age }}</td>\n      ...\n    </tr>\n</tbody>\n```\n\nAll right, this is the simplest table you can create, but right now Smart Table is effectively doing nothing you might as well just use a vanilla Html Table. \n\nKeep browsing to discover how powerful Smart Table is out of the box.\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"vuejs-smart-table\",\n  \"keywords\": [\n    \"vue\",\n    \"table\",\n    \"grid\",\n    \"datagrid\"\n  ],\n  \"version\": \"0.0.8\",\n  \"private\": false,\n  \"main\": \"src/main.js\",\n  \"author\": \"Hector Romero Granillo\",\n  \"repository\": \"https://github.com/tochoromero/vuejs-smart-table\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"vue-cli-service build --target lib --name smart-table src/main.js\",\n    \"lint\": \"vue-cli-service lint\",\n    \"test:unit\": \"vue-cli-service test:unit --reporter mocha-junit-reporter --reporter-options mochaFile=./tests/results/test_results.xml\",\n    \"docs:dev\": \"vuepress dev docs\",\n    \"docs:build\": \"vuepress build docs\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.5.17\"\n  },\n  \"devDependencies\": {\n    \"@fortawesome/fontawesome-free\": \"^5.6.3\",\n    \"@vue/cli-plugin-babel\": \"^3.1.1\",\n    \"@vue/cli-plugin-eslint\": \"^3.1.5\",\n    \"@vue/cli-plugin-unit-mocha\": \"^3.1.1\",\n    \"@vue/cli-service\": \"^3.1.4\",\n    \"@vue/eslint-config-standard\": \"^4.0.0\",\n    \"@vue/test-utils\": \"^1.0.0-beta.20\",\n    \"babel-eslint\": \"^10.0.1\",\n    \"bootstrap\": \"^4.2.1\",\n    \"chai\": \"^4.1.2\",\n    \"eslint\": \"^5.8.0\",\n    \"eslint-plugin-vue\": \"^5.0.0-0\",\n    \"lint-staged\": \"^7.2.2\",\n    \"mocha-junit-reporter\": \"^1.18.0\",\n    \"sass\": \"^1.30.0\",\n    \"sass-loader\": \"^10.1.0\",\n    \"vue-template-compiler\": \"^2.5.17\",\n    \"vuepress\": \"^0.14.8\"\n  },\n  \"gitHooks\": {\n    \"pre-commit\": \"lint-staged\"\n  },\n  \"lint-staged\": {\n    \"*.js\": [\n      \"vue-cli-service lint\",\n      \"git add\"\n    ],\n    \"*.vue\": [\n      \"vue-cli-service lint\",\n      \"git add\"\n    ]\n  }\n}\n"
  },
  {
    "path": "postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    autoprefixer: {}\n  }\n}\n"
  },
  {
    "path": "src/SmartPagination.vue",
    "content": "<template replaceable part=\"pagination\">\n  <nav v-show=\"!(hideSinglePage && totalPages === 1)\" class=\"smart-pagination\">\n    <ul class=\"pagination\">\n      <li :class=\"{'disabled': currentPage === 1}\" v-if=\"boundaryLinks\" class=\"page-item\">\n        <a href=\"javascript:void(0)\" aria-label=\"Previous\" @click=\"firstPage\" class=\"page-link\">\n          <span aria-hidden=\"true\" v-html=\"firstText\"></span>\n        </a>\n      </li>\n\n      <li :class=\"{'disabled': currentPage === 1}\" v-if=\"directionLinks\" class=\"page-item\">\n        <a href=\"javascript:void(0)\" aria-label=\"Previous\" @click=\"previousPage()\" class=\"page-link\">\n          <slot name=\"previousIcon\" :disabled=\"currentPage === 1\">\n            <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n              <path fill=\"currentColor\"\n                    d=\"M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z\"></path>\n            </svg>\n          </slot>\n        </a>\n      </li>\n\n      <li\n        v-for=\"page in displayPages\"\n        :key=\"page.value\"\n        class=\"page-item\"\n        :class=\"{'active': currentPage === page.value}\"\n      >\n        <a href=\"javascript:void(0)\" @click=\"selectPage(page.value)\" class=\"page-link\">{{page.title}}</a>\n      </li>\n\n      <li :class=\"{'disabled': currentPage === totalPages}\" v-if=\"directionLinks\"\n          class=\"page-item\">\n        <a href=\"javascript:void(0)\" aria-label=\"Next\" @click=\"nextPage()\" class=\"page-link\">\n          <slot name=\"nextIcon\" :disabled=\"currentPage === totalPages\">\n            <svg width=\"16\" height=\"16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n              <path fill=\"currentColor\"\n                    d=\"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"></path>\n            </svg>\n          </slot>\n        </a>\n      </li>\n\n      <li :class=\"{'disabled': currentPage === totalPages}\" v-if=\"boundaryLinks\"\n          class=\"page-item\">\n        <a href=\"javascript:void(0)\" aria-label=\"Previous\" @click=\"lastPage()\" class=\"page-link\">\n          <span aria-hidden=\"true\" v-html=\"lastText\"></span>\n        </a>\n      </li>\n    </ul>\n  </nav>\n</template>\n\n<script>\nexport default {\n  name: 'SmartPagination',\n  props: {\n    currentPage: {\n      required: true,\n      type: Number\n    },\n    totalPages: {\n      required: true,\n      type: Number\n    },\n    hideSinglePage: {\n      required: false,\n      type: Boolean,\n      default: true\n    },\n    maxPageLinks: {\n      required: false,\n      type: Number\n    },\n    boundaryLinks: {\n      required: false,\n      type: Boolean,\n      default: false\n    },\n    firstText: {\n      required: false,\n      type: String,\n      default: 'First'\n    },\n    lastText: {\n      required: false,\n      type: String,\n      default: 'Last'\n    },\n    directionLinks: {\n      required: false,\n      type: Boolean,\n      default: true\n    }\n  },\n  computed: {\n    displayPages () {\n      if (isNaN(this.maxPageLinks) || this.maxPageLinks <= 0) {\n        return this.displayAllPages()\n      } else {\n        return this.limitVisiblePages()\n      }\n    }\n  },\n  methods: {\n    displayAllPages () {\n      const displayPages = []\n\n      for (let i = 1; i <= this.totalPages; i++) {\n        displayPages.push({\n          title: i.toString(),\n          value: i\n        })\n      }\n      return displayPages\n    },\n    limitVisiblePages () {\n      const displayPages = []\n\n      const totalTiers = Math.ceil(this.totalPages / this.maxPageLinks)\n\n      const activeTier = Math.ceil(this.currentPage / this.maxPageLinks)\n\n      const start = ((activeTier - 1) * this.maxPageLinks) + 1\n      const end = start + this.maxPageLinks\n\n      if (activeTier > 1) {\n        displayPages.push({\n          title: '...',\n          value: start - 1\n        })\n      }\n\n      for (let i = start; i < end; i++) {\n        if (i > this.totalPages) {\n          break\n        }\n\n        displayPages.push({\n          title: i.toString(),\n          value: i\n        })\n      }\n\n      if (activeTier < totalTiers) {\n        displayPages.push({\n          title: '...',\n          value: end\n        })\n      }\n\n      return displayPages\n    },\n    selectPage (page) {\n      if (page < 1 || page > this.totalPages || page === this.currentPage) {\n        return\n      }\n\n      this.$emit('update:currentPage', page)\n    },\n    nextPage () {\n      if (this.currentPage < this.totalPages) {\n        this.$emit('update:currentPage', this.currentPage + 1)\n      }\n    },\n    previousPage () {\n      if (this.currentPage > 1) {\n        this.$emit('update:currentPage', this.currentPage - 1)\n      }\n    },\n    firstPage () {\n      this.$emit('update:currentPage', 1)\n    },\n    lastPage () {\n      this.$emit('update:currentPage', this.totalPages)\n    }\n  }\n}\n</script>\n\n<style>\n  .disabled svg {\n    color: grey;\n  }\n\n  .disabled a {\n    cursor: not-allowed\n  }\n</style>\n"
  },
  {
    "path": "src/VTable.vue",
    "content": "<template>\n  <table>\n    <slot name=\"head\"/>\n    <slot name=\"body\" :displayData=\"displayData\"/>\n  </table>\n</template>\n\n<script>\nimport { doFilter, doSort, calculateTotalPages, doPaginate } from './table-utils'\nimport store from './store'\nimport Vue from 'vue'\n\nexport default {\n  name: 'SmartTable',\n  props: {\n    data: {\n      required: true,\n      type: Array\n    },\n    filters: {\n      required: false,\n      type: Object\n    },\n    currentPage: {\n      required: false,\n      type: Number\n    },\n    pageSize: {\n      required: false,\n      type: Number\n    },\n    allowSelection: {\n      required: false,\n      type: Boolean,\n      default: false\n    },\n    selectionMode: {\n      required: false,\n      type: String,\n      default: 'single'\n    },\n    selectedClass: {\n      required: false,\n      type: String,\n      default: 'vt-selected'\n    },\n    customSelection: {\n      required: false,\n      type: Boolean\n    },\n    hideSortIcons: {\n      required: false,\n      type: Boolean\n    }\n  },\n  beforeCreate () {\n    this.store = new Vue(store)\n  },\n  provide () {\n    return {\n      store: this.store\n    }\n  },\n  data () {\n    return {\n      state: this.store._data,\n      initialLoad: false\n    }\n  },\n  computed: {\n    needsPaginationReset () {\n      return this.currentPage > this.totalPages\n    },\n    filteredData () {\n      if (this.data.length === 0) {\n        return []\n      }\n\n      if (typeof this.filters !== 'object') {\n        return this.data\n      }\n\n      return doFilter(this.data, this.filters)\n    },\n    totalItems () {\n      return this.filteredData.length\n    },\n    sortedData () {\n      if ((this.state.sortKey || this.state.customSort) && this.state.sortOrder !== 0) {\n        return doSort(this.filteredData, this.state.sortKey, this.state.customSort, this.state.sortOrder)\n      }\n\n      return this.filteredData\n    },\n    totalPages () {\n      if (!this.pageSize) return 0\n\n      return calculateTotalPages(this.totalItems, this.pageSize)\n    },\n    displayData () {\n      if (this.pageSize) {\n        return doPaginate(this.sortedData, this.pageSize, this.currentPage)\n      }\n\n      return this.sortedData\n    },\n    selectedRows () {\n      return this.state.selectedRows\n    }\n  },\n  watch: {\n    displayData: {\n      handler () {\n        if (!this.initialLoad) {\n          this.initialLoad = true\n          this.$emit('loaded', this)\n        }\n      },\n      immediate: true\n    },\n    selectionMode: {\n      handler (mode) {\n        this.state.selectionMode = mode\n      },\n      immediate: true\n    },\n    selectedClass: {\n      handler (selectedClass) {\n        this.state.selectedClass = selectedClass\n      },\n      immediate: true\n    },\n    customSelection: {\n      handler (customSelection) {\n        this.state.customSelection = customSelection\n      },\n      immediate: true\n    },\n    hideSortIcons: {\n      handler (hideSortIcons) {\n        this.state.hideSortIcons = hideSortIcons\n      },\n      immediate: true\n    },\n    needsPaginationReset: {\n      handler (needsReset) {\n        if (needsReset) {\n          this.$emit('update:currentPage', 1)\n        }\n      },\n      immediate: true\n    },\n    totalPages: {\n      handler (totalPages) {\n        this.$emit('totalPagesChanged', totalPages)\n      },\n      immediate: true\n    },\n    totalItems: {\n      handler (totalItems) {\n        this.$emit('totalItemsChanged', totalItems)\n      },\n      immediate: true\n    },\n    selectedRows: {\n      handler (selected) {\n        this.$emit('selectionChanged', selected)\n      },\n      immediate: true\n    }\n  },\n  methods: {\n    revealItem (item) {\n      if (!this.pageSize) {\n        return true\n      }\n\n      let index\n      if (typeof item === 'function') {\n        index = this.sortedData.findIndex(item)\n      } else {\n        index = this.sortedData.indexOf(item)\n      }\n\n      if (index === -1) {\n        return false\n      }\n\n      const currentPage = Math.ceil((index + 1) / this.pageSize)\n      this.$emit('update:currentPage', currentPage)\n\n      return true\n    },\n    revealPage (page) {\n      if (!this.pageSize || Number.isNaN(page) || page < 1) {\n        return\n      }\n\n      this.$emit('update:currentPage', page)\n    },\n    selectRow (row) {\n      this.store.selectRow(row)\n    },\n    selectRows (rows) {\n      this.store.selectRows(rows)\n    },\n    deselectRow (row) {\n      this.store.deselectRow(row)\n    },\n    deselectRows (rows) {\n      this.store.deselectRows(rows)\n    },\n    selectAll () {\n      if (this.selectionMode === 'single') return\n\n      this.store.selectAll([...this.data])\n    },\n    deselectAll () {\n      this.store.deselectAll()\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/VTh.vue",
    "content": "<template>\n  <th @click=\"sort\" :class=\"sortClass\" :aria-sort=\"ariaSortLabel\">\n    <template v-if=\"!state.hideSortIcons\">\n      <slot name=\"descIcon\" v-if=\"order === -1\">\n        <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n          <path fill=\"currentColor\" d=\"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41z\"/>\n        </svg>\n      </slot>\n      <slot name=\"sortIcon\" v-else-if=\"order === 0\">\n        <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n          <path fill=\"currentColor\" d=\"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41zm255-105L177 64c-9.4-9.4-24.6-9.4-33.9 0L24 183c-15.1 15.1-4.4 41 17 41h238c21.4 0 32.1-25.9 17-41z\"/></svg>\n      </slot>\n      <slot name=\"ascIcon\" v-else-if=\"order === 1\">\n        <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n          <path fill=\"currentColor\" d=\"M279 224H41c-21.4 0-32.1-25.9-17-41L143 64c9.4-9.4 24.6-9.4 33.9 0l119 119c15.2 15.1 4.5 41-16.9 41z\"/>\n        </svg>\n      </slot>\n    </template>\n    <slot/>\n  </th>\n</template>\n\n<script>\nimport { uuid } from './table-utils'\n\nexport default {\n  name: 'v-th',\n  props: {\n    sortKey: {\n      required: false,\n      type: [String, Function]\n    },\n    customSort: {\n      required: false,\n      type: Function\n    },\n    defaultSort: {\n      required: false,\n      type: String,\n      validator: value => ['asc', 'desc'].includes(value)\n    }\n  },\n  inject: ['store'],\n  data () {\n    return {\n      id: uuid(),\n      order: 0,\n      orderClasses: ['vt-desc', 'vt-sortable', 'vt-asc'],\n      ariaLabels: ['descending', 'none', 'ascending'],\n      state: this.store._data\n    }\n  },\n  computed: {\n    sortEnabled () {\n      return this.sortKey || typeof this.customSort === 'function'\n    },\n    sortId () {\n      return this.state.sortId\n    },\n    sortClass () {\n      return this.state.hideSortIcons ? [this.orderClasses[this.order + 1], 'vt-sort'] : []\n    },\n    ariaSortLabel () {\n      return this.ariaLabels[this.order + 1]\n    }\n  },\n  watch: {\n    sortId (sortId) {\n      if (sortId !== this.id && this.order !== 0) {\n        this.order = 0\n      }\n    }\n  },\n  mounted () {\n    if (!this.sortKey && !this.customSort) {\n      throw new Error('Must provide the Sort Key value or a Custom Sort function.')\n    }\n\n    if (this.defaultSort) {\n      this.order = this.defaultSort === 'desc' ? -1 : 1\n      this.store.setSort({\n        sortOrder: this.order,\n        sortKey: this.sortKey,\n        customSort: this.customSort,\n        sortId: this.id\n      })\n      this.$nextTick(() => {\n        this.$emit('defaultSort')\n      })\n    }\n  },\n  methods: {\n    sort: function () {\n      if (this.sortEnabled) {\n        this.order = this.order === 0 || this.order === -1 ? this.order + 1 : -1\n        this.store.setSort({\n          sortOrder: this.order,\n          sortKey: this.sortKey,\n          customSort: this.customSort,\n          sortId: this.id\n        })\n      }\n    }\n  }\n}\n</script>\n\n<style scoped>\n  .vt-sort {\n    cursor: pointer;\n  }\n</style>\n"
  },
  {
    "path": "src/VTr.vue",
    "content": "<template>\n  <tr\n    :class=\"[rowClass]\"\n    :style=\"style\"\n    @click=\"handleRowSelected\"\n\n  >\n    <slot></slot>\n  </tr>\n</template>\n\n<script>\n\nexport default {\n  name: 'v-tr',\n  props: {\n    row: {\n      required: true\n    }\n  },\n  inject: ['store'],\n  data () {\n    return {\n      state: this.store._data\n    }\n  },\n  mounted () {\n    if (!this.state.customSelection) {\n      this.$el.style.cursor = 'pointer'\n    }\n  },\n  beforeDestroy () {\n    if (!this.state.customSelection) {\n      this.$el.removeEventListener('click', this.handleRowSelected)\n    }\n  },\n  computed: {\n    isSelected () {\n      return this.state.selectedRows.find(it => it === this.row)\n    },\n    rowClass: function () {\n      return this.isSelected ? this.state.selectedClass : ''\n    },\n    style () {\n      return {\n        ...(!this.state.customSelection ? { cursor: 'pointer' } : {})\n      }\n    }\n  },\n  methods: {\n    handleRowSelected (event) {\n      if (this.state.customSelection) return\n\n      let source = event.target || event.srcElement\n      if (source.tagName.toLowerCase() === 'td') {\n        if (this.isSelected) {\n          this.store.deselectRow(this.row)\n        } else {\n          this.store.selectRow(this.row)\n        }\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "src/main.js",
    "content": "import VTable from './VTable.vue'\nimport VTh from './VTh.vue'\nimport VTr from './VTr.vue'\nimport SmartPagination from './SmartPagination.vue'\n\nexport {\n  VTable,\n  VTh,\n  VTr,\n  SmartPagination\n}\n/**/\nexport default {\n  install (Vue) {\n    Vue.component('v-table', VTable)\n    Vue.component('v-th', VTh)\n    Vue.component('v-tr', VTr)\n    Vue.component('smart-pagination', SmartPagination)\n  }\n}\n"
  },
  {
    "path": "src/store.js",
    "content": "export default {\n  data: () => ({\n    selectedRows: [],\n    selectionMode: 'single',\n    customSelection: null,\n    selectedClass: null,\n    hideSortIcons: null,\n    sortId: null,\n    sortKey: null,\n    customSort: null,\n    sortOrder: null\n  }),\n  methods: {\n    selectRow (row) {\n      if (this.selectionMode === 'single') {\n        this.selectedRows = [row]\n        return\n      }\n\n      const index = this.selectedRows.indexOf(row)\n      if (index === -1) {\n        this.selectedRows.push(row)\n      }\n    },\n    selectRows (rows) {\n      for (let row of rows) {\n        this.selectRow(row)\n      }\n    },\n    deselectRow (row) {\n      const index = this.selectedRows.indexOf(row)\n\n      if (index > -1) {\n        this.selectedRows.splice(index, 1)\n      }\n    },\n    deselectRows (rows) {\n      for (let row of rows) {\n        this.deselectRow(row)\n      }\n    },\n    selectAll (all) {\n      this.selectedRows = all\n    },\n    deselectAll () {\n      this.selectedRows = []\n    },\n    setSort ({ sortKey, customSort, sortOrder, sortId }) {\n      this.sortKey = sortKey\n      this.customSort = customSort\n      this.sortOrder = sortOrder\n      this.sortId = sortId\n    }\n  }\n}\n"
  },
  {
    "path": "src/table-utils.js",
    "content": "export function doSort (toSort, sortKey, customSort, sortOrder) {\n  let local = [...toSort]\n\n  return local.sort((a, b) => {\n    if (typeof customSort === 'function') {\n      return customSort(a, b) * sortOrder\n    }\n\n    let val1\n    let val2\n\n    if (typeof sortKey === 'function') {\n      val1 = sortKey(a, sortOrder)\n      val2 = sortKey(b, sortOrder)\n    } else {\n      val1 = getPropertyValue(a, sortKey)\n      val2 = getPropertyValue(b, sortKey)\n    }\n\n    if (val1 === null || val1 === undefined) val1 = ''\n    if (val2 === null || val2 === undefined) val2 = ''\n\n    if (isNumeric(val1) && isNumeric(val2)) {\n      return (val1 - val2) * sortOrder\n    }\n\n    const str1 = val1.toString()\n    const str2 = val2.toString()\n\n    return str1.localeCompare(str2) * sortOrder\n  })\n}\n\nexport function doFilter (toFilter, filters) {\n  let filteredData = []\n\n  for (let item of toFilter) {\n    let passed = true\n\n    for (let filterName in filters) {\n      if (!filters.hasOwnProperty(filterName)) {\n        continue\n      }\n\n      let filter = filters[filterName]\n\n      if (!passFilter(item, filter)) {\n        passed = false\n        break\n      }\n    }\n\n    if (passed) {\n      filteredData.push(item)\n    }\n  }\n\n  return filteredData\n}\n\nexport function doPaginate (toPaginate, pageSize, currentPage) {\n  if (toPaginate.length <= pageSize || pageSize <= 0 || currentPage <= 0) {\n    return toPaginate\n  }\n\n  const start = (currentPage - 1) * pageSize\n  const end = start + pageSize\n\n  return [...toPaginate].slice(start, end)\n}\n\nexport function calculateTotalPages (totalItems, pageSize) {\n  return totalItems <= pageSize ? 1 : Math.ceil(totalItems / pageSize)\n}\n\nexport function passFilter (item, filter) {\n  if (typeof filter.custom === 'function' && !filter.custom(filter.value, item)) {\n    return false\n  }\n\n  if (filter.value === null || filter.value === undefined || filter.value.length === 0 || !Array.isArray(filter.keys)) {\n    return true\n  }\n\n  for (let key of filter.keys) {\n    const value = getPropertyValue(item, key)\n\n    if (value !== null && value !== undefined) {\n      const filterStrings = Array.isArray(filter.value) ? filter.value : [filter.value]\n\n      for (const filterString of filterStrings) {\n        if (filter.exact) {\n          if (value.toString() === filterString.toString()) {\n            return true\n          }\n        } else {\n          if (value.toString().toLowerCase().includes(filterString.toString().toLowerCase())) {\n            return true\n          }\n        }\n      }\n    }\n  }\n  return false\n}\n\nexport function getPropertyValue (object, keyPath) {\n  keyPath = keyPath.replace(/\\[(\\w+)\\]/g, '.$1')\n  keyPath = keyPath.replace(/^\\./, '')\n  const a = keyPath.split('.')\n  for (let i = 0, n = a.length; i < n; ++i) {\n    let k = a[i]\n    if (k in object) {\n      object = object[k]\n    } else {\n      return\n    }\n  }\n  return object\n}\n\nexport function isNumeric (toCheck) {\n  return !Array.isArray(toCheck) && !isNaN(parseFloat(toCheck)) && isFinite(toCheck)\n}\n\nexport function uuid () {\n  return '_' + Math.random().toString(36).substr(2, 9)\n}\n"
  },
  {
    "path": "tests/unit/.eslintrc.js",
    "content": "module.exports = {\n  env: {\n    mocha: true\n  }\n}\n"
  },
  {
    "path": "tests/unit/table-utils.spec.js",
    "content": "import { expect } from 'chai'\nimport { calculateTotalPages, isNumeric, getPropertyValue, doPaginate } from '../../src/table-utils.js'\n\nlet scenario = [\n  { totalItems: 10, pageSize: 5, result: 2 },\n  { totalItems: 1, pageSize: 10, result: 1 },\n  { totalItems: 11, pageSize: 10, result: 2 },\n  { totalItems: 200, pageSize: 200, result: 1 },\n  { totalItems: 200, pageSize: 1, result: 200 }\n]\n\nscenario.forEach(({ totalItems, pageSize, result }) => {\n  describe('calculateTotalPages', () => {\n    it(`Should be ${result} pages when totalItems is ${totalItems} and pageSize: is ${pageSize}`, () => {\n      expect(calculateTotalPages(totalItems, pageSize))\n        .to.equal(result)\n    })\n  })\n})\n\nscenario = [\n  { toCheck: 5, result: true },\n  { toCheck: 1.0, result: true },\n  { toCheck: -1.0, result: true },\n  // eslint-disable-next-line no-floating-decimal\n  { toCheck: .5, result: true },\n  { toCheck: 0.8, result: true },\n  { toCheck: '0.5', result: true },\n  { toCheck: '-0.5', result: true },\n  { toCheck: 'asd', result: false },\n  { toCheck: '5,2', result: false },\n  { toCheck: [1], result: false },\n  { toCheck: [], result: false },\n  { toCheck: { value: 1 }, result: false }\n]\n\nscenario.forEach(({ toCheck, result }) => {\n  describe('isNumeric', () => {\n    it(`${toCheck} should ${result ? '' : 'not'} be numeric`, () => {\n      expect(isNumeric(toCheck))\n        .to.equal(result)\n    })\n  })\n})\n\nscenario = [\n  { object: { value: 'asd', values: 123 }, path: 'value', result: 'asd' },\n  { object: { value: 'asd', values: 123 }, path: '[value]', result: 'asd' },\n  { object: { a: { b: { c: 13 } } }, path: 'a.b.c', result: 13 },\n  { object: { a: { b: { c: 13 } } }, path: 'a[b].c', result: 13 },\n  { object: { value: 'asd' }, path: 'none', result: undefined },\n  { object: {}, path: 'empty', result: undefined }\n]\n\nscenario.forEach(({ object, path, result }) => {\n  describe('getPropertyValue', () => {\n    it(`path '${path}' should be ${result}`, () => {\n      expect(getPropertyValue(object, path))\n        .to.equal(result)\n    })\n  })\n})\n\nlet toPaginate = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\nscenario = [\n  { pageSize: 3, currentPage: 1, result: [1, 2, 3] },\n  { pageSize: 5, currentPage: 2, result: [6, 7, 8, 9, 10] },\n  { pageSize: 2, currentPage: 3, result: [5, 6] },\n  { pageSize: 5, currentPage: 3, result: [] },\n  { pageSize: 50, currentPage: 1, result: toPaginate },\n  { pageSize: 0, currentPage: 1, result: toPaginate },\n  { pageSize: 5, currentPage: 0, result: toPaginate }\n]\n\nscenario.forEach(({ pageSize, currentPage, result }) => {\n  describe('doPaginate', () => {\n    it(`With size: ${pageSize} and currentPage: ${currentPage} it should return ${result}`, () => {\n      expect(doPaginate(toPaginate, pageSize, currentPage))\n        .to.eql(result)\n    })\n  })\n})\n"
  }
]