You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2019/11/16 13:01:17 UTC

[qpid-dispatch] branch eallen-DISPATCH-1385 updated: Added jest tests

This is an automated email from the ASF dual-hosted git repository.

eallen pushed a commit to branch eallen-DISPATCH-1385
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git


The following commit(s) were added to refs/heads/eallen-DISPATCH-1385 by this push:
     new 36ec944  Added jest tests
36ec944 is described below

commit 36ec944255b2c0e3aa32f51e24afd4a399604747
Author: Ernest Allen <ea...@redhat.com>
AuthorDate: Sat Nov 16 08:01:01 2019 -0500

    Added jest tests
---
 console/.eslintrc.json                             |   20 +-
 console/react/.prettierignore                      |    1 +
 console/react/.prettierrc                          |    7 +
 console/react/package.json                         |    7 +-
 console/react/public/assets/img_avatar.svg         |   33 +
 console/react/src/App.css                          |   61 +-
 console/react/src/App.js                           |    4 +-
 console/react/src/App.test.js                      |   19 +-
 console/react/src/DropdownMenu.test.js             |   20 +
 console/react/src/addressesComponent.js            |    1 +
 console/react/src/addressesComponent.test.js       |   36 +
 console/react/src/alert-saved.js                   |   39 -
 console/react/src/alertList.js                     |    4 +-
 console/react/src/alertList.test.js                |   30 +
 console/react/src/amqp/connection.js               |   38 +-
 console/react/src/amqp/utilities.js                |    5 +-
 console/react/src/chord/chordToolbar.js            |   70 +-
 console/react/src/chord/chordToolbar.test.js       |   47 +
 console/react/src/chord/chordViewer.js             |   34 +-
 console/react/src/chord/chordViewer.test.js        |   21 +
 console/react/src/chord/routersComponent.js        |   46 +-
 console/react/src/confirm.js                       |   74 -
 console/react/src/connect-form.js                  |   22 +-
 console/react/src/connect.test.js                  |   31 +
 console/react/src/connectPage.js                   |   13 +-
 console/react/src/connectPage.test.js              |   12 +
 console/react/src/connecting.js                    |   30 -
 console/react/src/connectionClose.js               |    3 +
 console/react/src/connectionClose.test.js          |   42 +
 console/react/src/contextMenu.test.js              |   23 +
 console/react/src/contextMenuComponent.js          |    9 +-
 console/react/src/details/createTablePage.js       |   11 +-
 console/react/src/details/createTablePage.test.js  |   34 +
 console/react/src/details/deleteEntity.js          |    1 -
 console/react/src/details/enitiesPage.js           |   11 +-
 console/react/src/details/entityListTable.js       |    3 -
 console/react/src/details/schema/schemaPage.js     |    3 +-
 .../react/src/details/schema/schemaPage.test.js    |   29 +
 console/react/src/details/updateEntity.js          |    2 -
 console/react/src/details/updateTablePage.js       |   37 +-
 console/react/src/details/updateTablePage.test.js  |   40 +
 console/react/src/detailsTablePage.js              |    8 +-
 console/react/src/detailsTablePage.test.js         |   19 +
 console/react/src/dropdownPanel.js                 |   70 +
 console/react/src/layout.js                        |   28 +-
 console/react/src/layout.test.js                   |   33 +
 console/react/src/notificationDrawer.js            |   29 +-
 console/react/src/notificationDrawer.test.js       |   34 +
 console/react/src/overview/dashboard/chartBase.js  |    3 +-
 .../react/src/overview/dashboard/dashboardPage.js  |    5 +-
 .../src/overview/dashboard/dashboardPage.test.js   |   16 +
 .../react/src/overview/dashboard/inflightChart.js  |    3 +-
 .../src/overview/dashboard/inflightChart.test.js   |   16 +
 .../react/src/overview/dashboard/overviewChart.js  |   33 +-
 .../src/overview/dashboard/throughputChart.js      |    1 +
 .../src/overview/dashboard/throughputChart.test.js |   20 +
 .../{overviewTablePage.js => overviewPage.js}      |    5 +-
 console/react/src/overview/overviewPage.test.js    |   18 +
 console/react/src/overview/overviewTable.js        |    6 +-
 console/react/src/overview/overviewTable.test.js   |   19 +
 console/react/src/qdrPopup.js                      |    2 +-
 console/react/src/qdrPopup.test.js                 |   15 +
 console/react/src/qdrService.js                    |    8 +-
 console/react/src/qdrService.mock.js               | 2145 ++++++++++++++++++
 console/react/src/setupTests.js                    |    3 +
 .../src/{tableToolbar.jsx => tableToolbar.js}      |    1 +
 console/react/src/tableToolbar.test.js             |   29 +
 console/react/src/topology/arrowsComponent.js      |    4 +-
 console/react/src/topology/mapComponent.js         |    4 +-
 console/react/src/topology/nodes.js                |   16 +-
 console/react/src/topology/topoUtils.js            |   32 +-
 console/react/src/topology/topologyToolbar.js      |   93 +-
 console/react/src/topology/topologyToolbar.test.js |   36 +
 console/react/src/topology/topologyViewer.js       |   86 +-
 console/react/src/topology/topologyViewer.test.js  |   21 +
 console/react/src/updated.js                       |    2 +-
 console/react/src/updated.test.js                  |   16 +
 console/react/yarn.lock                            | 2392 ++++++++++++--------
 78 files changed, 4726 insertions(+), 1518 deletions(-)

diff --git a/console/.eslintrc.json b/console/.eslintrc.json
index f9c80bb..51da5a1 100644
--- a/console/.eslintrc.json
+++ b/console/.eslintrc.json
@@ -5,7 +5,7 @@
     "amd": true,
     "jquery": true
   },
-  "extends": "eslint:recommended",
+  "extends": ["eslint:recommended", "plugin:patternfly-react/recommended"],
   "parserOptions": {
     "ecmaVersion": 6,
     "sourceType": "module",
@@ -14,9 +14,19 @@
     }
   },
   "rules": {
-    "indent": ["error", 2],
-    "linebreak-style": ["error", "unix"],
-    "semi": ["error", "always"],
-    "no-console": "off"
+    "indent": [
+      "error",
+      2
+    ],
+    "linebreak-style": [
+      "error",
+      "unix"
+    ],
+    "semi": [
+      "error",
+      "always"
+    ],
+    "no-console": "on",
+    "no-debugger": 1
   }
 }
diff --git a/console/react/.prettierignore b/console/react/.prettierignore
new file mode 100644
index 0000000..ec6d3cd
--- /dev/null
+++ b/console/react/.prettierignore
@@ -0,0 +1 @@
+package.json
diff --git a/console/react/.prettierrc b/console/react/.prettierrc
new file mode 100644
index 0000000..a6058bb
--- /dev/null
+++ b/console/react/.prettierrc
@@ -0,0 +1,7 @@
+{
+  "singleQuote": false,
+  "printWidth": 120,
+  "semi": true,
+  "useTabs": false,
+  "arrowParens": "avoid"
+}
diff --git a/console/react/package.json b/console/react/package.json
index 52deca4..0c95076 100644
--- a/console/react/package.json
+++ b/console/react/package.json
@@ -1,6 +1,6 @@
 {
-  "name": "network-creator",
-  "version": "0.1.0",
+  "name": "dispatch-console",
+  "version": "0.2.0",
   "private": true,
   "dependencies": {
     "@patternfly/patternfly": "^2.13.0",
@@ -10,8 +10,11 @@
     "@patternfly/react-styles": "^3.3.3",
     "@patternfly/react-table": "^2.11.1",
     "@patternfly/react-topology": "^2.7.31",
+    "@testing-library/jest-dom": "^4.2.3",
+    "@testing-library/react": "^9.3.2",
     "body-parser": "^1.19.0",
     "d3-queue": "^3.0.7",
+    "eslint-plugin-patternfly-react": "^0.2.3",
     "express": "^4.17.1",
     "lodash-es": "^4.17.11",
     "patternfly-react": "^2.36.1",
diff --git a/console/react/public/assets/img_avatar.svg b/console/react/public/assets/img_avatar.svg
new file mode 100644
index 0000000..11c80b8
--- /dev/null
+++ b/console/react/public/assets/img_avatar.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 36 36" version="1.1" viewBox="0 0 36 36" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+<style type="text/css">
+	/*stylelint-disable*/
+	.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
+	.st1{filter:url(#b);}
+	.st2{mask:url(#a);}
+	.st3{fill-rule:evenodd;clip-rule:evenodd;fill:#BBBBBB;}
+	.st4{opacity:0.1;fill-rule:evenodd;clip-rule:evenodd;enable-background:new    ;}
+	.st5{opacity:8.000000e-02;fill-rule:evenodd;clip-rule:evenodd;fill:#231F20;enable-background:new    ;}
+	/*stylelint-enable*/
+</style>
+			<circle class="st0" cx="18" cy="18.5" r="18"/>
+		<defs>
+			<filter id="b" x="5.2" y="7.2" width="25.6" height="53.6" filterUnits="userSpaceOnUse">
+				<feColorMatrix values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 1 0"/>
+			</filter>
+		</defs>
+		<mask id="a" x="5.2" y="7.2" width="25.6" height="53.6" maskUnits="userSpaceOnUse">
+			<g class="st1">
+				<circle class="st0" cx="18" cy="18.5" r="18"/>
+			</g>
+		</mask>
+		<g class="st2">
+			<g transform="translate(5.04 6.88)">
+				<path class="st3" d="m22.6 18.1c-1.1-1.4-2.3-2.2-3.5-2.6s-1.8-0.6-6.3-0.6-6.1 0.7-6.1 0.7 0 0 0 0c-1.2 0.4-2.4 1.2-3.4 2.6-2.3 2.8-3.2 12.3-3.2 14.8 0 3.2 0.4 12.3 0.6 15.4 0 0-0.4 5.5 4 5.5l-0.3-6.3-0.4-3.5 0.2-0.9c0.9 0.4 3.6 1.2 8.6 1.2 5.3 0 8-0.9 8.8-1.3l0.2 1-0.2 3.6-0.3 6.3c3 0.1 3.7-3 3.8-4.4s0.6-12.6 0.6-16.5c0.1-2.6-0.8-12.1-3.1-15z"/>
+				<path class="st4" d="m22.5 26c-0.1-2.1-1.5-2.8-4.8-2.8l2.2 9.6s1.8-1.7 3-1.8c0 0-0.4-4.6-0.4-5z"/>
+				<path class="st3" d="m12.7 13.2c-3.5 0-6.4-2.9-6.4-6.4s2.9-6.4 6.4-6.4 6.4 2.9 6.4 6.4-2.8 6.4-6.4 6.4z"/>
+				<path class="st5" d="m9.4 6.8c0-3 2.1-5.5 4.9-6.3-0.5-0.1-1-0.2-1.6-0.2-3.5 0-6.4 2.9-6.4 6.4s2.9 6.4 6.4 6.4c0.6 0 1.1-0.1 1.6-0.2-2.8-0.6-4.9-3.1-4.9-6.1z"/>
+				<path class="st4" d="m8.3 22.4c-2 0.4-2.9 1.4-3.1 3.5l-0.6 18.6s1.7 0.7 3.6 0.9l0.1-23z"/>
+			</g>
+		</g>
+</svg>
diff --git a/console/react/src/App.css b/console/react/src/App.css
index 4e4240b..a71287c 100644
--- a/console/react/src/App.css
+++ b/console/react/src/App.css
@@ -636,6 +636,9 @@ svg#svglegend {
   max-height: 23em;
 }
 
+#arrows-expand {
+  padding-bottom: 1em;
+}
 div.qdrTopology,
 div.qdrChord {
   text-align: center;
@@ -834,9 +837,11 @@ div.qdrChord .legend-text {
   font-weight: bold;
 }
 
+/*
 .colored-dot span.colored-dot-dot > span {
   padding-top: 5px;
 }
+*/
 
 .colored-dot span.colored-dot-text {
   margin-left: 0.5em;
@@ -1084,11 +1089,6 @@ div.qdrTopology .topology-toolbar-button i {
   margin-right: 8px;
 }
 
-.chord-addresses ul {
-  margin-left: 2em;
-  margin-top: 0.5em;
-}
-
 .topology-toolbar-item .pf-c-popover__content {
   padding-bottom: 1em;
 }
@@ -1406,6 +1406,10 @@ div.connecting {
   opacity: 0.2;
 }
 
+.connect-error p {
+  color: red !important;
+}
+
 /* schema page */
 
 .list-group-item-heading {
@@ -1428,3 +1432,50 @@ div.connecting {
 #schema-page .pficon.list-view-pf-icon-sm {
   border: 0;
 }
+
+/* other */
+.options-panel {
+  min-width: 8.7em;
+  max-width: 25em;
+  padding: 0.5em 1em 0.25em;
+  text-align: left;
+  margin-top: 0.5em;
+}
+
+.chord-addresses {
+  text-align: left;
+}
+
+.chord-addresses ul {
+  margin-top: 0.5em;
+}
+
+.qdrTopology .pf-c-accordion__expanded-content-body {
+  position: absolute;
+  z-index: 100;
+  background: white;
+  padding: 0;
+}
+
+.pf-c-accordion__expanded-content.pf-m-expanded {
+  --pf-c-accordion__expanded-content--BorderLeftColor: white !important;
+}
+
+button.dropdown-panel-toggle.pf-c-accordion__toggle {
+  padding: 0.5em 1em;
+}
+
+button.dropdown-panel-toggle.pf-c-accordion__toggle span.pf-c-accordion__toggle-text {
+  max-width: 10em;
+  padding-right: 1em;
+}
+
+.qdrTopology dl.pf-c-accordion dt {
+  background-image: none;
+}
+
+.dropdown-panel-accordion.pf-c-accordion {
+  box-shadow: none;
+  border: 1px solid #eaeaea;
+  border-bottom: 1px solid black;
+}
diff --git a/console/react/src/App.js b/console/react/src/App.js
index ff8b629..d3ba9f8 100644
--- a/console/react/src/App.js
+++ b/console/react/src/App.js
@@ -5,15 +5,17 @@ import "@patternfly/patternfly/patternfly-addons.css";
 import "patternfly/dist/css/patternfly.css";
 import "patternfly/dist/css/patternfly-additions.css";
 import "@patternfly/patternfly/components/Nav/nav.css";
+import { QDRService } from "./qdrService";
 import "./App.css";
 import PageLayout from "./layout";
 class App extends Component {
   state = {};
 
   render() {
+    const service = new QDRService();
     return (
       <div className="App pf-m-redhat-font">
-        <PageLayout config={this.props.config} />
+        <PageLayout service={service} config={this.props.config} />
       </div>
     );
   }
diff --git a/console/react/src/App.test.js b/console/react/src/App.test.js
index a754b20..b2ed536 100644
--- a/console/react/src/App.test.js
+++ b/console/react/src/App.test.js
@@ -1,9 +1,14 @@
-import React from 'react';
-import ReactDOM from 'react-dom';
-import App from './App';
+import React from "react";
+import { render } from '@testing-library/react';
+import App from "./App";
 
-it('renders without crashing', () => {
-  const div = document.createElement('div');
-  ReactDOM.render(<App />, div);
-  ReactDOM.unmountComponentAtNode(div);
+const title = "Apache Qpid Dispatch Console"
+const config = { title };
+it("renders without crashing", () => {
+  render(<App config={config} />);
 });
+
+it('renders the correct title', () => {
+  const { getAllByText } = render(<App config={config} />);
+  expect(getAllByText(title));
+});
\ No newline at end of file
diff --git a/console/react/src/DropdownMenu.test.js b/console/react/src/DropdownMenu.test.js
new file mode 100644
index 0000000..995b26d
--- /dev/null
+++ b/console/react/src/DropdownMenu.test.js
@@ -0,0 +1,20 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import DropdownMenu from "./DropdownMenu";
+
+it("the dropdown menu component renders and calls event handlers", () => {
+  const isVisible = true;
+  const isConnected = () => true;
+  let logoutCalled = false;
+  const handleDropdownLogout = () => logoutCalled = true
+  let menuRef = null;
+  render(
+    <DropdownMenu
+      ref={el => (menuRef = el)}
+      isVisible={isVisible} isConnected={isConnected}
+      handleDropdownLogout={handleDropdownLogout} />
+  );
+  menuRef.show(true)
+  menuRef.logout()
+  expect(logoutCalled).toBe(true)
+});
diff --git a/console/react/src/addressesComponent.js b/console/react/src/addressesComponent.js
index f3ecbcd..154d403 100644
--- a/console/react/src/addressesComponent.js
+++ b/console/react/src/addressesComponent.js
@@ -50,6 +50,7 @@ class AddressesComponent extends Component {
       <span
         className="colored-dot"
         id={`address-dot-${i}`}
+        aria-label="colored dot"
         onClick={() => this.dotClicked(address)}
         onMouseOver={() => this.dotHover(address, true)}
         onMouseOut={() => this.dotHover(address, false)}
diff --git a/console/react/src/addressesComponent.test.js b/console/react/src/addressesComponent.test.js
new file mode 100644
index 0000000..fffe287
--- /dev/null
+++ b/console/react/src/addressesComponent.test.js
@@ -0,0 +1,36 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import AddressesComponent from "./addressesComponent";
+
+it("renders the addresses component with an address", () => {
+  let handleChangeAddressCalled = false;
+  let handleHoverAddress = undefined;
+  const props = {
+    addresses: { test: true },
+    addressColors: { test: "#EAEAEA" },
+    handleChangeAddress: () => handleChangeAddressCalled = true,
+    handleHoverAddress: (address, over) => handleHoverAddress = over
+  }
+  const { getByLabelText } = render(
+    <AddressesComponent
+      {...props} />);
+  const node = getByLabelText("colored dot");
+  fireEvent.click(node)
+  expect(handleChangeAddressCalled).toBe(true)
+  fireEvent.mouseOver(node);
+  expect(handleHoverAddress).toBe(true)
+  fireEvent.mouseOut(node);
+  expect(handleHoverAddress).toBe(false)
+});
+
+it("renders the addresses component without an address", () => {
+  const props = {
+    addresses: {},
+    addressColors: {},
+  }
+  const { getByText } = render(
+    <AddressesComponent
+      {...props} />);
+  expect(getByText("There is no traffic")).toBeInTheDocument();
+});
+
diff --git a/console/react/src/alert-saved.js b/console/react/src/alert-saved.js
deleted file mode 100644
index b7ea14c..0000000
--- a/console/react/src/alert-saved.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import React from "react";
-import {
-  Alert,
-  AlertActionCloseButton,
-  ClipboardCopy
-} from "@patternfly/react-core";
-
-class AlertSaved extends React.Component {
-  constructor(props) {
-    super(props);
-    this.state = {};
-  }
-  render() {
-    return (
-      <Alert
-        className="over-alert"
-        variant="success"
-        title="Success"
-        action={<AlertActionCloseButton onClose={this.props.handelHideAlert} />}
-      >
-        Network saved.{" "}
-        <ClipboardCopy
-          className="state-copy"
-          onClick={(event, text) => {
-            const clipboard = event.currentTarget.parentElement;
-            const el = document.createElement("input");
-            el.value = JSON.stringify(this.props.networkYaml);
-            clipboard.appendChild(el);
-            el.select();
-            document.execCommand("copy");
-            clipboard.removeChild(el);
-          }}
-        />
-      </Alert>
-    );
-  }
-}
-
-export default AlertSaved;
diff --git a/console/react/src/alertList.js b/console/react/src/alertList.js
index 36c8ecf..f6c617f 100644
--- a/console/react/src/alertList.js
+++ b/console/react/src/alertList.js
@@ -47,7 +47,7 @@ class AlertList extends React.Component {
 
   render() {
     return (
-      <div id="alert-list-container">
+      <div id="alert-list-container" aria-label="alert-list">
         {this.state.alerts.map((alert, i) => (
           <Alert
             key={`alert-${i}`}
@@ -55,7 +55,7 @@ class AlertList extends React.Component {
             title={alert.type}
             isInline
             action={
-              <AlertActionCloseButton onClose={() => this.hideAlert(alert)} />
+              <AlertActionCloseButton aria-label="alert-close-button" onClose={() => this.hideAlert(alert)} />
             }
           >
             {alert.message.length > 40
diff --git a/console/react/src/alertList.test.js b/console/react/src/alertList.test.js
new file mode 100644
index 0000000..f05c93d
--- /dev/null
+++ b/console/react/src/alertList.test.js
@@ -0,0 +1,30 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import AlertList from "./alertList";
+
+it("renders the AlertList component", () => {
+  let ref = null;
+  const props = {
+  }
+  const { getByLabelText, queryByLabelText } = render(
+    <AlertList
+      ref={el => (ref = el)}
+      {...props} />)
+  // the container should be there
+  expect(getByLabelText("alert-list")).toBeInTheDocument();
+  // there should be no alerts in the list to start with
+  expect(queryByLabelText("alert-close-button")).toBeNull();
+
+  // add an alert
+  ref.addAlert("info", "testing");
+  // the alert close button should now be there
+  expect(getByLabelText("alert-close-button")).toBeInTheDocument();
+
+  const alert = {
+    key: 0
+  }
+  // hide the alert
+  ref.hideAlert(alert);
+  // the alert close button should now be gone
+  expect(queryByLabelText("alert-close-button")).toBeNull();
+});
diff --git a/console/react/src/amqp/connection.js b/console/react/src/amqp/connection.js
index 8010b92..97ff56f 100644
--- a/console/react/src/amqp/connection.js
+++ b/console/react/src/amqp/connection.js
@@ -31,14 +31,14 @@ class ConnectionManager {
     this.connectActions = [];
     this.disconnectActions = [];
     this.correlator = new Correlator();
-    this.on_message = function(context) {
+    this.on_message = function (context) {
       this.correlator.resolve(context);
     }.bind(this);
-    this.on_disconnected = function() {
+    this.on_disconnected = function () {
       this.errorText = "Disconnected";
       this.executeDisconnectActions(this.errorText);
     }.bind(this);
-    this.on_connection_open = function() {
+    this.on_connection_open = function () {
       this.executeConnectActions();
     }.bind(this);
   }
@@ -79,7 +79,7 @@ class ConnectionManager {
     }
   }
   executeConnectActions() {
-    this.connectActions.forEach(function(action) {
+    this.connectActions.forEach(function (action) {
       try {
         action();
       } catch (e) {
@@ -129,10 +129,10 @@ class ConnectionManager {
   }
   createSenderReceiver(options) {
     return new Promise(
-      function(resolve, reject) {
+      function (resolve, reject) {
         var timeout = options.timeout || 10000;
         // set a timer in case the setup takes too long
-        var giveUp = function() {
+        var giveUp = function () {
           this.connection.removeListener("receiver_open", receiver_open);
           this.connection.removeListener("sendable", sendable);
           this.errorText = "timed out creating senders and receivers";
@@ -140,7 +140,7 @@ class ConnectionManager {
         }.bind(this);
         var timer = setTimeout(giveUp, timeout);
         // register an event hander for when the setup is complete
-        var sendable = function(context) {
+        var sendable = function (context) {
           clearTimeout(timer);
           this.version = this.connection.properties
             ? this.connection.properties.version
@@ -156,7 +156,7 @@ class ConnectionManager {
         this.connection.once("sendable", sendable);
         // Now actually createt the sender and receiver.
         // register an event handler for when the receiver opens
-        var receiver_open = function() {
+        var receiver_open = function () {
           // once the receiver is open, create the sender
           if (options.sender_address)
             this.sender = this.connection.open_sender(options.sender_address);
@@ -172,13 +172,13 @@ class ConnectionManager {
   }
   connect(options) {
     return new Promise(
-      function(resolve, reject) {
-        var finishConnecting = function() {
+      function (resolve, reject) {
+        var finishConnecting = function () {
           this.createSenderReceiver(options).then(
-            function(results) {
+            function (results) {
               resolve(results);
             },
-            function(error) {
+            function (error) {
               reject(error);
             }
           );
@@ -186,12 +186,12 @@ class ConnectionManager {
         if (!this.connection) {
           options.test = false; // if you didn't want a connection, you should have called testConnect() and not connect()
           this.testConnect(options).then(
-            function() {
+            function () {
               finishConnecting.call(this);
             }.bind(this),
-            function() {
+            function () {
               // connect failed or timed out
-              this.errorText = "Unable to connect";
+              this.errorText = `Unable to connect to ${options.address}:${options.port}`;
               this.executeDisconnectActions(this.errorText);
               reject(Error(this.errorText));
             }.bind(this)
@@ -210,7 +210,7 @@ class ConnectionManager {
   // if the connection attempt fails or times out, reject the promise regardless of options.test
   testConnect(options, callback) {
     return new Promise(
-      function(resolve, reject) {
+      function (resolve, reject) {
         var timeout = options.timeout || 10000;
         var reconnect = options.reconnect || false; // in case options.reconnect is undefined
         var baseAddress = options.address + ":" + options.port;
@@ -240,7 +240,7 @@ class ConnectionManager {
           c.password = options.password;
         }
         // set a timeout
-        var disconnected = function() {
+        var disconnected = function () {
           clearTimeout(timer);
           rhea.removeListener("disconnected", disconnected);
           rhea.removeListener("connection_open", connection_open);
@@ -251,7 +251,7 @@ class ConnectionManager {
         }.bind(this);
         var timer = setTimeout(disconnected, timeout);
         // the event handler for when the connection opens
-        var connection_open = function(context) {
+        var connection_open = function (context) {
           clearTimeout(timer);
           // prevent future disconnects from calling reject
           rhea.removeListener("disconnected", disconnected);
@@ -319,7 +319,7 @@ class ConnectionManager {
   _send(body, to, application_properties) {
     var _correlationId = this.correlator.corr();
     var self = this;
-    return new Promise(function(resolve, reject) {
+    return new Promise(function (resolve, reject) {
       self.correlator.register(_correlationId, resolve, reject);
       self.sender.send({
         body: body,
diff --git a/console/react/src/amqp/utilities.js b/console/react/src/amqp/utilities.js
index e184959..30e4ec8 100644
--- a/console/react/src/amqp/utilities.js
+++ b/console/react/src/amqp/utilities.js
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-/* global d3 Uint8Array */
-var ddd = typeof window === "undefined" ? require("d3") : d3;
+import * as d3 from "d3";
 
 var utils = {
   isAConsole: function(properties, connectionId, nodeType, key) {
@@ -115,7 +114,7 @@ var utils = {
     return t.replace(".", " ");
   },
   pretty: function(v, format = ",") {
-    var formatComma = ddd.format(format);
+    var formatComma = d3.format(format);
     if (!isNaN(parseFloat(v)) && isFinite(v)) return formatComma(v);
     return v;
   },
diff --git a/console/react/src/chord/chordToolbar.js b/console/react/src/chord/chordToolbar.js
index 85c2f7f..4f5fc16 100644
--- a/console/react/src/chord/chordToolbar.js
+++ b/console/react/src/chord/chordToolbar.js
@@ -1,46 +1,21 @@
 import React from "react";
 import { Toolbar, ToolbarGroup, ToolbarItem } from "@patternfly/react-core";
-import { Popover, PopoverPosition, Button } from "@patternfly/react-core";
 import OptionsComponent from "./optionsComponent";
 import RoutersComponent from "./routersComponent";
+import DropdownPanel from "../dropdownPanel"
 
 class ChordToolbar extends React.Component {
-  constructor(props) {
-    super(props);
-
-    this.state = {
-      isOpen: { traffic: false, arrows: false, map: false }
-    };
-  }
-  handleShowPopover = event => {
-    console.log("handleShowPopover called");
-    const { isOpen } = this.state;
-    const value = event.target.value;
-    isOpen[value] = !isOpen[value];
-    this.setState({ isOpen });
-  };
-
-  shouldClose = tip => {
-    console.log("should close called");
-    const { isOpen } = this.state;
-    const value = tip.reference.value;
-    isOpen[value] = false;
-    this.setState({ isOpen });
-  };
 
   render() {
     return (
-      <Toolbar className="pf-l-toolbar pf-u-justify-content-space-between pf-u-mx-xl pf-u-my-md">
+      <Toolbar
+        data-testid="chord-toolbar"
+        className="pf-l-toolbar pf-u-justify-content-space-between pf-u-mx-xl pf-u-my-md">
         <ToolbarGroup>
           <ToolbarItem className="pf-u-mr-md">
-            <Popover
-              className="topology-toolbar-item"
-              position={PopoverPosition.bottom}
-              enableFlip={false}
-              appendTo={() => document.getElementById("root")}
-              aria-label="Options"
-              closeBtnAriaLabel="Close Popover options"
-              bodyContent={
+            <DropdownPanel
+              title="Options"
+              panel={
                 <OptionsComponent
                   isRate={this.props.isRate}
                   byAddress={this.props.byAddress}
@@ -51,39 +26,18 @@ class ChordToolbar extends React.Component {
                   handleHoverAddress={this.props.handleHoverAddress}
                 />
               }
-            >
-              <Button className="topology-toolbar-button" value="options">
-                <span className="pf-c-dropdown__toggle-text">Options</span>
-                <i
-                  className="fas fa-caret-down pf-c-dropdown__toggle-icon"
-                  aria-hidden="true"
-                ></i>
-              </Button>
-            </Popover>
+            />
           </ToolbarItem>
           <ToolbarItem className="pf-u-mr-md">
-            <Popover
-              className="topology-toolbar-item"
-              position={PopoverPosition.bottom}
-              enableFlip={false}
-              appendTo={() => document.getElementById("root")}
-              aria-label="Popover routers"
-              closeBtnAriaLabel="Close Popover routers"
-              bodyContent={
+            <DropdownPanel
+              title="Routers"
+              panel={
                 <RoutersComponent
                   arcColors={this.props.arcColors}
                   handleHoverRouter={this.props.handleHoverRouter}
                 />
               }
-            >
-              <Button className="topology-toolbar-button" value="routers">
-                <span className="pf-c-dropdown__toggle-text">Routers</span>
-                <i
-                  className="fas fa-caret-down pf-c-dropdown__toggle-icon"
-                  aria-hidden="true"
-                ></i>
-              </Button>
-            </Popover>
+            />
           </ToolbarItem>
         </ToolbarGroup>
       </Toolbar>
diff --git a/console/react/src/chord/chordToolbar.test.js b/console/react/src/chord/chordToolbar.test.js
new file mode 100644
index 0000000..2b01a42
--- /dev/null
+++ b/console/react/src/chord/chordToolbar.test.js
@@ -0,0 +1,47 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import ChordToolbar from "./chordToolbar";
+
+it('renders a ChordToolbar', () => {
+  const routerName = "testRouterName"
+  const props = {
+    isRate: true,
+    byAddress: true,
+    handleAddNotification: () => { },
+    handleChangeOption: () => { },
+    addresses: { testAddress: true },
+    chordColors: { testAddress: "#EAEAEA" },
+    arcColors: { testRouterName: "#EBAEBA" },
+    handleChangeAddress: () => handleChangeAddressCalled = true,
+    handleHoverAddress: (address, over) => handleHoverAddress = over,
+    handleHoverRouter: () => { }
+  }
+  const {
+    getByLabelText,
+    getByText,
+    getByTestId
+  } = render(<ChordToolbar {...props} />);
+
+  // the toolbar should be present
+  expect(getByTestId("chord-toolbar")).toBeInTheDocument();
+
+  // the options drowdown button should be present
+  const optionsButton = getByLabelText('button-for-Options');
+  expect(optionsButton).toBeInTheDocument();
+
+  fireEvent.click(optionsButton);
+  // clicking on the options buttons should show the address panel
+  const showByAddressCheckbox = getByLabelText("show by address");
+  expect(showByAddressCheckbox).toBeInTheDocument();
+
+  expect(getByText("testAddress")).toBeInTheDocument();
+
+  // the options drowdown button should be present
+  const routersButton = getByLabelText('button-for-Routers');
+  expect(routersButton).toBeInTheDocument();
+
+  fireEvent.click(routersButton);
+  // clicking on the Routers buttons should show the list of routers
+  expect(getByText(routerName)).toBeInTheDocument();
+
+})
diff --git a/console/react/src/chord/chordViewer.js b/console/react/src/chord/chordViewer.js
index bf3113a..f3fd40d 100644
--- a/console/react/src/chord/chordViewer.js
+++ b/console/react/src/chord/chordViewer.js
@@ -53,12 +53,12 @@ class ChordViewer extends Component {
     this.state.legendOptions = savedOptions
       ? JSON.parse(savedOptions)
       : {
-          isRate: true,
-          byAddress: true,
-          optionsOpen: true,
-          routersOpen: true,
-          addressesOpen: true
-        };
+        isRate: true,
+        byAddress: true,
+        optionsOpen: true,
+        routersOpen: true,
+        addressesOpen: true
+      };
     if (typeof this.state.legendOptions.optionsOpen === "undefined") {
       this.state.legendOptions["optionsOpen"] = true;
       this.state.legendOptions["routersOpen"] = true;
@@ -146,6 +146,7 @@ class ChordViewer extends Component {
       .append("svg")
       .attr("width", this.outerRadius * 2)
       .attr("height", this.outerRadius * 2)
+      .attr("aria-label", "chord-svg")
       .append("g")
       .attr("id", "circle")
       .attr("transform", `translate(${xtrans},${this.outerRadius})`);
@@ -198,7 +199,7 @@ class ChordViewer extends Component {
   //startOver();
   //};
   //d3.select(window).on('resize.updatesvg', updateWindow);
-  windowResized = () => {};
+  windowResized = () => { };
 
   // size the diagram based on the browser window size
   getRadius = () => {
@@ -504,7 +505,7 @@ class ChordViewer extends Component {
       .transition()
       .duration(duration / 2)
       .attrTween("d", this.arcTweenExit)
-      .each("end", function() {
+      .each("end", function () {
         d3.select(this)
           .node()
           .parentNode.remove();
@@ -677,7 +678,7 @@ class ChordViewer extends Component {
       });
     }
     let self = this;
-    chords.each(function(d) {
+    chords.each(function (d) {
       let chord = d3.select(this);
       // This version of d3 doesn't support multiple concurrent transitions on the same selection.
       // Since we want to animate the chord's path as well as its color, we create a dummy selection
@@ -724,12 +725,12 @@ class ChordViewer extends Component {
         oldChords[d.key] = d;
       });
     }
-    chords.each(function(d) {
+    chords.each(function (d) {
       let chord = d3.select(this);
       d3.select({})
         .transition()
         .duration(duration)
-        .tween("style:" + style, function() {
+        .tween("style:" + style, function () {
           let old = oldChords[d.key],
             interpolate;
           let oldColor = "#CCCCCC",
@@ -830,7 +831,7 @@ class ChordViewer extends Component {
 
   updateNow = () => {
     clearInterval(this.interval);
-    this.chordData.getMatrix().then(this.renderChord, function(e) {
+    this.chordData.getMatrix().then(this.renderChord, function (e) {
       console.log(ERROR_RENDERING + e);
     });
     this.interval = setInterval(this.doUpdate, TRANSITION_DURATION);
@@ -946,6 +947,7 @@ class ChordViewer extends Component {
   render() {
     return (
       <TopologyView
+        aria-label="chord-viewer"
         viewToolbar={
           <ChordToolbar
             handleOpenChange={this.handleOpenChange}
@@ -969,11 +971,11 @@ class ChordViewer extends Component {
       >
         <div ref={el => (this.chordRef = el)} className="qdrChord">
           {this.state.showEmpty ? (
-            <div id="noTraffic">{this.state.emptyText}</div>
+            <div aria-label="chord-no-traffic" id="noTraffic">{this.state.emptyText}</div>
           ) : (
-            <React.Fragment />
-          )}
-          <div id="chord"></div>
+              <React.Fragment />
+            )}
+          <div aria-label="chord-diagram" id="chord"></div>
           <div
             id="popover-div"
             className={this.state.showPopup ? "qdrPopup" : "qdrPopup hidden"}
diff --git a/console/react/src/chord/chordViewer.test.js b/console/react/src/chord/chordViewer.test.js
new file mode 100644
index 0000000..d494607
--- /dev/null
+++ b/console/react/src/chord/chordViewer.test.js
@@ -0,0 +1,21 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import ChordViewer from "./chordViewer";
+import { mockService } from "../qdrService.mock";
+
+it("renders the TopologyViewer component", () => {
+  const props = {
+    service: mockService({})
+  }
+  const { getByLabelText } = render(
+    <ChordViewer {...props} />
+  )
+
+  // make sure it rendered the component
+  const pfTopologyView = getByLabelText("chord-viewer");
+  expect(pfTopologyView).toBeInTheDocument();
+
+  // make sure it created the svg. Note: this will be the empty circle
+  // since there is no traffic
+  expect(getByLabelText("chord-svg")).toBeInTheDocument();
+});
diff --git a/console/react/src/chord/routersComponent.js b/console/react/src/chord/routersComponent.js
index d6f6a05..cebdac1 100644
--- a/console/react/src/chord/routersComponent.js
+++ b/console/react/src/chord/routersComponent.js
@@ -32,29 +32,29 @@ class RoutersComponent extends Component {
           {Object.keys(this.props.arcColors).length === 0 ? (
             <li key={`colors-empty`}>There is no traffic</li>
           ) : (
-            Object.keys(this.props.arcColors).map((router, i) => {
-              return (
-                <li
-                  key={`router-${i}`}
-                  className="legend-line"
-                  onMouseEnter={() =>
-                    this.props.handleHoverRouter(router, true)
-                  }
-                  onMouseLeave={() =>
-                    this.props.handleHoverRouter(router, false)
-                  }
-                >
-                  <span
-                    className="legend-color"
-                    style={{ backgroundColor: this.props.arcColors[router] }}
-                  ></span>
-                  <span className="legend-router legend-text" title={router}>
-                    {router}
-                  </span>
-                </li>
-              );
-            })
-          )}
+              Object.keys(this.props.arcColors).map((router, i) => {
+                return (
+                  <li
+                    key={`router-${i}`}
+                    className="legend-line"
+                    onMouseEnter={() =>
+                      this.props.handleHoverRouter(router, true)
+                    }
+                    onMouseLeave={() =>
+                      this.props.handleHoverRouter(router, false)
+                    }
+                  >
+                    <span
+                      className="legend-color"
+                      style={{ backgroundColor: this.props.arcColors[router] }}
+                    ></span>
+                    <span className="legend-router legend-text" title={router}>
+                      {router}
+                    </span>
+                  </li>
+                );
+              })
+            )}
         </ul>
       </React.Fragment>
     );
diff --git a/console/react/src/confirm.js b/console/react/src/confirm.js
deleted file mode 100644
index f865d33..0000000
--- a/console/react/src/confirm.js
+++ /dev/null
@@ -1,74 +0,0 @@
-import React from "react";
-import { Modal, Button } from "@patternfly/react-core";
-import PropTypes from "prop-types";
-
-class Confirm extends React.Component {
-  static propTypes = {
-    handleConfirm: PropTypes.func.isRequired,
-    buttonText: PropTypes.string.isRequired,
-    children: PropTypes.object.isRequired,
-    title: PropTypes.string.isRequired,
-    isDeleteDisabled: PropTypes.bool,
-    variant: PropTypes.string
-  };
-
-  constructor(props) {
-    super(props);
-    this.state = {
-      isModalOpen: false
-    };
-  }
-
-  handleModalToggle = () => {
-    this.setState({ isModalOpen: !this.state.isModalOpen });
-  };
-
-  handleModalConfirm = () => {
-    this.props.handleConfirm();
-    this.handleModalToggle();
-  };
-  handleModalCancel = () => {
-    this.handleModalToggle();
-  };
-  render() {
-    const { isModalOpen } = this.state;
-    const variant = this.props.variant || "primary";
-    return (
-      <React.Fragment>
-        <Button
-          isDisabled={this.props.isDeleteDisabled}
-          variant={variant}
-          onClick={this.handleModalToggle}
-        >
-          {this.props.buttonText}
-        </Button>
-        <Modal
-          isSmall
-          title={this.props.title}
-          isOpen={isModalOpen}
-          onClose={this.handleModalCancel}
-          actions={[
-            <Button
-              key="cancel"
-              variant="secondary"
-              onClick={this.handleModalCancel}
-            >
-              Cancel
-            </Button>,
-            <Button
-              key="confirm"
-              variant="primary"
-              onClick={this.handleModalConfirm}
-            >
-              Confirm
-            </Button>
-          ]}
-        >
-          {this.props.children}
-        </Modal>
-      </React.Fragment>
-    );
-  }
-}
-
-export default Confirm;
diff --git a/console/react/src/connect-form.js b/console/react/src/connect-form.js
index 37f4f2e..77ffc55 100644
--- a/console/react/src/connect-form.js
+++ b/console/react/src/connect-form.js
@@ -53,10 +53,12 @@ class ConnectForm extends React.Component {
         address: "localhost",
         port: "5673",
         username: "",
-        password: ""
+        password: "",
+        connectError: null
       };
     } else {
       savedValues = JSON.parse(savedValues);
+      savedValues.connectError = null;
     }
     this.setState(savedValues);
   };
@@ -67,6 +69,7 @@ class ConnectForm extends React.Component {
       const state2Save = JSON.parse(JSON.stringify(formValues));
       // don't save the password
       state2Save.password = "";
+      state2Save.connectError = null;
       localStorage.setItem(CONNECT_KEY, JSON.stringify(state2Save));
     });
   };
@@ -89,7 +92,10 @@ class ConnectForm extends React.Component {
           },
           e => {
             console.log(e);
-            this.setState({ connecting: false, connectError: e.msg });
+            this.setState({ connecting: false, connectError: e.message });
+            this.props.handleAddNotification("action", `Connect failed with message: ${e.message}`,
+              new Date(),
+              "danger")
           }
         );
       });
@@ -107,7 +113,8 @@ class ConnectForm extends React.Component {
       port,
       username,
       password,
-      connecting
+      connecting,
+      connectError
     } = this.state;
 
     return isShown ? (
@@ -181,8 +188,15 @@ class ConnectForm extends React.Component {
                   name="form-password"
                 />
               </FormGroup>
+              {connectError && (
+                <TextContent className="connect-error">
+                  <Text component={TextVariants.p}>
+                    {connectError}
+                  </Text>
+                </TextContent>
+              )}
               <ActionGroup>
-                <Button variant="primary" onClick={this.handleConnect}>
+                <Button variant="primary" data-testid="connect-button" onClick={this.handleConnect}>
                   {this.props.isConnected ? "Disconnect" : "Connect"}
                 </Button>
                 <Button variant="secondary" onClick={this.toggleDrawerHide}>
diff --git a/console/react/src/connect.test.js b/console/react/src/connect.test.js
new file mode 100644
index 0000000..8208e74
--- /dev/null
+++ b/console/react/src/connect.test.js
@@ -0,0 +1,31 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import ConnectForm from "./connect-form";
+import { QDRService } from "./qdrService";
+
+it("can create a service object", () => {
+  const service = new QDRService(() => { });
+});
+
+it("renders the connect form", () => {
+  render(
+    <ConnectForm />
+  );
+});
+
+it("connect form can be submitted", () => {
+  let connectFormRef = null;
+  const service = new QDRService(() => { });
+  const handleConnect = (fromPath, r) => { };
+  const handleAddNotification = (section, message, date, severity) => { }
+  render(
+    <ConnectForm
+      ref={el => (connectFormRef = el)}
+      service={service}
+      handleConnect={handleConnect}
+      handleAddNotification={handleAddNotification}
+      fromPath={"/test"}
+    />
+  );
+  connectFormRef.handleConnect();
+});
diff --git a/console/react/src/connectPage.js b/console/react/src/connectPage.js
index 32688f6..ac54e9c 100644
--- a/console/react/src/connectPage.js
+++ b/console/react/src/connectPage.js
@@ -21,14 +21,14 @@ class ConnectPage extends React.Component {
     if (nextState.showForm !== this.state.showForm) return true;
     const nextPathname =
       nextProps.location &&
-      nextProps.location.state &&
-      nextProps.location.state.pathname
+        nextProps.location.state &&
+        nextProps.location.state.pathname
         ? nextProps.location.state.pathname
         : undefined;
     const currentPathname =
       this.props.location &&
-      this.props.location.state &&
-      this.props.location.state.pathname
+        this.props.location.state &&
+        this.props.location.state.pathname
         ? this.props.location.state.pathname
         : undefined;
 
@@ -50,12 +50,13 @@ class ConnectPage extends React.Component {
               service={this.props.service}
               handleConnect={this.props.handleConnect}
               handleConnectCancel={this.handleConnectCancel}
+              handleAddNotification={this.props.handleAddNotification}
               fromPath={from.pathname}
               isConnectFormOpen={true}
             />
           ) : (
-            <React.Fragment />
-          )}
+              <React.Fragment />
+            )}
           <div className="left-content">
             <TextContent>
               <Text component="h1" className="console-banner">
diff --git a/console/react/src/connectPage.test.js b/console/react/src/connectPage.test.js
new file mode 100644
index 0000000..878a06e
--- /dev/null
+++ b/console/react/src/connectPage.test.js
@@ -0,0 +1,12 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import ConnectPage from "./connectPage";
+
+it("renders the connect page", () => {
+  const locationState = { location: { state: { pathname: "/fromTest", from: "/test" } } }
+  const config = { title: "Qpid Dispatch Router Test Console" }
+  const { getByText } = render(
+    <ConnectPage config={config} location={locationState} />
+  );
+  expect(getByText(config.title)).toBeInTheDocument();
+});
diff --git a/console/react/src/connecting.js b/console/react/src/connecting.js
deleted file mode 100644
index 0d24c3a..0000000
--- a/console/react/src/connecting.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2019 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import React from "react";
-
-class Connecting extends React.Component {
-  constructor(props) {
-    super(props);
-
-    this.state = {};
-  }
-
-  render() {
-    return <div id="connecting">Connecting</div>;
-  }
-}
-
-export default Connecting;
diff --git a/console/react/src/connectionClose.js b/console/react/src/connectionClose.js
index b27ba05..dae1253 100644
--- a/console/react/src/connectionClose.js
+++ b/console/react/src/connectionClose.js
@@ -88,16 +88,19 @@ class ConnectionClose extends React.Component {
           <Button
             className={`${this.props.asButton ? "" : "link-button"}`}
             onClick={this.handleModalToggle}
+            aria-label="connection-close-button"
           >
             Close
           </Button>
           <Modal
             isSmall
+            aria-label="connection-close-modal"
             title="Close conection"
             isOpen={isModalOpen}
             onClose={this.handleModalToggle}
             actions={[
               <Button
+                aria-label="connection-close-confirm"
                 key="confirm"
                 variant="primary"
                 onClick={this.closeConnection}
diff --git a/console/react/src/connectionClose.test.js b/console/react/src/connectionClose.test.js
new file mode 100644
index 0000000..06f8e8b
--- /dev/null
+++ b/console/react/src/connectionClose.test.js
@@ -0,0 +1,42 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import ConnectionClose from "./connectionClose";
+import { mockService } from "./qdrService.mock";
+
+it("renders the ConnectionClose component", () => {
+  let sendMethodCalled = false;
+  let handleAddNotificationCalled = false;
+  let notifyClickCalled = false;
+
+  const props = {
+    service: mockService({ onSendMethod: () => sendMethodCalled = true }),
+    handleAddNotification: () => handleAddNotificationCalled = true,
+    notifyClick: () => notifyClickCalled = true,
+    extraInfo: { rowData: { data: { name: "test record", role: "normal" } } }
+  }
+  const { getByLabelText, queryByLabelText } = render(
+    <ConnectionClose {...props} />
+  )
+
+  // the close button should be there
+  const closeButton = getByLabelText("connection-close-button");
+  expect(closeButton).toBeInTheDocument();
+
+  // the confirmation dialog should not be there
+  expect(queryByLabelText("connection-close-modal")).toBeNull();
+
+  // clicking the close button should display the confirmation dialog
+  fireEvent.click(closeButton);
+  expect(getByLabelText("connection-close-modal")).toBeInTheDocument();
+
+  const confirmButton = getByLabelText("connection-close-confirm");
+  expect(confirmButton).toBeInTheDocument();
+  fireEvent.click(confirmButton);
+
+  expect(sendMethodCalled).toBe(true);
+  setTimeout(() => {
+    expect(handleAddNotificationCalled).toBe(true);
+    expect(notifyClickCalled).toBe(true);
+  }, 1);
+
+});
diff --git a/console/react/src/contextMenu.test.js b/console/react/src/contextMenu.test.js
new file mode 100644
index 0000000..121f765
--- /dev/null
+++ b/console/react/src/contextMenu.test.js
@@ -0,0 +1,23 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import ContextMenu from "./contextMenuComponent"
+
+it("the contextMenu component renders and calls event handlers", () => {
+  let handleContextHideClicked = false;
+  let itemActionCalled = false;
+  const props = {
+    handleContextHide: () => handleContextHideClicked = true,
+    menuItems: [{ enabled: () => true, action: () => itemActionCalled = true }],
+    contextEventData: {},
+    contextEventPosition: [-1, -1]
+  }
+  const { getByLabelText } = render(
+    <ContextMenu {...props} />
+  );
+  const menuItem = getByLabelText("context-menu-item");
+  expect(menuItem).toBeInTheDocument();
+
+  fireEvent.click(menuItem);
+  expect(handleContextHideClicked).toBe(true);
+  expect(itemActionCalled).toBe(true);
+});
diff --git a/console/react/src/contextMenuComponent.js b/console/react/src/contextMenuComponent.js
index ffa4fba..d85516c 100644
--- a/console/react/src/contextMenuComponent.js
+++ b/console/react/src/contextMenuComponent.js
@@ -34,10 +34,11 @@ class ContextMenuComponent extends React.Component {
         item.endGroup || i === this.props.menuItems.length - 1
           ? " separator"
           : ""
-      } ${item.enabled(this.props.contextEventData) ? "" : " disabled"}`;
+        } ${item.enabled(this.props.contextEventData) ? "" : " disabled"}`;
 
       return (
         <li
+          aria-label={"context-menu-item"}
           key={`menu-item-${i}`}
           className={className}
           onClick={e => {
@@ -52,9 +53,9 @@ class ContextMenuComponent extends React.Component {
     const style =
       this.props.contextEventPosition[0] >= 0
         ? {
-            left: `${this.props.contextEventPosition[0]}px`,
-            top: `${this.props.contextEventPosition[1]}px`
-          }
+          left: `${this.props.contextEventPosition[0]}px`,
+          top: `${this.props.contextEventPosition[1]}px`
+        }
         : {};
     return (
       <ul
diff --git a/console/react/src/details/createTablePage.js b/console/react/src/details/createTablePage.js
index 7a4ceb5..cd14c5a 100644
--- a/console/react/src/details/createTablePage.js
+++ b/console/react/src/details/createTablePage.js
@@ -81,9 +81,9 @@ class CreateTablePage extends React.Component {
       this.dataSource = !detailsDataMap[this.entity]
         ? new defaultData(this.props.service, this.props.schema)
         : new detailsDataMap[this.entity](
-            this.props.service,
-            this.props.schema
-          );
+          this.props.service,
+          this.props.schema
+        );
       this.locationState = this.props.locationState;
 
       const attributes = this.dataSource.schemaAttributes(this.entity);
@@ -96,7 +96,6 @@ class CreateTablePage extends React.Component {
   }
 
   handleTextInputChange = (value, key) => {
-    console.log(`handleTextInputChange was passed ${value} ${key}`);
     const { record } = this.state;
     record[key] = value;
     this.setState({ record });
@@ -244,8 +243,6 @@ class CreateTablePage extends React.Component {
       )
         attributes[attr] = record[attr];
     }
-    console.log(`creating ${this.entity}`);
-    console.log(attributes);
 
     // call update
     this.props.service.management.connection
@@ -322,7 +319,7 @@ class CreateTablePage extends React.Component {
             <StackItem id="update-form">
               <Card>
                 <CardBody>
-                  <Form isHorizontal>{this.schemaToForm()}</Form>
+                  <Form isHorizontal aria-label="create-entity-form">{this.schemaToForm()}</Form>
                 </CardBody>
               </Card>
             </StackItem>
diff --git a/console/react/src/details/createTablePage.test.js b/console/react/src/details/createTablePage.test.js
new file mode 100644
index 0000000..0f3cc8c
--- /dev/null
+++ b/console/react/src/details/createTablePage.test.js
@@ -0,0 +1,34 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import CreateTablePage from "./createTablePage";
+import { mockService } from "../qdrService.mock";
+
+it('renders a CreateTablePage', () => {
+  let sendMethodCalled = false;
+  const service = mockService({ onSendMethod: () => sendMethodCalled = true });
+  const props = {
+    entity: "listener",
+    service,
+    schema: service.schema,
+    locationState: {},
+    routerId: Object.keys(service.management.topology._nodeInfo)[0],
+    handleAddNotification: () => { },
+    handleActionCancel: () => { }
+  }
+  const {
+    getByLabelText,
+    getByText
+  } = render(<CreateTablePage {...props} />);
+
+  // the create form should be present
+  const notificationIcon = getByLabelText("create-entity-form");
+  expect(notificationIcon).toBeInTheDocument();
+
+  // there should be a create button
+  const createButton = getByText("Create");
+  expect(createButton).toBeInTheDocument();
+
+  // clicking the create button should submit the method
+  fireEvent.click(createButton);
+  expect(sendMethodCalled).toBe(true);
+})
\ No newline at end of file
diff --git a/console/react/src/details/deleteEntity.js b/console/react/src/details/deleteEntity.js
index 01e1912..8313fbf 100644
--- a/console/react/src/details/deleteEntity.js
+++ b/console/react/src/details/deleteEntity.js
@@ -31,7 +31,6 @@ class DeleteEntity extends React.Component {
   }
 
   handleModalShow = () => {
-    console.log("handleModalShow DELETE");
     this.setState({ isModalOpen: true, closed: false });
   };
 
diff --git a/console/react/src/details/enitiesPage.js b/console/react/src/details/enitiesPage.js
index f80b02f..6416b62 100644
--- a/console/react/src/details/enitiesPage.js
+++ b/console/react/src/details/enitiesPage.js
@@ -58,11 +58,20 @@ class EntitiesPage extends React.Component {
     this.setState({ entity, showTable: "entities" });
   };
 
+  fixNull = rec => {
+    for (const attr in rec) {
+      if (rec[attr] === null) {
+        rec[attr] = "";
+      }
+      return rec;
+    };
+  }
+
   handleEntityAction = (action, record) => {
     if (action === "Done") action = "entities";
     this.setState({
       actionState: {
-        currentRecord: record,
+        currentRecord: this.fixNull(record),
         entity: this.props.entity
       },
       showTable: action
diff --git a/console/react/src/details/entityListTable.js b/console/react/src/details/entityListTable.js
index 2ff0924..c494540 100644
--- a/console/react/src/details/entityListTable.js
+++ b/console/react/src/details/entityListTable.js
@@ -358,9 +358,6 @@ class EntityListTable extends React.Component {
 
   // an action was clicked on a row's kebab menu
   handleAction = ({ action, rowData }) => {
-    console.log(`handleActions ${action}`);
-    console.log(rowData);
-
     if (action === "UPDATE") {
       this.props.handleEntityAction(action, rowData.data);
     } else {
diff --git a/console/react/src/details/schema/schemaPage.js b/console/react/src/details/schema/schemaPage.js
index 8cd5e6c..b49b612 100644
--- a/console/react/src/details/schema/schemaPage.js
+++ b/console/react/src/details/schema/schemaPage.js
@@ -145,6 +145,7 @@ class SchemaPage extends React.Component {
         !itemInfo.hidden && (
           <div
             key={itemInfo.key}
+            data-testid={itemInfo.key}
             className={`list-group-item-container container-fluid`}
             onClick={event => this.toggleChildren(event, itemInfo)}
           >
@@ -210,7 +211,7 @@ class SchemaPage extends React.Component {
             <Card>
               <CardBody>
                 <div className="container-fluid">
-                  <div className="list-group tree-list-view-pf">
+                  <div className="list-group tree-list-view-pf" data-testid="root">
                     {TreeItem(this.state.root)}
                   </div>
                 </div>
diff --git a/console/react/src/details/schema/schemaPage.test.js b/console/react/src/details/schema/schemaPage.test.js
new file mode 100644
index 0000000..5e39cc0
--- /dev/null
+++ b/console/react/src/details/schema/schemaPage.test.js
@@ -0,0 +1,29 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import { mockService } from "../../qdrService.mock";
+import SchemaPage from "./schemaPage";
+
+it('renders a SchemaPage', () => {
+  const service = mockService({});
+  const props = {
+    schema: service.schema
+  }
+  const {
+    getByTestId,
+    queryByTestId
+  } = render(<SchemaPage {...props} />);
+
+  // the root node should be present
+  const root = getByTestId("entities");
+  expect(root).toBeInTheDocument();
+
+  // the root node should be expanded by default
+  // therefore the address entity should be present
+  let addressEntity = getByTestId("address");
+  expect(addressEntity).toBeInTheDocument();
+
+  // clicking on the root should collapse the tree
+  fireEvent.click(root);
+  addressEntity = queryByTestId("address");
+  expect(addressEntity).toBeNull();
+})
\ No newline at end of file
diff --git a/console/react/src/details/updateEntity.js b/console/react/src/details/updateEntity.js
index 01c4abb..4d1fac9 100644
--- a/console/react/src/details/updateEntity.js
+++ b/console/react/src/details/updateEntity.js
@@ -31,8 +31,6 @@ class UpdateEntity extends React.Component {
   };
 
   render() {
-    console.log("rendering update button");
-    console.log(this.props);
     return <Button onClick={this.handleClick}>Update</Button>;
   }
 }
diff --git a/console/react/src/details/updateTablePage.js b/console/react/src/details/updateTablePage.js
index d738fef..86c4a29 100644
--- a/console/react/src/details/updateTablePage.js
+++ b/console/react/src/details/updateTablePage.js
@@ -65,9 +65,9 @@ class UpdateTablePage extends React.Component {
       this.dataSource = !detailsDataMap[this.entity]
         ? new defaultData(this.props.service, this.props.schema)
         : new detailsDataMap[this.entity](
-            this.props.service,
-            this.props.schema
-          );
+          this.props.service,
+          this.props.schema
+        );
     }
 
     this.state = {
@@ -85,26 +85,11 @@ class UpdateTablePage extends React.Component {
       redirectPath: "/dashboard",
       lastUpdated: new Date(),
       changes: false,
-      record: this.fixNull(this.props.locationState.currentRecord)
+      record: this.props.locationState.currentRecord
     };
     this.originalRecord = utils.copy(this.state.record);
   }
 
-  fixNull = rec => {
-    const record = utils.copy(rec);
-    const attributes = this.dataSource.schemaAttributes(this.entity);
-    for (const attr in record) {
-      if (record[attr] === null) {
-        if (attributes[attr].type === "string") {
-          record[attr] = "";
-        } else if (attributes[attr].type === "integer") {
-          record[attr] = 0;
-        }
-      }
-    }
-    return record;
-  };
-
   handleTextInputChange = (value, key) => {
     const { record } = this.state;
     record[key] = value;
@@ -127,6 +112,14 @@ class UpdateTablePage extends React.Component {
       if (type === "list") readOnly = true;
       if (type === "integer" && attribute.graph) readOnly = true;
       let required = attribute.required;
+      if (record[attributeKey] === null) {
+        if (attribute.type === "string")
+          record[attributeKey] = "";
+        if (attribute.type === "boolean")
+          record[attributeKey] = false;
+        if (attribute.type === "integer")
+          record[attributeKey] = 0;
+      }
       const value = record[attributeKey];
       if (
         this.dataSource.updateMetaData &&
@@ -236,9 +229,11 @@ class UpdateTablePage extends React.Component {
     for (const attr in record) {
       if (record[attr] !== this.originalRecord[attr]) {
         attributes[attr] = record[attr];
-      } else if (attr === "outputFile")
+      }
+      if (attr === "outputFile") {
         attributes["outputFile"] =
           record.outputFile === "" ? null : record.outputFile;
+      }
     }
     // call update
     this.props.service.management.connection
@@ -323,7 +318,7 @@ class UpdateTablePage extends React.Component {
             <StackItem id="update-form">
               <Card>
                 <CardBody>
-                  <Form isHorizontal>{this.schemaToForm()}</Form>
+                  <Form isHorizontal aria-label="update-entity-form">{this.schemaToForm()}</Form>
                 </CardBody>
               </Card>
             </StackItem>
diff --git a/console/react/src/details/updateTablePage.test.js b/console/react/src/details/updateTablePage.test.js
new file mode 100644
index 0000000..c2bb740
--- /dev/null
+++ b/console/react/src/details/updateTablePage.test.js
@@ -0,0 +1,40 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import { mockService } from "../qdrService.mock";
+import UpdateTablePage from "./updateTablePage";
+
+it('renders a UpdateTablePage', () => {
+  let sendMethodCalled = false;
+  const service = mockService({ onSendMethod: () => sendMethodCalled = true });
+  const props = {
+    entity: "log",
+    service,
+    schema: service.schema,
+    locationState: { currentRecord: { name: "test.log.name", enable: "" } },
+    routerId: Object.keys(service.management.topology._nodeInfo)[0],
+    handleAddNotification: () => { },
+    handleActionCancel: () => { }
+  }
+  const {
+    getByLabelText,
+    getByText
+  } = render(<UpdateTablePage {...props} />);
+
+  // the update form should be present
+  expect(getByLabelText("update-entity-form")).toBeInTheDocument();
+
+  // there should be a create button
+  const updateButton = getByText("Update");
+  expect(updateButton).toBeInTheDocument();
+
+  // clicking the create button should do nothing
+  // since it is disabled until a form field changes
+  fireEvent.click(updateButton);
+  expect(sendMethodCalled).toBe(false);
+
+  // change a form field and try the update button again
+  fireEvent.change(getByLabelText(/enable/i), { target: { value: 'debug' } });
+  fireEvent.click(updateButton);
+  expect(sendMethodCalled).toBe(true);
+
+})
\ No newline at end of file
diff --git a/console/react/src/detailsTablePage.js b/console/react/src/detailsTablePage.js
index 44d726d..dcc4492 100644
--- a/console/react/src/detailsTablePage.js
+++ b/console/react/src/detailsTablePage.js
@@ -77,9 +77,9 @@ class DetailTablesPage extends React.Component {
         this.dataSource = !detailsDataMap[this.entity]
           ? new defaultData(this.props.service, this.props.schema)
           : new detailsDataMap[this.entity](
-              this.props.service,
-              this.props.schema
-            );
+            this.props.service,
+            this.props.schema
+          );
       } else {
         this.dataSource = new dataMap[this.entity](
           this.props.service,
@@ -187,8 +187,6 @@ class DetailTablesPage extends React.Component {
     }
 
     const actionsButtons = () => {
-      console.log("generating actionButtons for detailsTablePage");
-      console.log(this.locationState().currentRecord);
       return this.dataSource.detailActions(
         this.entity,
         this.props,
diff --git a/console/react/src/detailsTablePage.test.js b/console/react/src/detailsTablePage.test.js
new file mode 100644
index 0000000..300678e
--- /dev/null
+++ b/console/react/src/detailsTablePage.test.js
@@ -0,0 +1,19 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import DetailsTablePage from "./detailsTablePage";
+
+it("renders the detailsTablePage", () => {
+  const entity = "testEntity"
+  const props = {
+    entity,
+    locationState: { currentRecord: { name: "test" } },
+    details: true,
+    schema: { entityTypes: { testEntity: { attributes: [], operations: [] } } },
+    service: { management: { topology: { fetchEntities: () => Promise.resolve([]) } } }
+  }
+  const { getByLabelText } = render(
+    <DetailsTablePage {...props} />
+  );
+  const table = getByLabelText(entity);
+  expect(table).toBeInTheDocument();
+});
diff --git a/console/react/src/dropdownPanel.js b/console/react/src/dropdownPanel.js
new file mode 100644
index 0000000..f2ab1ff
--- /dev/null
+++ b/console/react/src/dropdownPanel.js
@@ -0,0 +1,70 @@
+import React from 'react';
+import { Accordion, AccordionItem, AccordionContent, AccordionToggle } from '@patternfly/react-core';
+
+class DropdownPanel extends React.Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      expanded: false
+    };
+  }
+
+  componentDidMount() {
+    document.addEventListener("mousedown", this.handleClickOutside);
+  }
+
+  componentWillUnmount() {
+    document.removeEventListener("mousedown", this.handleClickOutside);
+  }
+
+  handleClickOutside = event => {
+    if (this.accordionRef && !this.accordionRef.contains(event.target)) {
+      this.close();
+    }
+  };
+
+  close = () => {
+    this.setState({ expanded: false });
+  }
+
+  onToggle = () => {
+    if (this.state.expanded) {
+      this.close();
+    } else {
+      this.setState({ expanded: true })
+    }
+  };
+
+  render() {
+    return (
+      <div
+        ref={el => (this.accordionRef = el)}
+      >
+        <Accordion
+          className="dropdown-panel-accordion"
+          asDefinitionList>
+          <AccordionItem>
+            <AccordionToggle
+              id={this.props.title}
+              className="dropdown-panel-toggle"
+              onClick={this.onToggle}
+              isExpanded={this.state.expanded}
+              aria-label={`button-for-${this.props.title}`}
+            >
+              {this.props.title}
+            </AccordionToggle>
+            <AccordionContent
+              isHidden={!this.state.expanded}
+            >
+              <div className="options-panel pf-u-box-shadow-md">
+                {this.props.panel}
+              </div>
+            </AccordionContent>
+          </AccordionItem>
+        </Accordion>
+      </div>
+    );
+  }
+}
+
+export default DropdownPanel;
diff --git a/console/react/src/layout.js b/console/react/src/layout.js
index ebc6f43..c1c2624 100644
--- a/console/react/src/layout.js
+++ b/console/react/src/layout.js
@@ -50,18 +50,16 @@ import { PowerOffIcon } from "@patternfly/react-icons";
 import DropdownMenu from "./DropdownMenu";
 import ConnectPage from "./connectPage";
 import DashboardPage from "./overview/dashboard/dashboardPage";
-import OverviewTablePage from "./overview/overviewTablePage";
+import OverviewPage from "./overview/overviewPage";
 import DetailsTablePage from "./detailsTablePage";
 import EntitiesPage from "./details/enitiesPage";
 import TopologyPage from "./topology/topologyPage";
 import MessageFlowPage from "./chord/chordPage";
 import SchemaPage from "./details/schema/schemaPage";
 import LogDetails from "./overview/logDetails";
-import { QDRService } from "./qdrService";
 import ConnectForm from "./connect-form";
 import NotificationDrawer from "./notificationDrawer";
 import { utils } from "./amqp/utilities";
-const avatarImg = require("./assets/img_avatar.svg");
 
 class PageLayout extends React.Component {
   constructor(props) {
@@ -77,9 +75,10 @@ class PageLayout extends React.Component {
       user: "anonymous"
     };
     this.isDropdownOpen = false;
+    this.isConnectFormOpen = false;
 
-    this.hooks = { setLocation: this.setLocation };
-    this.service = new QDRService(this.hooks);
+    this.service = this.props.service;
+    this.service.setHooks({ setLocation: this.setLocation });
     this.nav = {
       overview: [
         { name: "dashboard" },
@@ -182,7 +181,8 @@ class PageLayout extends React.Component {
   };
 
   handleConnectCancel = () => {
-    this.connectFormRef.show(false);
+    if (this.connectFormRef)
+      this.connectFormRef.show(false);
     this.isConnectFormOpen = false;
   };
 
@@ -314,7 +314,7 @@ class PageLayout extends React.Component {
         className="topology-header"
         logo={<span className="logo-text">{this.props.config.title}</span>}
         toolbar={PageToolbar}
-        avatar={<Avatar src={avatarImg} alt="Avatar image" />}
+        avatar={<Avatar src="./assets/img_avatar.svg" alt="Avatar image" />}
         showNavToggle
         onNavToggle={
           isMobileView ? this.onNavToggleMobile : this.onNavToggleDesktop
@@ -354,10 +354,10 @@ class PageLayout extends React.Component {
               {...more}
             />
           ) : (
-            <Redirect
-              to={{ pathname: "/login", state: { from: props.location } }}
-            />
-          )
+              <Redirect
+                to={{ pathname: "/login", state: { from: props.location } }}
+              />
+            )
         }
       />
     );
@@ -398,13 +398,13 @@ class PageLayout extends React.Component {
           skipToContent={PageSkipToContent}
           mainContainerId={pageId}
         >
-          {connectForm()}
+          {this.isConnectFormOpen && connectForm()}
           <Switch>
             <PrivateRoute path="/" exact component={DashboardPage} />
             <PrivateRoute path="/dashboard" component={DashboardPage} />
             <PrivateRoute
               path="/overview/:entity"
-              component={OverviewTablePage}
+              component={OverviewPage}
             />
             <PrivateRoute
               path="/details"
@@ -425,9 +425,11 @@ class PageLayout extends React.Component {
               render={props => (
                 <ConnectPage
                   {...props}
+                  fromPath={"/"}
                   service={this.service}
                   config={this.props.config}
                   handleConnect={this.handleConnect}
+                  handleAddNotification={this.handleAddNotification}
                 />
               )}
             />
diff --git a/console/react/src/layout.test.js b/console/react/src/layout.test.js
new file mode 100644
index 0000000..8f75b15
--- /dev/null
+++ b/console/react/src/layout.test.js
@@ -0,0 +1,33 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import PageLayout from "./layout";
+import { mockService } from "./qdrService.mock";
+
+it('allows the user to login successfully', async () => {
+  const title = "Test Layout Page";
+  const props = {
+    config: { title: title },
+    service: mockService({})
+  };
+
+  const {
+    getAllByText,
+    getByLabelText,
+    findByLabelText,
+    getByTestId } = render(<PageLayout {...props} />);
+
+  // the correct title should be found
+  expect(getAllByText(title));
+
+  // fill out the form
+  fireEvent.change(getByLabelText(/address/i), { target: { value: 'localhost' } });
+  fireEvent.change(getByLabelText(/port/i), { target: { value: '5673' } });
+
+  fireEvent.click(getByTestId("connect-button"));
+
+  // wait for the dashboard
+  // to show up before continuing with our assertions.
+  const dashboard = await findByLabelText('dashboard-page');
+
+  expect(dashboard).toHaveTextContent(/Router network statistics/i);
+})
\ No newline at end of file
diff --git a/console/react/src/notificationDrawer.js b/console/react/src/notificationDrawer.js
index 583d678..9a947c5 100644
--- a/console/react/src/notificationDrawer.js
+++ b/console/react/src/notificationDrawer.js
@@ -40,7 +40,7 @@ class NotificationDrawer extends React.Component {
   constructor(props) {
     super(props);
     this.state = {
-      isShown: false, // is the drawer shown
+      isShown: false,  // is the drawer shown
       expanded: false, // is the drawer wide
       isAnyUnread: false,
       accordionSections: {
@@ -108,8 +108,7 @@ class NotificationDrawer extends React.Component {
 
   toggleDrawer = sectionKey => {
     const { accordionSections } = this.state;
-    accordionSections[sectionKey].isOpen = !accordionSections[sectionKey]
-      .isOpen;
+    accordionSections[sectionKey].isOpen = !accordionSections[sectionKey].isOpen;
     this.setState(accordionSections);
   };
 
@@ -160,8 +159,8 @@ class NotificationDrawer extends React.Component {
           {this.state.expanded ? (
             <AngleDoubleRightIcon />
           ) : (
-            <AngleDoubleLeftIcon />
-          )}
+              <AngleDoubleLeftIcon />
+            )}
         </Button>
         <h3 className="text-center">Notifications Drawer</h3>
         <Button variant="plain" aria-label="close" onClick={this.close}>
@@ -203,7 +202,7 @@ class NotificationDrawer extends React.Component {
               {Object.keys(this.state.accordionSections).map(sectionKey => {
                 const section = this.state.accordionSections[sectionKey];
                 return (
-                  <AccordionItem key={`${sectionKey}-item`}>
+                  <AccordionItem aria-label="notification-item" key={`${sectionKey}-item`}>
                     <AccordionToggle
                       onClick={() => this.toggleDrawer(sectionKey)}
                       isExpanded={section.isOpen}
@@ -213,10 +212,10 @@ class NotificationDrawer extends React.Component {
                       {section.title}
                       <span className="panel-counter">{`${
                         section.events.filter(e => !e.isRead).length
-                      } new ${safePlural(
-                        section.events.filter(e => !e.isRead).length,
-                        "event"
-                      )}`}</span>
+                        } new ${safePlural(
+                          section.events.filter(e => !e.isRead).length,
+                          "event"
+                        )}`}</span>
                     </AccordionToggle>
                     <AccordionContent
                       key={`${sectionKey}-content`}
@@ -226,7 +225,7 @@ class NotificationDrawer extends React.Component {
                       <div
                         className={`panel-body ${
                           section.events.length === 0 ? "hidden" : ""
-                        }`}
+                          }`}
                       >
                         {section.events.map((event, i) => {
                           return (
@@ -234,7 +233,7 @@ class NotificationDrawer extends React.Component {
                               key={`${sectionKey}-event-${i}`}
                               className={`drawer-pf-notification ${
                                 event.isRead ? "" : "unread"
-                              }`}
+                                }`}
                               onClick={() => this.markAsRead(event)}
                             >
                               {severityIcon(event)}
@@ -254,7 +253,7 @@ class NotificationDrawer extends React.Component {
                       <div
                         className={`blank-slate-pf ${
                           section.events.length === 0 ? "" : "hidden"
-                        }`}
+                          }`}
                       >
                         <div className="blank-slate-pf-icon">
                           <span className="pficon pficon-info"></span>
@@ -264,13 +263,13 @@ class NotificationDrawer extends React.Component {
                       <div
                         className={`drawer-pf-action ${
                           section.events.length > 0 ? "" : "hidden"
-                        }`}
+                          }`}
                       >
                         <div className="drawer-pf-action-link">
                           <button
                             className={`btn btn-link ${
                               this.hasUnread(section) ? "" : "disabled"
-                            }`}
+                              }`}
                             onClick={() => this.markAllRead(sectionKey)}
                           >
                             Mark All Read
diff --git a/console/react/src/notificationDrawer.test.js b/console/react/src/notificationDrawer.test.js
new file mode 100644
index 0000000..574720e
--- /dev/null
+++ b/console/react/src/notificationDrawer.test.js
@@ -0,0 +1,34 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import NotificationDrawer from "./notificationDrawer";
+
+it('renders without crashing', () => {
+  render(<NotificationDrawer />);
+})
+
+it('renders a notification icon', () => {
+  let notificationRef = null;
+  const {
+    getByLabelText,
+    getByText
+  } = render(<NotificationDrawer
+    ref={el => (notificationRef = el)}
+  />);
+
+  // the notifications icon should be present
+  const notificationIcon = getByLabelText("Notifications");
+  expect(notificationIcon).toBeInTheDocument();
+
+  // add a notification
+  const section = "action";
+  const message = "test message";
+  const timestamp = new Date();
+  const severity = "info";
+  notificationRef.addNotification({ section, message, timestamp, severity })
+
+  // click the notification icon
+  fireEvent.click(notificationIcon);
+
+  // there should now be a single notification-item
+  expect(getByText("1 new event")).toBeInTheDocument();
+})
\ No newline at end of file
diff --git a/console/react/src/overview/dashboard/chartBase.js b/console/react/src/overview/dashboard/chartBase.js
index 903bf60..c7478b7 100644
--- a/console/react/src/overview/dashboard/chartBase.js
+++ b/console/react/src/overview/dashboard/chartBase.js
@@ -35,6 +35,7 @@ class ChartBase extends React.Component {
       this.state.rates.push(0);
     }
     this.title = "Override me";
+    this.ariaLabel = "base-chart";
     this.isRate = false;
   }
 
@@ -98,7 +99,7 @@ class ChartBase extends React.Component {
 
   render() {
     return (
-      <OverviewChart data={this.data()} title={this.title} style={this.style} />
+      <OverviewChart ariaLabel={this.ariaLabel} data={this.data()} title={this.title} style={this.style} />
     );
   }
 }
diff --git a/console/react/src/overview/dashboard/dashboardPage.js b/console/react/src/overview/dashboard/dashboardPage.js
index a7fca39..7183076 100644
--- a/console/react/src/overview/dashboard/dashboardPage.js
+++ b/console/react/src/overview/dashboard/dashboardPage.js
@@ -46,6 +46,7 @@ class DashboardPage extends React.Component {
       <PageSection
         variant={PageSectionVariants.light}
         className="overview-charts-page"
+        aria-label="dashboard-page"
       >
         <Stack gutter="md">
           <StackItem>
@@ -60,7 +61,7 @@ class DashboardPage extends React.Component {
                           onClick={() => this.setTimePeriod(60)}
                           className={`pf-c-nav__item ${
                             this.state.timePeriod === 60 ? "selected" : ""
-                          }`}
+                            }`}
                         >
                           Min
                         </li>
@@ -68,7 +69,7 @@ class DashboardPage extends React.Component {
                           onClick={() => this.setTimePeriod(60 * 60)}
                           className={`pf-c-nav__item ${
                             this.state.timePeriod === 60 ? "" : "selected"
-                          }`}
+                            }`}
                         >
                           Hour
                         </li>
diff --git a/console/react/src/overview/dashboard/dashboardPage.test.js b/console/react/src/overview/dashboard/dashboardPage.test.js
new file mode 100644
index 0000000..3269f7d
--- /dev/null
+++ b/console/react/src/overview/dashboard/dashboardPage.test.js
@@ -0,0 +1,16 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import DashboardPage from "./dashboardPage";
+import { mockService } from "../../qdrService.mock";
+
+it("renders the DashboardPage component", () => {
+  const props = {
+    service: mockService({})
+  }
+  const { getByLabelText } = render(
+    <DashboardPage {...props} />
+  )
+
+  // make sure it rendered the component
+  expect(getByLabelText("dashboard-page")).toBeInTheDocument();
+});
diff --git a/console/react/src/overview/dashboard/inflightChart.js b/console/react/src/overview/dashboard/inflightChart.js
index 0da4ac6..9d489e1 100644
--- a/console/react/src/overview/dashboard/inflightChart.js
+++ b/console/react/src/overview/dashboard/inflightChart.js
@@ -28,6 +28,7 @@ class InflightChart extends ChartBase {
     this.color = d3.rgb(ChartThemeColor.green);
     this.setStyle(this.color, 0.3);
     this.isRate = false;
+    this.ariaLabel = "inflight-chart";
   }
 
   updateData = () => {
@@ -48,7 +49,7 @@ class InflightChart extends ChartBase {
             inflight +=
               result.linkType === "endpoint" && result.linkDir === "out"
                 ? parseInt(result.unsettledCount) +
-                  parseInt(result.undeliveredCount)
+                parseInt(result.undeliveredCount)
                 : 0;
           }
         }
diff --git a/console/react/src/overview/dashboard/inflightChart.test.js b/console/react/src/overview/dashboard/inflightChart.test.js
new file mode 100644
index 0000000..ce2177c
--- /dev/null
+++ b/console/react/src/overview/dashboard/inflightChart.test.js
@@ -0,0 +1,16 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import InflightChart from "./inflightChart";
+import { mockService } from "../../qdrService.mock";
+
+it("renders the InflightChart component", () => {
+  const props = {
+    service: mockService({})
+  }
+  const { getByLabelText } = render(
+    <InflightChart {...props} />
+  )
+
+  // make sure it rendered the component
+  setTimeout(() => expect(getByLabelText("inflight-chart")).toBeInTheDocument(), 1);
+});
diff --git a/console/react/src/overview/dashboard/overviewChart.js b/console/react/src/overview/dashboard/overviewChart.js
index 456ca80..6dc4f6e 100644
--- a/console/react/src/overview/dashboard/overviewChart.js
+++ b/console/react/src/overview/dashboard/overviewChart.js
@@ -50,22 +50,23 @@ class OverviewChart extends React.Component {
           {width === 0 ? (
             <React.Fragment />
           ) : (
-            <ChartGroup
-              ariaDesc="overview chart"
-              ariaTitle={this.props.title}
-              height={100}
-              padding={0}
-              width={width}
-              themeColor={this.props.color}
-            >
-              <ChartArea
-                data={this.props.data}
-                style={{
-                  data: this.props.style
-                }}
-              />
-            </ChartGroup>
-          )}
+              <ChartGroup
+                aria-label={this.props.ariaLabel}
+                ariaDesc="overview chart"
+                ariaTitle={this.props.title}
+                height={100}
+                padding={0}
+                width={width}
+                themeColor={this.props.color}
+              >
+                <ChartArea
+                  data={this.props.data}
+                  style={{
+                    data: this.props.style
+                  }}
+                />
+              </ChartGroup>
+            )}
         </div>
         <div className="dashboard-stat">
           <div className="deliveries-stat">
diff --git a/console/react/src/overview/dashboard/throughputChart.js b/console/react/src/overview/dashboard/throughputChart.js
index 2f2fb26..291e75e 100644
--- a/console/react/src/overview/dashboard/throughputChart.js
+++ b/console/react/src/overview/dashboard/throughputChart.js
@@ -26,6 +26,7 @@ class ThroughputChart extends ChartBase {
     this.color = "#99C2EB"; //ChartThemeColor.blue;
     this.setStyle(this.color);
     this.isRate = true;
+    this.ariaLabel = "throughput-chart";
   }
 
   updateData = () => {
diff --git a/console/react/src/overview/dashboard/throughputChart.test.js b/console/react/src/overview/dashboard/throughputChart.test.js
new file mode 100644
index 0000000..e74f9b1
--- /dev/null
+++ b/console/react/src/overview/dashboard/throughputChart.test.js
@@ -0,0 +1,20 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import ThroughputChart from "./throughputChart";
+import { mockService } from "../../qdrService.mock";
+
+it("renders the ThroughputChart component", () => {
+  const props = {
+    service: mockService({})
+  }
+  const { getByLabelText, queryByLabelText } = render(
+    <ThroughputChart {...props} />
+  )
+
+  // the component should initially render
+  // blank until it gets the contianer's width.
+  expect(queryByLabelText("throughput-chart")).toBe(null);
+
+  // yeild, so that this componentDidMount method can fire
+  setTimeout(() => expect(getByLabelText("throughput-chart")).toBeInTheDocument(), 1);
+});
diff --git a/console/react/src/overview/overviewTablePage.js b/console/react/src/overview/overviewPage.js
similarity index 95%
rename from console/react/src/overview/overviewTablePage.js
rename to console/react/src/overview/overviewPage.js
index 9cd726b..023e37d 100644
--- a/console/react/src/overview/overviewTablePage.js
+++ b/console/react/src/overview/overviewPage.js
@@ -31,7 +31,7 @@ import { Card, CardBody } from "@patternfly/react-core";
 import OverviewTable from "./overviewTable";
 import Updated from "../updated";
 
-class OverviewTablePage extends React.Component {
+class OverviewPage extends React.Component {
   constructor(props) {
     super(props);
     this.state = { loading: false, lastUpdated: new Date() };
@@ -45,6 +45,7 @@ class OverviewTablePage extends React.Component {
       <PageSection
         variant={PageSectionVariants.light}
         className="overview-table-page"
+        data-testid="overview-page"
       >
         <Stack>
           <StackItem className="overview-header">
@@ -71,4 +72,4 @@ class OverviewTablePage extends React.Component {
   }
 }
 
-export default OverviewTablePage;
+export default OverviewPage;
diff --git a/console/react/src/overview/overviewPage.test.js b/console/react/src/overview/overviewPage.test.js
new file mode 100644
index 0000000..6edafb9
--- /dev/null
+++ b/console/react/src/overview/overviewPage.test.js
@@ -0,0 +1,18 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import { mockService } from "../qdrService.mock";
+import OverviewPage from "./overviewPage";
+
+it("renders the overview page", () => {
+  const entity = "logs";
+  const props = {
+    service: mockService({}),
+    location: { pathname: `/overview/${entity}` },
+    lastUpdated: () => { }
+  }
+
+  const { getByTestId } = render(
+    <OverviewPage {...props} />
+  );
+  expect(getByTestId("overview-page")).toBeInTheDocument();
+});
diff --git a/console/react/src/overview/overviewTable.js b/console/react/src/overview/overviewTable.js
index 98f1a8a..e412370 100644
--- a/console/react/src/overview/overviewTable.js
+++ b/console/react/src/overview/overviewTable.js
@@ -35,9 +35,9 @@ import { dataMap } from "./entityData";
 // we will have saved state info in props.location.state
 const propFromLocation = (props, which, defaultValue) =>
   props &&
-  props.location &&
-  props.location.state &&
-  typeof props.location.state[which] !== "undefined"
+    props.location &&
+    props.location.state &&
+    typeof props.location.state[which] !== "undefined"
     ? props.location.state[which]
     : defaultValue;
 
diff --git a/console/react/src/overview/overviewTable.test.js b/console/react/src/overview/overviewTable.test.js
new file mode 100644
index 0000000..d8e119e
--- /dev/null
+++ b/console/react/src/overview/overviewTable.test.js
@@ -0,0 +1,19 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import OverviewTable from "./overviewTable";
+import { mockService } from "../qdrService.mock";
+
+it("renders the OverviewTable component", () => {
+  const entity = "routers";
+  const props = {
+    service: mockService({}),
+    location: { pathname: `/overview/${entity}` },
+    lastUpdated: () => { }
+  }
+  const { getByLabelText } = render(
+    <OverviewTable {...props} />
+  )
+
+  // make sure it rendered the component
+  expect(getByLabelText(entity)).toBeInTheDocument();
+});
diff --git a/console/react/src/qdrPopup.js b/console/react/src/qdrPopup.js
index 5ee9b62..ba1ad28 100644
--- a/console/react/src/qdrPopup.js
+++ b/console/react/src/qdrPopup.js
@@ -7,7 +7,7 @@ class QDRPopup extends React.Component {
   }
 
   render() {
-    return <div dangerouslySetInnerHTML={{ __html: this.props.content }} />;
+    return <div aria-label="popup" dangerouslySetInnerHTML={{ __html: this.props.content }} />;
   }
 }
 
diff --git a/console/react/src/qdrPopup.test.js b/console/react/src/qdrPopup.test.js
new file mode 100644
index 0000000..c9c18c5
--- /dev/null
+++ b/console/react/src/qdrPopup.test.js
@@ -0,0 +1,15 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import QDRPopup from "./qdrPopup";
+
+it("the popup component renders HTML", () => {
+  const text = "Hello world";
+  const props = {
+    content: `<h1>${text}</h1>`
+  }
+  const { getByText, getByLabelText } = render(
+    <QDRPopup {...props} />
+  );
+  expect(getByLabelText("popup")).toBeInTheDocument()
+  expect(getByText("Hello world")).toBeInTheDocument();
+});
diff --git a/console/react/src/qdrService.js b/console/react/src/qdrService.js
index 4f8c1b3..8adcff8 100644
--- a/console/react/src/qdrService.js
+++ b/console/react/src/qdrService.js
@@ -31,6 +31,10 @@ export class QDRService {
     this.schema = null;
   }
 
+  setHooks = (hooks) => {
+    this.hooks = hooks;
+  }
+
   onReconnect() {
     this.management.connection.on("disconnected", this.onDisconnect.bind(this));
     this.hooks.setLocation("reconnect");
@@ -77,8 +81,8 @@ export class QDRService {
   }
 }
 
-(function() {
-  console.dump = function(o) {
+(function () {
+  console.dump = function (o) {
     if (window.JSON && window.JSON.stringify)
       console.log(JSON.stringify(o, undefined, 2));
     else console.log(o);
diff --git a/console/react/src/qdrService.mock.js b/console/react/src/qdrService.mock.js
new file mode 100644
index 0000000..d2f4e3b
--- /dev/null
+++ b/console/react/src/qdrService.mock.js
@@ -0,0 +1,2145 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+import { utils } from "./amqp/utilities";
+
+const methodResults = {
+  context: {
+    message:
+    {
+      application_properties: {
+        statusCode: 200,
+        statusDescription: "fake response was OK"
+      }
+    }
+  }
+}
+
+const nodeInfo = {
+  "amqp:/_topo/0/A/$management": {
+    "connection": {
+      "attributeNames": [
+        "name",
+        "identity",
+        "host",
+        "role",
+        "dir",
+        "container",
+        "sasl",
+        "isAuthenticated",
+        "user",
+        "isEncrypted",
+        "sslProto",
+        "sslCipher",
+        "properties",
+        "sslSsf",
+        "tenant",
+        "type",
+        "ssl",
+        "opened",
+        "active",
+        "adminStatus",
+        "operStatus"
+      ],
+      "results": [
+        [
+          "connection/127.0.0.1:41076",
+          "1",
+          "127.0.0.1:41076",
+          "inter-router",
+          "in",
+          "D",
+          "ANONYMOUS",
+          true,
+          "anonymous",
+          false,
+          null,
+          null,
+          {
+            "product": "qpid-dispatch-router",
+            "version": "1.9.0-SNAPSHOT",
+            "qd.conn-id": 622
+          },
+          0,
+          null,
+          "org.apache.qpid.dispatch.connection",
+          false,
+          true,
+          true,
+          "enabled",
+          "up"
+        ],
+        [
+          "connection/127.0.0.1:34276",
+          "3",
+          "127.0.0.1:34276",
+          "normal",
+          "in",
+          "87c75b00-3eae-4289-b2ef-7faae85682b3",
+          "ANONYMOUS",
+          true,
+          "anonymous",
+          false,
+          null,
+          null,
+          {},
+          0,
+          null,
+          "org.apache.qpid.dispatch.connection",
+          false,
+          true,
+          true,
+          "enabled",
+          "up"
+        ],
+        [
+          "connection/::1",
+          "11",
+          "::1",
+          "normal",
+          "in",
+          "d5bf3869-55dc-9c4b-8580-ae0c51d09d82",
+          null,
+          false,
+          "anonymous",
+          false,
+          null,
+          null,
+          {
+            "console_identifier": "Dispatch console"
+          },
+          0,
+          null,
+          "org.apache.qpid.dispatch.connection",
+          false,
+          true,
+          true,
+          "enabled",
+          "up"
+        ]
+      ],
+      "timestamp": "2019-11-14T14:46:18.732Z"
+    }
+  },
+  "amqp:/_topo/0/D/$management": {
+    "connection": {
+      "attributeNames": [
+        "name",
+        "identity",
+        "host",
+        "role",
+        "dir",
+        "container",
+        "sasl",
+        "isAuthenticated",
+        "user",
+        "isEncrypted",
+        "sslProto",
+        "sslCipher",
+        "properties",
+        "sslSsf",
+        "tenant",
+        "type",
+        "ssl",
+        "opened",
+        "active",
+        "adminStatus",
+        "operStatus"
+      ],
+      "results": [
+        [
+          "connection/0.0.0.0:2000",
+          "622",
+          "0.0.0.0:2000",
+          "inter-router",
+          "out",
+          "A",
+          "ANONYMOUS",
+          true,
+          null,
+          false,
+          null,
+          null,
+          {
+            "product": "qpid-dispatch-router",
+            "version": "1.9.0-SNAPSHOT",
+            "qd.conn-id": 1
+          },
+          0,
+          null,
+          "org.apache.qpid.dispatch.connection",
+          false,
+          true,
+          true,
+          "enabled",
+          "up"
+        ]
+      ],
+      "timestamp": "2019-11-14T14:46:18.734Z"
+    }
+  }
+}
+
+export const mockService = ({ onSendMethod }) => {
+  const cbSendMethod = onSendMethod ? onSendMethod : () => { }
+  return {
+    management: {
+      connection:
+      {
+        sendMethod: () => {
+          cbSendMethod();
+          return Promise.resolve(methodResults)
+        }
+      },
+      topology: {
+        setUpdateEntities: () => { },
+        ensureAllEntities: () => { },
+        startUpdating: () => { },
+        stopUpdating: () => { },
+        addChangedAction: () => { },
+        delChangedAction: () => { },
+        addUpdatedAction: () => { },
+        delUpdatedAction: () => { },
+        fetchAllEntities: () => { },
+        nodeInfo: () => (nodeInfo),
+        _nodeInfo: nodeInfo
+      }
+    },
+    utilities: utils,
+    connect: () => Promise.resolve(),
+    schema: {
+      "prefix": "org.apache.qpid.dispatch",
+      "entityTypes": {
+        "dummy": {
+          "operations": [
+            "CREATE",
+            "READ",
+            "UPDATE",
+            "DELETE",
+            "CALLME"
+          ],
+          "attributes": {
+            "num1": {
+              "type": "integer"
+            },
+            "num2": {
+              "type": "integer"
+            },
+            "arg1": {
+              "type": "string"
+            },
+            "arg2": {
+              "type": "string"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.dummy",
+          "description": "Dummy entity for test purposes."
+        },
+        "binding": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "matchedCount": {
+              "type": "integer",
+              "description": "Total number of deliveries that matched this binding."
+            },
+            "bindingKey": {
+              "type": "string",
+              "description": "Pattern to compare against incoming message's subject.  The key is a string of zero or more tokens and wildcards. The format depends on the matchMethod configured for the exchange. For AMQP each token is delimited by the '.' character and wild-card tokens '*' matches a single token and '#' matches zero or more tokens. For MQTT each token is delimited by the '/' character and wildcard tokens '+' matches a single token and '#' matches zero or more tokens at th [...]
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "nextHopAddress": {
+              "required": true,
+              "type": "string",
+              "description": "The address to forward the message to when the message's topic string matches the binding key pattern.  This address is used by message consumers as the source of incoming messages."
+            },
+            "exchangeName": {
+              "required": true,
+              "type": "string",
+              "description": "The name of the exchange to bind."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "nextHopPhase": {
+              "type": "integer",
+              "description": "The address phase used when forwarding messages that match this binding."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.binding",
+          "description": "[EXPERIMENTAL] Defines a keyed next hop binding for a topic exchange. The subject field of the messages arriving at the exchange is compared against the binding's key value using the exchange's matchMethod.  If the subject matches the key the message is forwarded to the nextHopAddress. The nextHopAddress overrides the message's original destination."
+        },
+        "entity": {
+          "attributes": {
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.entity",
+          "description": "Base entity type for all entities."
+        },
+        "router.connection.linkRoute": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "pattern": {
+              "required": true,
+              "type": "string",
+              "description": "A wildcarded pattern for address matching. Incoming addresses are matched against this pattern. Matching addresses use the configured settings. The pattern consists of one or more tokens separated by a forward slash '/'. A token can be one of the following: a * character, a # character, or a sequence of characters that do not include /, *, or #.  The * token matches any single token.  The # token matches zero or more tokens. * has higher precedence than #, a [...]
+            },
+            "direction": {
+              "required": true,
+              "type": [
+                "in",
+                "out"
+              ],
+              "description": "The permitted direction of links: 'in' means client senders; 'out' means client receivers"
+            },
+            "containerId": {
+              "type": "string",
+              "description": "Name of the container which has instantiated this linkRoute."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.connection.linkRoute",
+          "description": "[EXPERIMENTAL] A linkRoute that is scoped to the connection that created it. Connection linkRoutes only exist within the context of a connection and when the connection is closed, they vanish. This differs from configured linkRoutes (router.config.linkRoute) which remain configured should their associated connection restart. Connection linkRoutes may be used by a client to create link-routed message flows that are automatically removed when the client disconnect [...]
+        },
+        "sslProfile": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "certFile": {
+              "type": "path",
+              "description": "The absolute path to the file containing the PEM-formatted public certificate to be used on the local end of any connections using this profile."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "uidNameMappingFile": {
+              "type": "string",
+              "description": "The absolute path to the file containing the unique id to display name mapping"
+            },
+            "ciphers": {
+              "type": "string",
+              "description": "Specifies the enabled ciphers so the SSL Ciphers can be hardened. In other words, use this field to disable weak ciphers. The ciphers are specified in the format understood by the OpenSSL library. For example, ciphers can be set to ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; -- The full list of allowed ciphers can be viewed using the openssl ciphers command"
+            },
+            "uidFormat": {
+              "type": "string",
+              "description": "A list of x509 client certificate fields that will be used to build a string that will uniquely identify the client certificate owner. For e.g. a value of 'cou' indicates that the uid will consist of c - common name concatenated with o - organization-company name concatenated with u - organization unit; or a value of 'o2' indicates that the uid will consist of o (organization name) concatenated with 2 (the sha256 fingerprint of the entire certificate) . Allo [...]
+            },
+            "privateKeyFile": {
+              "type": "path",
+              "description": "The absolute path to the file containing the PEM-formatted private key for the above certificate."
+            },
+            "protocols": {
+              "type": "string",
+              "description": "The TLS protocols that this sslProfile can use. You can specify a list of one or more of TLSv1, TLSv1.1, or TLSv1.2. To specify multiple protocols, separate the protocols with a space. For example, to permit the sslProfile to use TLS v1.1 and TLS v1.2 only, you would set the value to TLSv1.1 TLSv1.2. If you do not specify a value, the sslProfile uses the TLS protocol specified by the system-wide configuration."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "passwordFile": {
+              "type": "path",
+              "description": "If the above private key is password protected, this is the absolute path to a file containing the password that unlocks the certificate key. This file should be permission protected to limit access"
+            },
+            "caCertFile": {
+              "type": "path",
+              "description": "The absolute path to the database that contains the public certificates of trusted certificate authorities (CA)."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.sslProfile",
+          "description": "Attributes for setting TLS/SSL configuration for connections."
+        },
+        "linkRoute": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "direction": {
+              "required": true,
+              "type": [
+                "in",
+                "out"
+              ],
+              "description": "The permitted direction of links: 'in' means client senders; 'out' means client receivers"
+            },
+            "addExternalPrefix": {
+              "type": "string",
+              "description": "add the specified prefix to the address of the remote terminus on the route container link"
+            },
+            "operStatus": {
+              "type": [
+                "inactive",
+                "active"
+              ],
+              "description": "The operational status of this linkRoute: inactive - The remote container is not connected; active - the remote container is connected and ready to accept link routed attachments."
+            },
+            "pattern": {
+              "type": "string",
+              "description": "A wildcarded pattern for address matching. Link addresses are matched against this pattern. Matching addresses use the configured settings. The pattern consists of one or more tokens separated by a forward slash '/'. A token can be one of the following: a * character, a # character, or a sequence of characters that do not include /, *, or #.  The * token matches any single token.  The # token matches zero or more tokens. * has higher precedence than #, and e [...]
+            },
+            "connection": {
+              "type": "string",
+              "description": "The name from a connector or listener. Only one of containerId or connection should be specified for a linkRoute. Specifying both will result in the linkRoute not being created."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "prefix": {
+              "type": "string",
+              "description": "The address prefix for the configured settings. Cannot be used with the pattern attribute."
+            },
+            "distribution": {
+              "default": "linkBalanced",
+              "type": [
+                "linkBalanced"
+              ],
+              "description": "Treatment of traffic associated with the address"
+            },
+            "delExternalPrefix": {
+              "type": "string",
+              "description": "remove the specified prefix to the address of the remote terminus on the route container link"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "containerId": {
+              "type": "string",
+              "description": "ContainerID for the target container. Only one of containerId or connection should be specified for a linkRoute. Specifying both will result in the linkRoute not being created."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.linkRoute",
+          "description": "Entity type for link-route configuration.  This is used to identify remote containers that shall be destinations for routed link-attaches.  The link-routing configuration applies to an addressing space defined by a prefix or a pattern."
+        },
+        "allocator": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "heldByThreads": {
+              "graph": true,
+              "type": "integer"
+            },
+            "typeSize": {
+              "type": "integer"
+            },
+            "transferBatchSize": {
+              "type": "integer"
+            },
+            "globalFreeListMax": {
+              "graph": true,
+              "type": "integer"
+            },
+            "batchesRebalancedToGlobal": {
+              "graph": true,
+              "type": "integer"
+            },
+            "typeName": {
+              "type": "string"
+            },
+            "batchesRebalancedToThreads": {
+              "graph": true,
+              "type": "integer"
+            },
+            "totalFreeToHeap": {
+              "graph": true,
+              "type": "integer"
+            },
+            "totalAllocFromHeap": {
+              "graph": true,
+              "type": "integer"
+            },
+            "localFreeListMax": {
+              "graph": true,
+              "type": "integer"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.allocator",
+          "description": "Memory allocation pool."
+        },
+        "management": {
+          "operations": [
+            "GET-SCHEMA",
+            "GET-JSON-SCHEMA",
+            "GET-LOG",
+            "PROFILE",
+            "QUERY",
+            "GET-TYPES",
+            "GET-ANNOTATIONS",
+            "GET-OPERATIONS",
+            "GET-ATTRIBUTES",
+            "GET-MGMT-NODES",
+            "READ"
+          ],
+          "attributes": {
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "singleton": true,
+          "fullyQualifiedType": "org.apache.qpid.dispatch.management",
+          "description": "Qpid dispatch router extensions to the standard org.amqp.management interface."
+        },
+        "log": {
+          "operations": [
+            "UPDATE",
+            "READ"
+          ],
+          "attributes": {
+            "outputFile": {
+              "type": "string",
+              "description": "Where to send log messages. Can be 'stderr', 'stdout', 'syslog' or a file name."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "module": {
+              "required": true,
+              "type": [
+                "ROUTER",
+                "ROUTER_CORE",
+                "ROUTER_HELLO",
+                "ROUTER_LS",
+                "ROUTER_MA",
+                "MESSAGE",
+                "SERVER",
+                "AGENT",
+                "AUTHSERVICE",
+                "CONTAINER",
+                "ERROR",
+                "POLICY",
+                "HTTP",
+                "CONN_MGR",
+                "PYTHON",
+                "DEFAULT"
+              ],
+              "description": "Module to configure. The special module 'DEFAULT' specifies defaults for all modules."
+            },
+            "enable": {
+              "type": "string",
+              "description": "Levels are: trace, debug, info, notice, warning, error, critical. The enable string is a comma-separated list of levels. A level may have a trailing '\\+' to enable that level and above. For example 'trace,debug,warning+' means enable trace, debug, warning, error and critical. The value 'none' means disable logging for the module."
+            },
+            "includeSource": {
+              "type": "boolean",
+              "description": "Include source file and line number in log messages."
+            },
+            "includeTimestamp": {
+              "type": "boolean",
+              "description": "Include timestamp in log messages."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.log",
+          "description": "Configure logging for a particular module. You can use the `UPDATE` operation to change log settings while the router is running."
+        },
+        "vhostUserGroupSettings": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "allowFallbackLinks": {
+              "default": true,
+              "type": "boolean",
+              "description": "Whether this connection is allowed to claim 'qd.fallback' capability for attached links.  This allows endpoints to act as fallback destinations for addresses that have fallback capability enabled."
+            },
+            "allowAnonymousSender": {
+              "type": "boolean",
+              "description": "Whether this connection is allowed to create sending links if the sender does not provide a target address. By prohibiting anonymous senders, the router only needs to verify once, when the link is created, that the sender is permitted to send messages to the target address. The router does not need to verify each message that is sent on the link. A value of 'true' means that users may send messages to any address. Allowing anonymous senders can also decrease [...]
+            },
+            "maxReceivers": {
+              "default": 2147483647,
+              "type": "integer",
+              "description": "The maximum number of receiving links that may be created on this connection. A value of '0' disables all receiver links."
+            },
+            "users": {
+              "required": true,
+              "type": "string",
+              "description": "A list of authenticated users for this user group. Use commas to separate multiple users. A user may belong to only one vhost user group."
+            },
+            "sourcePattern": {
+              "type": "string",
+              "description": "A wildcarded pattern for matching source addresses from which users in this group may receive messages. The pattern consists of one or more tokens separated by a forward slash '/'. A token can be one of the following: a * character, a # character, or a sequence of characters that do not include /, *, or #.  The * token matches any single token.  The # token matches zero or more tokens. * has higher precedence than #, and exact match has the highest precedenc [...]
+            },
+            "allowWaypointLinks": {
+              "default": true,
+              "type": "boolean",
+              "description": "Whether this connection is allowed to claim 'waypoint.N' capability for attached links.  This allows endpoints to act as waypoints without needing auto-links."
+            },
+            "maxSessionWindow": {
+              "default": 1638400,
+              "type": "integer",
+              "description": "The incoming capacity for new AMQP sessions, measured in octets. Non-zero policy values overwrite values specified for a listener object (AMQP Begin, incoming-window)."
+            },
+            "allowUserIdProxy": {
+              "type": "boolean",
+              "description": "Whether this connection is allowed to send messages with a user ID that is different than the connection's authenticated user name."
+            },
+            "maxFrameSize": {
+              "default": 16384,
+              "type": "integer",
+              "description": "The largest frame, in bytes, that may be sent on this connection. Non-zero policy values overwrite values specified for a listener object (AMQP Open, max-frame-size)."
+            },
+            "targets": {
+              "type": "string",
+              "description": "A list of target addresses to which users in this group may send messages. To specify multiple addresses, separate the addresses with either a comma or a space. If you do not specify any addresses, users in this group are not allowed to send messages to any addresses. You can use the substitution token '${user}' to specify an address that contains a user's authenticated user name. You can use an asterisk ('*') wildcard to match one or more characters in an a [...]
+            },
+            "sources": {
+              "type": "string",
+              "description": "A list of source addresses from which users in this group may receive messages. To specify multiple addresses, separate the addresses with either a comma or a space. If you do not specify any addresses, users in this group are not allowed to receive messages from any addresses. You can use the substitution token '${user}' to specify an address that contains a user's authenticated user name. You can use an asterisk ('*') wildcard to match one or more characte [...]
+            },
+            "allowAdminStatusUpdate": {
+              "default": true,
+              "type": "boolean",
+              "description": "Whether this connection is allowed to update the admin status of other connections. Note: Inter-router connections cannot be deleted at any time."
+            },
+            "allowDynamicLinkRoutes": {
+              "default": true,
+              "type": "boolean",
+              "description": "Whether this connection is allowed to dynamically create connection-scoped link route destinations."
+            },
+            "allowDynamicSource": {
+              "type": "boolean",
+              "description": "Whether this connection is allowed to create dynamic receiving links (links to resources that do not exist on the peer). A value of 'true' means that users are able to automatically create resources on the peer system."
+            },
+            "remoteHosts": {
+              "required": true,
+              "type": "string",
+              "description": "A list of remote hosts from which the users may connect. A host can be a hostname, IP address, or IP address range. Use commas to separate multiple hosts. To allow access from all remote hosts, specify a wildcard '*'. To deny access from all remote hosts, leave this attribute blank."
+            },
+            "maxSenders": {
+              "default": 2147483647,
+              "type": "integer",
+              "description": "The maximum number of sending links that may be created on this connection. A value of '0' disables all sender links."
+            },
+            "targetPattern": {
+              "type": "string",
+              "description": "A wildcarded pattern for matching target addresses to which users in this group may send messages. The pattern consists of one or more tokens separated by a forward slash '/'. A token can be one of the following: a * character, a # character, or a sequence of characters that do not include /, *, or #.  The * token matches any single token.  The # token matches zero or more tokens. * has higher precedence than #, and exact match has the highest precedence. To [...]
+            },
+            "maxSessions": {
+              "default": 32768,
+              "type": "integer",
+              "description": "The maximum number of sessions that may be created on this connection. Non-zero policy values overwrite values specified for a listener object (AMQP Open, channel-max)."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.vhostUserGroupSettings",
+          "description": "Policy settings for users connecting to a vhost. Configuration files including this section must use .json format."
+        },
+        "vhostStats": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "perHostState": {
+              "type": "map",
+              "description": "A map where the key is the host name and the value is a list of the host's connections."
+            },
+            "hostname": {
+              "type": "string",
+              "description": "The vhost name."
+            },
+            "perUserState": {
+              "type": "map",
+              "description": "A map where the key is the authenticated user name and the value is a list of the user's connections."
+            },
+            "sessionDenied": {
+              "graph": true,
+              "type": "integer"
+            },
+            "connectionsApproved": {
+              "graph": true,
+              "type": "integer"
+            },
+            "receiverDenied": {
+              "graph": true,
+              "type": "integer"
+            },
+            "connectionsCurrent": {
+              "graph": true,
+              "type": "integer"
+            },
+            "senderDenied": {
+              "graph": true,
+              "type": "integer"
+            },
+            "connectionsDenied": {
+              "graph": true,
+              "type": "integer"
+            },
+            "id": {
+              "type": "string",
+              "description": "The vhost name. DEPRECATED - use 'hostname' instead."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.vhostStats",
+          "description": "Virtual host connection and access statistics."
+        },
+        "connector": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "stripAnnotations": {
+              "default": "both",
+              "type": [
+                "in",
+                "out",
+                "both",
+                "no"
+              ],
+              "description": "['in', 'out', 'both', 'no'] in: Strip the dispatch router specific annotations only on ingress; out: Strip the dispatch router specific annotations only on egress; both: Strip the dispatch router specific annotations on both ingress and egress; no - do not strip dispatch router specific annotations"
+            },
+            "saslUsername": {
+              "type": "string",
+              "description": "The user name that the connector is using to connect to a peer."
+            },
+            "allowRedirect": {
+              "default": true,
+              "type": "boolean",
+              "description": "Allow the peer to redirect this connection to another address."
+            },
+            "idleTimeoutSeconds": {
+              "default": 16,
+              "type": "integer",
+              "description": "The idle timeout, in seconds, for connections through this connector.  If no frames are received on the connection for this time interval, the connection shall be closed."
+            },
+            "maxSessionFrames": {
+              "type": "integer",
+              "description": "Session incoming window measured in transfer frames for sessions created on this connection. This is the number of transfer frames that may simultaneously be in flight for all links in the session. Setting this value to zero selects the default session window size. Policy settings will not overwrite this value. The numerical product of maxFrameSize and maxSessionFrames may not exceed 2^31-1. If (maxFrameSize x maxSessionFrames) exceeds 2^31-1 then maxSession [...]
+            },
+            "cost": {
+              "default": 1,
+              "type": "integer",
+              "description": "For the 'inter-router' role only.  This value assigns a cost metric to the inter-router connection.  The default (and minimum) value is one.  Higher values represent higher costs.  The cost is used to influence the routing algorithm as it attempts to use the path with the lowest total cost from ingress to egress."
+            },
+            "port": {
+              "default": "amqp",
+              "type": "string",
+              "description": "Port number or symbolic service name."
+            },
+            "policyVhost": {
+              "type": "string",
+              "description": "A connector may optionally define a policy to restrict the remote container to access only specific resources. This attribute defines the name of the policy vhost for this connector. Within the vhost the connector will use the vhost policy settings from user group '$connector'. If the vhost policy is absent or if the user group '$connector' within that policy is absent then the connector will fail to start.  In policy specified via connector attribute 'polic [...]
+            },
+            "saslMechanisms": {
+              "type": "string",
+              "description": "Space separated list of accepted SASL authentication mechanisms."
+            },
+            "linkCapacity": {
+              "type": "integer",
+              "description": "The capacity of links within this connection, in terms of message deliveries.  The capacity is the number of messages that can be in-flight concurrently for each link."
+            },
+            "role": {
+              "default": "normal",
+              "type": [
+                "normal",
+                "inter-router",
+                "route-container",
+                "edge"
+              ],
+              "description": "The role of an established connection. In the normal role, the connection is assumed to be used for AMQP clients that are doing normal message delivery over the connection.  In the inter-router role, the connection is assumed to be to another router in the network.  Inter-router discovery and routing protocols can only be used over inter-router connections. route-container role can be used for router-container connections, for example, a router-broker connec [...]
+            },
+            "saslPassword": {
+              "type": "string",
+              "description": "The password that the connector is using to connect to a peer."
+            },
+            "maxSessions": {
+              "default": 32768,
+              "type": "integer",
+              "description": "The maximum number of sessions that can be simultaneously active on the connection. Setting this value to zero selects the default number of sessions. Policy settings will not overwrite this value. Defaults to 32768."
+            },
+            "messageLoggingComponents": {
+              "default": "none",
+              "type": "string",
+              "description": "A comma separated list that indicates which components of the message should be logged (no spaces allowed between list components). Defaults to 'none' (log nothing). If you want all properties and application properties of the message logged use 'all'. Specific components of the message can be logged by indicating the components via a comma separated list. The components are message-id, user-id, to, subject, reply-to, correlation-id, content-type, content-en [...]
+            },
+            "host": {
+              "default": "127.0.0.1",
+              "type": "string",
+              "description": "IP address: ipv4 or ipv6 literal or a host name"
+            },
+            "protocolFamily": {
+              "type": [
+                "IPv4",
+                "IPv6"
+              ],
+              "description": "['IPv4', 'IPv6'] IPv4: Internet Protocol version 4; IPv6: Internet Protocol version 6.  If not specified, the protocol family will be automatically determined from the address."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "verifyHostname": {
+              "default": true,
+              "type": "boolean",
+              "description": "yes: Ensures that when initiating a connection (as a client) the host name in the URL to which this connector connects to matches the host name in the digital certificate that the peer sends back as part of the SSL connection; no: Does not perform host name verification"
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "maxFrameSize": {
+              "default": 16384,
+              "type": "integer",
+              "description": "The maximum frame size in octets that will be used in the connection-open negotiation with a connected peer.  The frame size is the largest contiguous set of uninterrupted data that can be sent for a message delivery over the connection. Interleaving of messages on different links is done at frame granularity. Policy settings will not overwrite this value. Defaults to 16384."
+            },
+            "sslProfile": {
+              "type": "string",
+              "description": "Name of the sslProfile."
+            },
+            "failoverUrls": {
+              "type": "string",
+              "description": "A read-only, comma-separated list of failover urls. "
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.connector",
+          "description": "Establishes an outgoing connection from the router."
+        },
+        "logStats": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "debugCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "How many debug-level events have happened on this log."
+            },
+            "criticalCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "How many critical-level events have happened on this log."
+            },
+            "traceCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "How many trace-level events have happened on this log."
+            },
+            "warningCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "How many warning-level events have happened on this log."
+            },
+            "infoCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "How many info-level events have happened on this log."
+            },
+            "noticeCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "How many notice-level events have happened on this log."
+            },
+            "errorCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "How many error-level events have happened on this log."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.logStats",
+          "description": "histogram of the different severity-levels of events on the given log."
+        },
+        "configurationEntity": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.configurationEntity",
+          "description": "Base type for entities containing configuration information."
+        },
+        "exchange": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "divertedCount": {
+              "type": "integer",
+              "description": "A count of those deliveries that were forwarded via the alternateAddress only.  This is a subset of the forwardedCount."
+            },
+            "alternatePhase": {
+              "type": "integer",
+              "description": "The address phase for the alternateAddress.  Defaults to '0'."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "matchMethod": {
+              "default": "amqp",
+              "type": [
+                "amqp",
+                "mqtt"
+              ],
+              "description": "Key matching algorithm used. 'amqp' uses the legacy AMQP topic exchange wildcard match method as described in the pre-1.0 drafts. 'mqtt' uses the MQTT topic filter wildcard match method."
+            },
+            "forwardedCount": {
+              "type": "integer",
+              "description": "The total number of deliveries forwarded via matched bindings or to the alternateAddress"
+            },
+            "receivedCount": {
+              "type": "integer",
+              "description": "The total number of deliveries received by this exchange."
+            },
+            "bindingCount": {
+              "type": "integer",
+              "description": "The number of bindings associated with this exchange."
+            },
+            "address": {
+              "required": true,
+              "type": "string",
+              "description": "The address of the exchange. Used by the message publisher as the target for sending messages."
+            },
+            "phase": {
+              "type": "integer",
+              "description": "The address phase for the exchange.  Defaults to '0'."
+            },
+            "alternateAddress": {
+              "type": "string",
+              "description": "The address to forward the message to if no bindings are matched."
+            },
+            "droppedCount": {
+              "type": "integer",
+              "description": "The total number of deliveries dropped due to the lack of an outgoing subscription."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.exchange",
+          "description": "[EXPERIMENTAL] Defines a topic exchange."
+        },
+        "listener": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "stripAnnotations": {
+              "default": "both",
+              "type": [
+                "in",
+                "out",
+                "both",
+                "no"
+              ],
+              "description": "['in', 'out', 'both', 'no'] in: Strip the dispatch router specific annotations only on ingress; out: Strip the dispatch router specific annotations only on egress; both: Strip the dispatch router specific annotations on both ingress and egress; no - do not strip dispatch router specific annotations"
+            },
+            "requireSsl": {
+              "type": "boolean",
+              "description": "yes: Require the use of SSL or TLS on the connection; no: Allow clients to connect without SSL or TLS."
+            },
+            "idleTimeoutSeconds": {
+              "default": 16,
+              "type": "integer",
+              "description": "The idle timeout, in seconds, for connections through this listener.  If no frames are received on the connection for this time interval, the connection shall be closed."
+            },
+            "maxSessionFrames": {
+              "type": "integer",
+              "description": "Session incoming window measured in transfer frames for sessions created on this connection. This is the number of transfer frames that may simultaneously be in flight for all links in the session. Setting this value to zero selects the default session window size. Policy settings, if specified, will overwrite this value. The numerical product of maxFrameSize and maxSessionFrames may not exceed 2^31-1. If (maxFrameSize x maxSessionFrames) exceeds 2^31-1 then [...]
+            },
+            "cost": {
+              "default": 1,
+              "type": "integer",
+              "description": "For the 'inter-router' role only.  This value assigns a cost metric to the inter-router connection.  The default (and minimum) value is one.  Higher values represent higher costs.  The cost is used to influence the routing algorithm as it attempts to use the path with the lowest total cost from ingress to egress."
+            },
+            "port": {
+              "default": "amqp",
+              "type": "string",
+              "description": "Port number or symbolic service name.  If '0', the router shall assign an ephemeral port to the listener and log the port number with a log of the form 'SERVER (notice) Listening on <host>:<assigned-port> (<listener-name>)'"
+            },
+            "saslPlugin": {
+              "type": "string",
+              "description": "EXPERIMENTAL. Name of the a sasl plugin configuration section to use for this listener (e.g. authServicePlugin)."
+            },
+            "linkCapacity": {
+              "type": "integer",
+              "description": "The capacity of links within this connection, in terms of message deliveries.  The capacity is the number of messages that can be in-flight concurrently for each link."
+            },
+            "policyVhost": {
+              "type": "string",
+              "description": "A listener may optionally define a virtual host to index to a specific policy to restrict the remote container to access only specific resources. This attribute defines the name of the policy vhost for this listener.  If multi-tenancy is enabled for the listener, this vhost will override the peer-supplied vhost for the purposes of identifying the desired policy settings for the connections."
+            },
+            "saslMechanisms": {
+              "type": "string",
+              "description": "Space separated list of accepted SASL authentication mechanisms."
+            },
+            "requireEncryption": {
+              "type": "boolean",
+              "description": "yes: Require the connection to the peer to be encrypted; no: Permit non-encrypted communication with the peer"
+            },
+            "trustedCertsFile": {
+              "type": "path",
+              "description": "This optional setting can be used to reduce the set of available CAs for client authentication.  If used, this setting must provide the absolute path to a PEM file that contains the trusted certificates."
+            },
+            "role": {
+              "default": "normal",
+              "type": [
+                "normal",
+                "inter-router",
+                "route-container",
+                "edge"
+              ],
+              "description": "The role of an established connection. In the normal role, the connection is assumed to be used for AMQP clients that are doing normal message delivery over the connection.  In the inter-router role, the connection is assumed to be to another router in the network.  Inter-router discovery and routing protocols can only be used over inter-router connections. route-container role can be used for router-container connections, for example, a router-broker connec [...]
+            },
+            "websockets": {
+              "default": true,
+              "type": "boolean",
+              "description": "For an http enabled listener, determines whether websockets access is enabled (true by default)."
+            },
+            "maxSessions": {
+              "default": 32768,
+              "type": "integer",
+              "description": "The maximum number of sessions that can be simultaneously active on the connection. Setting this value to zero selects the default number of sessions. Policy settings, if specified, will overwrite this value. Defaults to 32768."
+            },
+            "authenticatePeer": {
+              "type": "boolean",
+              "description": "yes: Require the peer's identity to be authenticated; no: Do not require any authentication."
+            },
+            "http": {
+              "type": "boolean",
+              "description": "Accept HTTP connections that can upgrade to AMQP over WebSocket. Plain AMQP connections are not accepted on this listener."
+            },
+            "messageLoggingComponents": {
+              "default": "none",
+              "type": "string",
+              "description": "A comma separated list that indicates which components of the message should be logged. Defaults to 'none' (log nothing). If you want all properties and application properties of the message logged use 'all'. Specific components of the message can be logged by indicating the components via a comma separated list. The components are message-id, user-id, to, subject, reply-to, correlation-id, content-type, content-encoding, absolute-expiry-time, creation-time, [...]
+            },
+            "multiTenant": {
+              "type": "boolean",
+              "description": "If true, apply multi-tenancy to endpoints connected at this listener.  The address space is defined by the virtual host (hostname field in the Open)."
+            },
+            "metrics": {
+              "default": true,
+              "type": "boolean",
+              "description": "Export metrics in prometheus text format for the router (using path /metrics). Assumes listener is enabled for http."
+            },
+            "host": {
+              "type": "string",
+              "description": "A host name, IPV4 or IPV6 literal, or the empty string. The empty string listens on all local addresses. A host name listens on all addresses associated with the name. An IPV6 literal address (or wildcard '[::]') listens only for IPV6. An IPV4 literal address (or wildcard '0.0.0.0') listens only for IPV4."
+            },
+            "initialHandshakeTimeoutSeconds": {
+              "type": "integer",
+              "description": "The timeout, in seconds, for the initial handshake for connections coming in through listeners.  If the time interval expires before the peer sends the AMQP OPEN frame, the connection shall be closed.  A value of zero (the default) disables this timeout."
+            },
+            "httpRootDir": {
+              "type": "path",
+              "description": "Absolute path to a directory from which to serve static HTML files. For example, /usr/share/qpid-dispatch/console."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "socketAddressFamily": {
+              "type": [
+                "IPv4",
+                "IPv6"
+              ],
+              "description": "['IPv4', 'IPv6'] IPv4: Internet Protocol version 4; IPv6: Internet Protocol version 6.  If not specified, the protocol family will be automatically determined from the address."
+            },
+            "healthz": {
+              "default": true,
+              "type": "boolean",
+              "description": "Provide a simple HTTP based liveness test (using path /healthz). Assumes listener is enabled for http."
+            },
+            "maxFrameSize": {
+              "default": 16384,
+              "type": "integer",
+              "description": "The maximum frame size in octets that will be used in the connection-open negotiation with a connected peer.  The frame size is the largest contiguous set of uninterrupted data that can be sent for a message delivery over the connection. Interleaving of messages on different links is done at frame granularity. Policy settings, if specified, will overwrite this value. Defaults to 16384."
+            },
+            "sslProfile": {
+              "type": "string",
+              "description": "Name of the sslProfile."
+            },
+            "failoverUrls": {
+              "type": "string",
+              "description": "A comma-separated list of failover urls to be supplied to connected clients.  Form: [(amqp|amqps|ws|wss)://]host_or_ip[:port]"
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.listener",
+          "description": "Listens for incoming connections to the router."
+        },
+        "policy": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "enableVhostNamePatterns": {
+              "type": "boolean",
+              "description": "Enable vhost name patterns. When false vhost hostnames are treated as literal strings. When true vhost hostnames are treated as match patterns."
+            },
+            "connectionsProcessed": {
+              "graph": true,
+              "type": "integer"
+            },
+            "policyDir": {
+              "type": "path",
+              "description": "The absolute path to a directory that holds vhost policy definition files in JSON format (*.json). The router processes all of the vhost policies in each JSON file that is in this directory."
+            },
+            "defaultVhost": {
+              "default": "$default",
+              "type": "string",
+              "description": "The name of the default vhost policy. This policy rule set is applied to a connection for which a vhost policy has not otherwise been configured. Processing for the default vhost is enabled by default and set to select vhost '$default'. To disable default vhost processing set defaultVhost to blank or do not define a vhost named '$default'."
+            },
+            "connectionsDenied": {
+              "graph": true,
+              "type": "integer"
+            },
+            "enableVhostPolicy": {
+              "type": "boolean",
+              "description": "Enables the router to enforce the connection denials and resource limits defined in the configured vhost policies."
+            },
+            "maxConnections": {
+              "default": 65535,
+              "type": "integer",
+              "description": "The maximum number of concurrent client connections allowed for this router. This limit is always enforced, even if no other policy settings have been defined. The limit is applied to all incoming connections regardless of remote host, authenticated user, or targeted vhost."
+            },
+            "connectionsCurrent": {
+              "graph": true,
+              "type": "integer"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "singleton": true,
+          "fullyQualifiedType": "org.apache.qpid.dispatch.policy",
+          "description": "Defines global connection limit"
+        },
+        "address": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "egressPhase": {
+              "type": "integer",
+              "description": "Advanced - Override the egress phase for this address"
+            },
+            "pattern": {
+              "type": "string",
+              "description": "A wildcarded pattern for address matching. Incoming addresses are matched against this pattern. Matching addresses use the configured settings. The pattern consists of one or more tokens separated by a forward slash '/'. A token can be one of the following: a * character, a # character, or a sequence of characters that do not include /, *, or #.  The * token matches any single token.  The # token matches zero or more tokens. * has higher precedence than #, a [...]
+            },
+            "ingressPhase": {
+              "type": "integer",
+              "description": "Advanced - Override the ingress phase for this address"
+            },
+            "priority": {
+              "type": "integer",
+              "description": "All messages sent to this address which lack an intrinsic priority will be assigned this priority."
+            },
+            "enableFallback": {
+              "type": "boolean",
+              "description": "If false, undeliverable messages are released.  If true, undeliverable messages shall be re-delivered to a fallback destination.  The fallback destination uses the same address, but is attached using an autoLink with 'fallback' enabled or a link with the qd.fallback capability."
+            },
+            "prefix": {
+              "type": "string",
+              "description": "The address prefix for the configured settings. Cannot be used with a pattern attribute."
+            },
+            "waypoint": {
+              "type": "boolean",
+              "description": "Designates this address space as being used for waypoints.  This will cause the proper address-phasing to be used."
+            },
+            "distribution": {
+              "default": "balanced",
+              "type": [
+                "multicast",
+                "closest",
+                "balanced",
+                "unavailable"
+              ],
+              "description": "Treatment of traffic associated with the address"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.address",
+          "description": "Entity type for address configuration.  This is used to configure the treatment of message-routed deliveries within a particular address-space.  The configuration controls distribution and address phasing."
+        },
+        "authServicePlugin": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "realm": {
+              "type": "string",
+              "description": "Value to set for hostname field on sasl-init"
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "host": {
+              "type": "string",
+              "description": "A host name, IPV4 or IPV6 literal, of the service to delegate to."
+            },
+            "sslProfile": {
+              "type": "string",
+              "description": "Name of the sslProfile to use for the authentication service."
+            },
+            "port": {
+              "default": "amqp",
+              "type": "string",
+              "description": "Port number of the service delegated host."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.authServicePlugin",
+          "description": "EXPERIMENTAL. Attributes for setting SASL plugin."
+        },
+        "router.node": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "routerLink": {
+              "type": "entityId",
+              "description": "Local link to remote node"
+            },
+            "nextHop": {
+              "type": "string",
+              "description": "Neighbour ID of next hop to remote node from here."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "index": {
+              "type": "integer",
+              "description": "Index number used in statistics histograms for this router node.  This index is specific to this router."
+            },
+            "validOrigins": {
+              "type": "list",
+              "description": "List of valid origin nodes for messages arriving via the re mote node, used for duplicate elimination in redundant networks."
+            },
+            "linkState": {
+              "type": "list",
+              "description": "List of remote node's neighbours."
+            },
+            "instance": {
+              "type": "integer",
+              "description": "Remote node boot number."
+            },
+            "cost": {
+              "type": "integer",
+              "description": "Reachability cost"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "protocolVersion": {
+              "type": "integer",
+              "description": "Router-protocol version supported by the node."
+            },
+            "lastTopoChange": {
+              "type": "integer",
+              "description": "Timestamp showing the most recent change to this node's neighborhood."
+            },
+            "id": {
+              "type": "string",
+              "description": "Remote node identifier."
+            },
+            "address": {
+              "type": "string",
+              "description": "Address of the remote node"
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.node",
+          "description": "Remote router node connected to this router."
+        },
+        "autoLink": {
+          "operations": [
+            "CREATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "operStatus": {
+              "type": [
+                "inactive",
+                "attaching",
+                "failed",
+                "active",
+                "quiescing",
+                "idle"
+              ],
+              "description": "The operational status of this autoLink: inactive - The remote container is not connected; attaching - the link is attaching to the remote node; failed - the link attach failed; active - the link is attached and operational; quiescing - the link is transitioning to idle state; idle - the link is attached but there are no deliveries flowing and no unsettled deliveries."
+            },
+            "direction": {
+              "required": true,
+              "type": [
+                "in",
+                "out"
+              ],
+              "description": "The direction of the link to be created.  In means into the router, out means out of the router."
+            },
+            "containerId": {
+              "type": "string",
+              "description": "ContainerID for the target container. Only one of containerId or connection should be specified for an autoLink. Specifying both will result in the autoLink not being created"
+            },
+            "linkRef": {
+              "type": "string",
+              "description": "Reference to the org.apache.qpid.dispatch.router.link if the link exists"
+            },
+            "externalAddress": {
+              "type": "string",
+              "description": "If present, an alternate address of the node on the remote container.  This is used if the node has a different address than the address used internally by the router to route deliveries."
+            },
+            "connection": {
+              "type": "string",
+              "description": "The name from a connector or listener. Only one of containerId or connection should be specified for an autoLink. Specifying both will result in the autoLink not being created"
+            },
+            "address": {
+              "required": true,
+              "type": "string",
+              "description": "The address of the provisioned object"
+            },
+            "phase": {
+              "type": "integer",
+              "description": "The address phase for this link.  Defaults to '0' for 'out' links and '1' for 'in' links."
+            },
+            "fallback": {
+              "type": "boolean",
+              "description": "If true, this auto-link is attached to a fallback destination for an address."
+            },
+            "lastError": {
+              "type": "string",
+              "description": "The error description from the last attach failure"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.autoLink",
+          "description": "Entity type for configuring auto-links.  Auto-links are links whose lifecycle is managed by the router.  These are typically used to attach to waypoints on remote containers (brokers, etc.)."
+        },
+        "router.address": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "subscriberCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of local subscribers for this address (i.e. attached to this router)"
+            },
+            "deliveriesEgress": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of deliveries to this address that exited the router network on this router"
+            },
+            "deliveriesEgressRouteContainer": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were sent to a route-container address."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "deliveriesIngress": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of deliveries to this address that entered the router network on this router"
+            },
+            "transitOutstanding": {
+              "type": "list",
+              "description": "List of numbers of outstanding deliveries across a transit (inter-router) link for this address.  This is for balanced distribution only."
+            },
+            "deliveriesIngressRouteContainer": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were received from a route-container address."
+            },
+            "priority": {
+              "type": "integer",
+              "description": "The message priority being handled by this address."
+            },
+            "remoteCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of remote routers that have at least one subscriber to this address"
+            },
+            "inProcess": {
+              "type": "integer",
+              "description": "The number of in-process subscribers for this address"
+            },
+            "deliveriesFromContainer": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of deliveries to this address that were originated from an in-process entity"
+            },
+            "deliveriesTransit": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of deliveries to this address that transited this router to another router"
+            },
+            "containerCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of attached containers that serve this route address"
+            },
+            "key": {
+              "type": "string",
+              "description": "Internal unique (to this router) key to identify the address"
+            },
+            "deliveriesRedirectedToFallback": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were sent to the fallback destination due to the primary destination being unreachable."
+            },
+            "distribution": {
+              "type": [
+                "flood",
+                "multicast",
+                "closest",
+                "balanced",
+                "linkBalanced",
+                "unavailable"
+              ],
+              "description": "Forwarding treatment for the address: flood - messages delivered to all subscribers along all available paths (this will cause duplicate deliveries if there are redundant paths); multicast - one copy of each message delivered to all subscribers; closest - messages delivered to only the closest subscriber; balanced - messages delivered to one subscriber with load balanced across subscribers; linkBalanced - for link-routing, link attaches balanced across desti [...]
+            },
+            "trackedDeliveries": {
+              "type": "integer",
+              "description": "Number of transit deliveries being tracked for this address (for balanced distribution)."
+            },
+            "deliveriesToContainer": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of deliveries to this address that were given to an in-process subscriber"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "remoteHostRouters": {
+              "type": "list",
+              "description": "List of remote routers on which there is a destination for this address."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.address",
+          "description": "AMQP address managed by the router."
+        },
+        "router.link": {
+          "operations": [
+            "UPDATE",
+            "READ"
+          ],
+          "attributes": {
+            "adminStatus": {
+              "default": "enabled",
+              "type": [
+                "enabled",
+                "disabled"
+              ]
+            },
+            "linkType": {
+              "type": [
+                "endpoint",
+                "router-control",
+                "inter-router"
+              ],
+              "description": "Type of link: endpoint: a link to a normally connected endpoint; inter-router: a link to another router in the network."
+            },
+            "unsettledCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of unsettled deliveries awaiting settlement on the link"
+            },
+            "ingressHistogram": {
+              "type": "list",
+              "description": "For outgoing links on connections with 'normal' role.  This histogram shows the number of settled deliveries on the link that ingressed the network at each interior router node."
+            },
+            "undeliveredCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The number of undelivered messages pending for the link."
+            },
+            "acceptedCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of accepted deliveries."
+            },
+            "releasedCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of released deliveries."
+            },
+            "capacity": {
+              "type": "integer",
+              "description": "The capacity, in deliveries, for the link.  The number of undelivered plus unsettled deliveries shall not exceed the capacity.  This is enforced by link flow control."
+            },
+            "presettledCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of pre-settled deliveries."
+            },
+            "deliveriesDelayed1Sec": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of settled deliveries that were held in the router for 1 to 10 seconds."
+            },
+            "priority": {
+              "type": "integer",
+              "description": "For inter-router links, this is the message priority being handled."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "deliveriesDelayed10Sec": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of settled deliveries that were held in the router for more than 10 seconds."
+            },
+            "settleRate": {
+              "graph": true,
+              "type": "integer",
+              "description": "The average rate (over five seconds) of settlement in deliveries-per-second.  This is included for egress links only."
+            },
+            "droppedPresettledCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of pre-settled deliveries that were dropped."
+            },
+            "peer": {
+              "type": "string",
+              "description": "Identifier of the paired link if this is an attach-routed link."
+            },
+            "linkName": {
+              "type": "string",
+              "description": "Name assigned to the link in the Attach."
+            },
+            "rejectedCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of rejected deliveries."
+            },
+            "deliveryCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of deliveries that have traversed this link."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "operStatus": {
+              "type": [
+                "up",
+                "down",
+                "quiescing",
+                "idle"
+              ]
+            },
+            "linkDir": {
+              "type": [
+                "in",
+                "out"
+              ],
+              "description": "Direction of delivery flow over the link, inbound or outbound to or from the router."
+            },
+            "modifiedCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of modified deliveries."
+            },
+            "owningAddr": {
+              "type": "string",
+              "description": "Address assigned to this link during attach: The target for inbound links or the source for outbound links."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router.link",
+          "description": "Link to another AMQP endpoint: router node, client or other AMQP process."
+        },
+        "org.amqp.management": {
+          "operations": [
+            "QUERY",
+            "GET-TYPES",
+            "GET-ANNOTATIONS",
+            "GET-OPERATIONS",
+            "GET-ATTRIBUTES",
+            "GET-MGMT-NODES",
+            "READ"
+          ],
+          "attributes": {
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.org.amqp.management",
+          "description": "The standard AMQP management node interface."
+        },
+        "operationalEntity": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.operationalEntity",
+          "description": "Base type for entities containing current operational information."
+        },
+        "connection": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "adminStatus": {
+              "default": "enabled",
+              "type": [
+                "enabled",
+                "deleted"
+              ],
+              "description": "This field is set to enabled when the connection is up and running. Setting this field to deleted will terminate the connection and all links and sessions contained in the connection. Inter-router connections cannot be terminated by setting the adminStatus to deleted."
+            },
+            "container": {
+              "type": "string",
+              "description": "The container for this connection"
+            },
+            "opened": {
+              "type": "boolean",
+              "description": "The connection has been opened (i.e. AMQP OPEN)"
+            },
+            "sslCipher": {
+              "type": "string",
+              "description": "SSL cipher name"
+            },
+            "operStatus": {
+              "type": [
+                "up",
+                "closing"
+              ]
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "sslProto": {
+              "type": "string",
+              "description": "SSL protocol name"
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "properties": {
+              "type": "map",
+              "description": "Connection properties supplied by the peer."
+            },
+            "ssl": {
+              "type": "boolean",
+              "description": "True iff SSL/TLS is in effect for this connection."
+            },
+            "host": {
+              "type": "string",
+              "description": "IP address and port number in the form addr:port."
+            },
+            "isEncrypted": {
+              "type": "boolean",
+              "description": "Indicates whether the connection content is encrypted."
+            },
+            "role": {
+              "type": "string"
+            },
+            "isAuthenticated": {
+              "type": "boolean",
+              "description": "Indicates whether the identity of the connection's user is authentic."
+            },
+            "tenant": {
+              "type": "string",
+              "description": "If multi-tenancy is on for this connection, the tenant space in effect"
+            },
+            "sasl": {
+              "type": "string",
+              "description": "SASL mechanism in effect for authentication."
+            },
+            "sslSsf": {
+              "type": "integer",
+              "description": "SSL strength factor in effect"
+            },
+            "dir": {
+              "type": [
+                "in",
+                "out"
+              ],
+              "description": "Direction of connection establishment in or out of the router."
+            },
+            "user": {
+              "type": "string",
+              "description": "Identity of the authenticated user."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.connection",
+          "description": "Connections to the router's container."
+        },
+        "router": {
+          "operations": [
+            "READ"
+          ],
+          "attributes": {
+            "workerThreads": {
+              "default": 4,
+              "type": "integer",
+              "description": "The number of threads that will be created to process message traffic and other application work (timers, non-amqp file descriptors, etc.) ."
+            },
+            "raIntervalSeconds": {
+              "default": 30,
+              "type": "integer",
+              "description": "Interval in seconds between Router-Advertisements sent to all routers in a stable network."
+            },
+            "raIntervalFluxSeconds": {
+              "default": 4,
+              "type": "integer",
+              "description": "Interval in seconds between Router-Advertisements sent to all routers during topology fluctuations."
+            },
+            "linkRouteCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of link routes attached to the router node."
+            },
+            "allowResumableLinkRoute": {
+              "default": true,
+              "type": "boolean",
+              "description": "Whether links can be routed where timeout is non-zero or expiry-policy is not link-detach"
+            },
+            "rejectedDeliveries": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries whose delivery state was set to REJECTED by the router. These deliveries were Invalid and unprocessable."
+            },
+            "autoLinkCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of auto links attached to the router node."
+            },
+            "saslConfigName": {
+              "default": "qdrouterd",
+              "type": "string",
+              "description": "Name of the SASL configuration.  This string + '.conf' is the name of the configuration file."
+            },
+            "id": {
+              "type": "string",
+              "description": "Router's unique identity. If not specified, a random identity will be assigned at startup."
+            },
+            "presettledDeliveries": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of presettled deliveries handled by the router."
+            },
+            "deliveriesTransit": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were sent to another router in the network."
+            },
+            "area": {
+              "type": "string",
+              "description": "Unused placeholder."
+            },
+            "deliveriesIngress": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were sent to it by a sender that is directly attached to the router."
+            },
+            "deliveriesIngressRouteContainer": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were received from router container connections."
+            },
+            "droppedPresettledDeliveries": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of presettled deliveries that were dropped by the router."
+            },
+            "acceptedDeliveries": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries whose delivery state was set to ACCEPTED by the router. These deliveries were successfully processed by the router."
+            },
+            "helloIntervalSeconds": {
+              "default": 1,
+              "type": "integer",
+              "description": "Interval in seconds between HELLO messages sent to neighbor routers."
+            },
+            "deliveriesDelayed1Sec": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of settled deliveries that were held in the router for 1 to 10 seconds."
+            },
+            "saslConfigDir": {
+              "type": "path",
+              "description": "Absolute path to the SASL configuration file."
+            },
+            "version": {
+              "type": "string",
+              "description": "Software Version"
+            },
+            "remoteLsMaxAgeSeconds": {
+              "default": 60,
+              "type": "integer",
+              "description": "Time in seconds after which link state is declared stale if no RA is received."
+            },
+            "deliveriesDelayed10Sec": {
+              "graph": true,
+              "type": "integer",
+              "description": "The total number of settled deliveries that were held in the router for more than 10 seconds."
+            },
+            "linkCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of links attached to the router node."
+            },
+            "debugDumpFile": {
+              "type": "path",
+              "description": "The absolute path to the location for the debug dump file. The router writes debug-level information to this file if the logger is not available."
+            },
+            "connectionCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of open connections to the router node."
+            },
+            "hostName": {
+              "type": "string",
+              "description": "hostName of machine on which router is running"
+            },
+            "addrCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of addresses known to the router."
+            },
+            "deliveriesEgressRouteContainer": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were sent to route container connections."
+            },
+            "nodeCount": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of known peer router nodes."
+            },
+            "modifiedDeliveries": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries whose delivery state was set to MODIFIED by the router. These deliveries were modified but not processed."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "deliveriesEgress": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were sent by the router to a receiver that is directly attached to the router."
+            },
+            "releasedDeliveries": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries whose delivery state was set to RELEASED by the router. These deliveries was not (and will not be) processed"
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            },
+            "timestampsInUTC": {
+              "type": "boolean",
+              "description": "Use UTC time rather than localtime in logs."
+            },
+            "timestampFormat": {
+              "type": "string",
+              "description": "Format string to use for timestamps in logs."
+            },
+            "helloMaxAgeSeconds": {
+              "default": 3,
+              "type": "integer",
+              "description": "Time in seconds after which a neighbor is declared lost if no HELLO is received."
+            },
+            "defaultDistribution": {
+              "default": "balanced",
+              "type": [
+                "multicast",
+                "closest",
+                "balanced",
+                "unavailable"
+              ],
+              "description": "Default forwarding treatment for any address without a specified treatment. multicast - one copy of each message delivered to all subscribers; closest - messages delivered to only the closest subscriber; balanced - messages delivered to one subscriber with load balanced across subscribers; unavailable - this address is unavailable, link attaches to an address of unavilable distribution will be rejected."
+            },
+            "mode": {
+              "default": "standalone",
+              "type": [
+                "standalone",
+                "interior",
+                "edge"
+              ],
+              "description": "In standalone mode, the router operates as a single component.  It does not participate in the routing protocol and therefore will not cooperate with other routers. In interior mode, the router operates in cooperation with other interior routers in an interconnected network.  In edge mode, the router can make a connection to an interior router and join a network without causing that network to recompute paths."
+            },
+            "deliveriesRedirectedToFallback": {
+              "graph": true,
+              "type": "integer",
+              "description": "Number of deliveries that were sent to the fallback destination due to the primary destination being unreachable."
+            },
+            "allowUnsettledMulticast": {
+              "type": "boolean",
+              "description": "(DEPRECATED) If true, allow senders to send unsettled deliveries to multicast addresses.  These deliveries shall be settled by the ingress router.  If false, unsettled deliveries to multicast addresses shall be rejected."
+            }
+          },
+          "singleton": true,
+          "fullyQualifiedType": "org.apache.qpid.dispatch.router",
+          "description": "Tracks peer routers and computes routes to destinations. This entity is mandatory. The router will not start without this entity."
+        },
+        "vhost": {
+          "operations": [
+            "CREATE",
+            "UPDATE",
+            "DELETE",
+            "READ"
+          ],
+          "attributes": {
+            "allowUnknownUser": {
+              "type": "boolean",
+              "description": "Whether unknown users (users who are not members of a defined user group) are allowed to connect to the vhost. Unknown users are assigned to the '$default' user group and receive '$default' settings."
+            },
+            "maxConnectionsPerUser": {
+              "default": 65535,
+              "type": "integer",
+              "description": "The maximum number of concurrent client connections allowed for any user."
+            },
+            "hostname": {
+              "required": true,
+              "type": "string",
+              "description": "The hostname of the vhost. This vhost policy will be applied to any client connection that is directed to this hostname."
+            },
+            "groups": {
+              "type": "map",
+              "description": "A map where each key is a vhost name and each value is a map of the settings for users of that vhost."
+            },
+            "maxConnections": {
+              "default": 65535,
+              "type": "integer",
+              "description": "The global maximum number of concurrent client connections allowed for this vhost."
+            },
+            "maxConnectionsPerHost": {
+              "default": 65535,
+              "type": "integer",
+              "description": "The maximum number of concurrent client connections allowed for any remote host (the host from which the client is connecting)."
+            },
+            "identity": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique identity generated by the system. Will not change."
+            },
+            "name": {
+              "unique": true,
+              "type": "string",
+              "description": "Unique name optionally assigned by user. Can be changed."
+            }
+          },
+          "fullyQualifiedType": "org.apache.qpid.dispatch.vhost",
+          "description": "AMQP virtual host policy definition of users, user groups, allowed remote hosts, and AMQP restrictions."
+        }
+      }
+    },
+    setHooks: () => { }
+  }
+}
diff --git a/console/react/src/setupTests.js b/console/react/src/setupTests.js
new file mode 100644
index 0000000..a8be446
--- /dev/null
+++ b/console/react/src/setupTests.js
@@ -0,0 +1,3 @@
+// react-testing-library renders your components to document.body,
+// this adds jest-dom's custom assertions
+import '@testing-library/jest-dom/extend-expect';
diff --git a/console/react/src/tableToolbar.jsx b/console/react/src/tableToolbar.js
similarity index 98%
rename from console/react/src/tableToolbar.jsx
rename to console/react/src/tableToolbar.js
index b8748bb..5d04d21 100644
--- a/console/react/src/tableToolbar.jsx
+++ b/console/react/src/tableToolbar.js
@@ -140,6 +140,7 @@ class TableToolbar extends React.Component {
           <ToolbarGroup className="toolbar-pagination">
             <ToolbarItem>
               <Pagination
+                aria-label="toolbar-pagination"
                 itemCount={this.props.total}
                 page={this.props.page}
                 perPage={this.props.perPage}
diff --git a/console/react/src/tableToolbar.test.js b/console/react/src/tableToolbar.test.js
new file mode 100644
index 0000000..634d26e
--- /dev/null
+++ b/console/react/src/tableToolbar.test.js
@@ -0,0 +1,29 @@
+import React from "react";
+import { render, fireEvent } from '@testing-library/react';
+import TableToolbar from "./tableToolbar";
+
+it("should render tableToolbar", () => {
+  let handleChangeFilterValueCalled = false;
+  const props = {
+    fields: [{ title: "field0" }, { title: "field1" }],
+    filterBy: { value: "f" },
+    handleChangeFilterValue: () => handleChangeFilterValueCalled = true,
+    total: 2,
+    page: 1,
+    perPage: 1,
+    onSetPage: () => { },
+    onPerPageSelect: () => { }
+  }
+  const { getByLabelText } = render(
+    <TableToolbar {...props} />
+  );
+  expect(getByLabelText("toolbar-pagination")).toBeInTheDocument()
+  const filterInput = getByLabelText("search text input");
+  expect(filterInput).toBeInTheDocument()
+
+  fireEvent.change(filterInput, { target: { value: 'fi' } });
+  expect(handleChangeFilterValueCalled).toBe(true);
+
+  const paginationInput = getByLabelText("Current page");
+  expect(paginationInput).toBeInTheDocument();
+});
diff --git a/console/react/src/topology/arrowsComponent.js b/console/react/src/topology/arrowsComponent.js
index d04498e..0d41dae 100644
--- a/console/react/src/topology/arrowsComponent.js
+++ b/console/react/src/topology/arrowsComponent.js
@@ -28,7 +28,7 @@ class ArrowsComponent extends Component {
 
   render() {
     return (
-      <React.Fragment>
+      <div id="arrows-expand">
         <Checkbox
           label="Show arrows between routers"
           isChecked={this.props.routerArrows}
@@ -45,7 +45,7 @@ class ArrowsComponent extends Component {
           id="check-client-arrows"
           name="clientArrows"
         />
-      </React.Fragment>
+      </div>
     );
   }
 }
diff --git a/console/react/src/topology/mapComponent.js b/console/react/src/topology/mapComponent.js
index 0cfeb9a..1577044 100644
--- a/console/react/src/topology/mapComponent.js
+++ b/console/react/src/topology/mapComponent.js
@@ -32,7 +32,7 @@ class MapLegendComponent extends Component {
 
   render() {
     return (
-      <React.Fragment>
+      <div id="map-expand">
         <Checkbox
           label="Show background map"
           isChecked={this.props.mapShown}
@@ -63,7 +63,7 @@ class MapLegendComponent extends Component {
             <label htmlFor="oceanColor">Ocean</label>
           </li>
         </ul>
-      </React.Fragment>
+      </div>
     );
   }
 }
diff --git a/console/react/src/topology/nodes.js b/console/react/src/topology/nodes.js
index ceea875..96729d5 100644
--- a/console/react/src/topology/nodes.js
+++ b/console/react/src/topology/nodes.js
@@ -18,8 +18,8 @@ under the License.
 */
 
 import { utils } from "../amqp/utilities.js";
+import * as d3 from "d3";
 
-/* global d3 Promise */
 export class Node {
   constructor(
     id,
@@ -71,11 +71,11 @@ export class Node {
   }
   toolTip(topology, verbose) {
     return new Promise(
-      function(resolve) {
+      function (resolve) {
         if (this.nodeType === "normal" || this.nodeType === "edge") {
           resolve(this.clientTooltip());
         } else
-          this.routerTooltip(topology, verbose).then(function(toolTip) {
+          this.routerTooltip(topology, verbose).then(function (toolTip) {
             resolve(toolTip);
           });
       }.bind(this)
@@ -99,7 +99,7 @@ export class Node {
 
   routerTooltip(topology, verbose) {
     return new Promise(
-      function(resolve) {
+      function (resolve) {
         topology.ensureEntities(
           this.key,
           [
@@ -111,7 +111,7 @@ export class Node {
               entity: "router"
             }
           ],
-          function(foo, nodes) {
+          function (foo, nodes) {
             // update all the router title text
             let node = nodes[this.key];
             const err = `<table class="popupTable"><tr><td>Error</td><td>Unable to get router info for ${this.key}</td></tr></table>`;
@@ -302,7 +302,7 @@ export class Nodes {
     return null;
   }
   nodeExists(connectionContainer) {
-    return this.nodes.findIndex(function(node) {
+    return this.nodes.findIndex(function (node) {
       return node.container === connectionContainer;
     });
   }
@@ -332,7 +332,7 @@ export class Nodes {
     if (Object.prototype.toString.call(nodes) !== "[object Array]") {
       nodes = [nodes];
     }
-    this.nodes.forEach(function(d) {
+    this.nodes.forEach(function (d) {
       localStorage[d.name] = JSON.stringify({
         x: Math.round(d.x),
         y: Math.round(d.y),
@@ -477,7 +477,7 @@ export class Nodes {
           ),
           y: Math.round(
             height / 2 +
-              (Math.sin(this.nodes.length / (Math.PI * 2.0)) * height) / 4
+            (Math.sin(this.nodes.length / (Math.PI * 2.0)) * height) / 4
           ),
           fixed: false
         };
diff --git a/console/react/src/topology/topoUtils.js b/console/react/src/topology/topoUtils.js
index 0511d7b..1f04d05 100644
--- a/console/react/src/topology/topoUtils.js
+++ b/console/react/src/topology/topoUtils.js
@@ -74,7 +74,7 @@ export function connectionPopupHTML(d, nodeInfo) {
     return;
   }
   // return all of onode's connections that connecto to right
-  let getConnsArray = function(onode, key, right) {
+  let getConnsArray = function (onode, key, right) {
     if (right.normals) {
       // if we want connections between a router and a client[s]
       let connIds = new Set();
@@ -84,16 +84,16 @@ export function connectionPopupHTML(d, nodeInfo) {
         if (normal.key === key) {
           connIds.add(normal.connectionId);
         } else if (normal.alsoConnectsTo) {
-          normal.alsoConnectsTo.forEach(function(ac2) {
+          normal.alsoConnectsTo.forEach(function (ac2) {
             if (ac2.key === key) connIds.add(ac2.connectionId);
           });
         }
       }
       return onode.connection.results
-        .filter(function(result) {
+        .filter(function (result) {
           return connIds.has(result[connIndex]);
         })
-        .map(function(c) {
+        .map(function (c) {
           return utils.flatten(onode.connection.attributeNames, c);
         });
     } else {
@@ -102,20 +102,20 @@ export function connectionPopupHTML(d, nodeInfo) {
       let containerIndex = onode.connection.attributeNames.indexOf("container");
       let roleIndex = onode.connection.attributeNames.indexOf("role");
       return onode.connection.results
-        .filter(function(conn) {
+        .filter(function (conn) {
           return (
             conn[containerIndex] === container &&
             conn[roleIndex] === "inter-router"
           );
         })
-        .map(function(c) {
+        .map(function (c) {
           return utils.flatten(onode.connection.attributeNames, c);
         });
     }
   };
   // construct HTML to be used in a popup when the mouse is moved over a link.
   // The HTML is sanitized elsewhere before it is displayed
-  let linksHTML = function(onode, conns) {
+  let linksHTML = function (onode, conns) {
     const max_links = 10;
     const fields = [
       "deliveryCount",
@@ -126,13 +126,13 @@ export function connectionPopupHTML(d, nodeInfo) {
       "modifiedCount"
     ];
     // local function to determine if a link's connectionId is in any of the connections
-    let isLinkFor = function(connectionId, conns) {
+    let isLinkFor = function (connectionId, conns) {
       for (let c = 0; c < conns.length; c++) {
         if (conns[c].identity === connectionId) return true;
       }
       return false;
     };
-    let fnJoin = function(ar, sepfn) {
+    let fnJoin = function (ar, sepfn) {
       let out = "";
       out = ar[0];
       for (let i = 1; i < ar.length; i++) {
@@ -172,14 +172,14 @@ export function connectionPopupHTML(d, nodeInfo) {
       }
     }
     // we may need to limit the number of links displayed, so sort descending by the sum of the field values
-    let sum = function(a) {
+    let sum = function (a) {
       let s = 0;
       for (let i = 0; i < fields.length; i++) {
         s += a[fields[i]];
       }
       return s;
     };
-    links.sort(function(a, b) {
+    links.sort(function (a, b) {
       let asum = sum(a);
       let bsum = sum(b);
       return asum < bsum ? 1 : asum > bsum ? -1 : 0;
@@ -200,8 +200,8 @@ export function connectionPopupHTML(d, nodeInfo) {
       td.unshift("owningAddr");
     }
 
-    let rate_th = function(th) {
-      let rth = th.map(function(t) {
+    let rate_th = function (th) {
+      let rth = th.map(function (t) {
         if (t.endsWith("Count")) t = t.replace("Count", "Rate");
         return utils.humanify(t);
       });
@@ -216,14 +216,14 @@ export function connectionPopupHTML(d, nodeInfo) {
         break;
       }
       let link = links[l];
-      let vals = td.map(function(f) {
+      let vals = td.map(function (f) {
         if (f === "owningAddr") {
           let identity = utils.identity_clean(link.owningAddr);
           return utils.addr_text(identity);
         }
         return link[f];
       });
-      let joinedVals = fnJoin(vals, function(v1, last) {
+      let joinedVals = fnJoin(vals, function (v1, last) {
         return [
           `</td><td${isNaN(+v1) ? "" : ' align="right"'}>`,
           last ? v1 : utils.pretty(v1 || "0", ",.2f")
@@ -270,7 +270,7 @@ export function connectionPopupHTML(d, nodeInfo) {
 
 export function getSizes(topologyRef) {
   const gap = 5;
-  let topoWidth = topologyRef.offsetWidth;
+  let topoWidth = topologyRef.offsetWidth > 0 ? topologyRef.offsetWidth : window.innerWidth;
   let width = topoWidth - gap;
   let top = topologyRef.offsetTop;
   let height = window.innerHeight - top - gap;
diff --git a/console/react/src/topology/topologyToolbar.js b/console/react/src/topology/topologyToolbar.js
index 218159b..d04d90c 100644
--- a/console/react/src/topology/topologyToolbar.js
+++ b/console/react/src/topology/topologyToolbar.js
@@ -1,47 +1,20 @@
 import React from "react";
 import { Toolbar, ToolbarGroup, ToolbarItem } from "@patternfly/react-core";
-import { Popover, PopoverPosition, Button } from "@patternfly/react-core";
 import TrafficComponent from "./trafficComponent";
 import MapComponent from "./mapComponent";
 import ArrowsComponent from "./arrowsComponent";
+import DropdownPanel from "../dropdownPanel"
 
-class TopologyToolbar extends React.Component {
-  constructor(props) {
-    super(props);
-
-    this.state = {
-      isOpen: { traffic: false, arrows: false, map: false }
-    };
-  }
-  handleShowPopover = event => {
-    console.log("handleShowPopover called");
-    const { isOpen } = this.state;
-    const value = event.target.value;
-    isOpen[value] = !isOpen[value];
-    this.setState({ isOpen });
-  };
-
-  shouldClose = tip => {
-    console.log("should close called");
-    const { isOpen } = this.state;
-    const value = tip.reference.value;
-    isOpen[value] = false;
-    this.setState({ isOpen });
-  };
 
+class TopologyToolbar extends React.Component {
   render() {
     return (
-      <Toolbar className="pf-l-toolbar pf-u-justify-content-space-between pf-u-mx-xl pf-u-my-md">
+      <Toolbar data-testid="topology-toolbar" className="pf-l-toolbar pf-u-justify-content-space-between pf-u-mx-xl pf-u-my-md">
         <ToolbarGroup>
           <ToolbarItem className="pf-u-mr-md">
-            <Popover
-              className="topology-toolbar-item"
-              position={PopoverPosition.bottom}
-              enableFlip={false}
-              appendTo={() => document.getElementById("root")}
-              aria-label="Popover traffic"
-              closeBtnAriaLabel="Close Popover traffic"
-              bodyContent={
+            <DropdownPanel
+              title="Traffic"
+              panel={
                 <TrafficComponent
                   addresses={this.props.legendOptions.traffic.addresses}
                   addressColors={this.props.legendOptions.traffic.addressColors}
@@ -56,25 +29,12 @@ class TopologyToolbar extends React.Component {
                   congestion={this.props.legendOptions.traffic.congestion}
                 />
               }
-            >
-              <Button className="topology-toolbar-button" value="traffic">
-                <span className="pf-c-dropdown__toggle-text">Traffic</span>
-                <i
-                  className="fas fa-caret-down pf-c-dropdown__toggle-icon"
-                  aria-hidden="true"
-                ></i>
-              </Button>
-            </Popover>
+            />
           </ToolbarItem>
           <ToolbarItem className="pf-u-mr-md">
-            <Popover
-              className="topology-toolbar-item"
-              position={PopoverPosition.bottom}
-              enableFlip={false}
-              appendTo={() => document.getElementById("root")}
-              aria-label="Popover map"
-              closeBtnAriaLabel="Close Popover map"
-              bodyContent={
+            <DropdownPanel
+              title="Background map"
+              panel={
                 <MapComponent
                   mapShown={this.props.legendOptions.map.show}
                   areaColor={this.props.mapOptions.areaColor}
@@ -83,42 +43,19 @@ class TopologyToolbar extends React.Component {
                   handleUpdateMapShown={this.props.handleUpdateMapShown}
                 />
               }
-            >
-              <Button className="topology-toolbar-button" value="map">
-                <span className="pf-c-dropdown__toggle-text">
-                  Background map
-                </span>
-                <i
-                  className="fas fa-caret-down pf-c-dropdown__toggle-icon"
-                  aria-hidden="true"
-                ></i>
-              </Button>
-            </Popover>
+            />
           </ToolbarItem>
           <ToolbarItem className="pf-u-mr-md">
-            <Popover
-              className="topology-toolbar-item"
-              position={PopoverPosition.bottom}
-              enableFlip={false}
-              appendTo={() => document.getElementById("root")}
-              aria-label="Popover arrows"
-              closeBtnAriaLabel="Close Popover arrows"
-              bodyContent={
+            <DropdownPanel
+              title="Arrows"
+              panel={
                 <ArrowsComponent
                   routerArrows={this.props.legendOptions.arrows.routerArrows}
                   clientArrows={this.props.legendOptions.arrows.clientArrows}
                   handleChangeArrows={this.props.handleChangeArrows}
                 />
               }
-            >
-              <Button className="topology-toolbar-button" value="arrows">
-                <span className="pf-c-dropdown__toggle-text">Arrows</span>
-                <i
-                  className="fas fa-caret-down pf-c-dropdown__toggle-icon"
-                  aria-hidden="true"
-                ></i>
-              </Button>
-            </Popover>
+            />
           </ToolbarItem>
         </ToolbarGroup>
       </Toolbar>
diff --git a/console/react/src/topology/topologyToolbar.test.js b/console/react/src/topology/topologyToolbar.test.js
new file mode 100644
index 0000000..53be27e
--- /dev/null
+++ b/console/react/src/topology/topologyToolbar.test.js
@@ -0,0 +1,36 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import TopologyToolbar from "./topologyToolbar";
+
+it('renders a TopologyToolbar', () => {
+  const props = {
+    legendOptions: {
+      traffic: {
+        addresses: {
+          testAddress: true
+        },
+        addressColors: {
+          testAddress: "#EAEAEA"
+        },
+        dots: true,
+        congestion: true
+      },
+      map: { show: true },
+      arrows: { routerArrows: true, clientArrows: true }
+    },
+    mapOptions: { areaColor: "#EAEAEA", oceanColor: "#EBAEBA" },
+    handleChangeTrafficAnimation: () => { },
+    handleChangeTrafficFlowAddress: () => { },
+    handleHoverAddress: () => { },
+    handleUpdateMapColor: () => { },
+    handleUpdateMapShown: () => { },
+    handleChangeArrows: () => { }
+  }
+  const {
+    getByTestId
+  } = render(<TopologyToolbar {...props} />);
+
+  // the toolbar should be present
+  expect(getByTestId("topology-toolbar")).toBeInTheDocument();
+
+})
diff --git a/console/react/src/topology/topologyViewer.js b/console/react/src/topology/topologyViewer.js
index 70ee410..e858426 100644
--- a/console/react/src/topology/topologyViewer.js
+++ b/console/react/src/topology/topologyViewer.js
@@ -48,7 +48,7 @@ import {
   updateState
 } from "./svgUtils.js";
 import { QDRLogger } from "../qdrGlobals";
-const TOPOOPTIONSKEY = "topoLegendOptions";
+const TOPOOPTIONSKEY = "topologyLegendOptions";
 
 class TopologyPage extends Component {
   constructor(props) {
@@ -58,26 +58,26 @@ class TopologyPage extends Component {
     savedOptions = savedOptions
       ? JSON.parse(savedOptions)
       : {
-          traffic: {
-            open: false,
-            dots: false,
-            congestion: false,
-            addresses: [],
-            addressColors: []
-          },
-          legend: {
-            open: true
-          },
-          map: {
-            open: false,
-            show: false
-          },
-          arrows: {
-            open: false,
-            routerArrows: false,
-            clientArrows: true
-          }
-        };
+        traffic: {
+          open: false,
+          dots: false,
+          congestion: false,
+          addresses: [],
+          addressColors: []
+        },
+        legend: {
+          open: true
+        },
+        map: {
+          open: false,
+          show: false
+        },
+        arrows: {
+          open: false,
+          routerArrows: false,
+          clientArrows: true
+        }
+      };
     // previous version read from storage didn't have show attribute
     if (typeof savedOptions.map.show === "undefined") {
       savedOptions.map.show = false;
@@ -174,7 +174,7 @@ class TopologyPage extends Component {
 
   setSelected = (item, data) => {
     // remove the selected attr from each node
-    this.circle.each(function(d) {
+    this.circle.each(function (d) {
       d.selected = false;
     });
     // set the selected attr for this node
@@ -186,7 +186,7 @@ class TopologyPage extends Component {
   updateLegend = () => {
     this.legend.update();
   };
-  clearPopups = () => {};
+  clearPopups = () => { };
 
   // initialize the nodes and links array from the QDRService.topology._nodeInfo object
   init = () => {
@@ -215,6 +215,7 @@ class TopologyPage extends Component {
         .attr("id", "SVG_ID")
         .attr("width", this.width)
         .attr("height", this.height)
+        .attr("aria-label", "topology-svg")
         .on("click", this.clearPopups);
       // read the map data from the data file and build the map layer
       this.backgroundMap
@@ -306,7 +307,7 @@ class TopologyPage extends Component {
     this.updateLegend();
 
     if (this.oldSelectedNode) {
-      d3.selectAll("circle.inter-router").classed("selected", function(d) {
+      d3.selectAll("circle.inter-router").classed("selected", function (d) {
         if (d.key === this.oldSelectedNode.key) {
           this.selected_node = d;
           return true;
@@ -315,7 +316,7 @@ class TopologyPage extends Component {
       });
     }
     if (this.oldMouseoverNode && this.selected_node) {
-      d3.selectAll("circle.inter-router").each(function(d) {
+      d3.selectAll("circle.inter-router").each(function (d) {
         if (d.key === this.oldMouseoverNode.key) {
           this.mouseover_node = d;
           this.props.service.management.topology.ensureAllEntities(
@@ -325,7 +326,7 @@ class TopologyPage extends Component {
                 attrs: ["id", "nextHop"]
               }
             ],
-            function() {
+            function () {
               this.nextHopHighlight(this.selected_node, d);
               this.restart();
             }
@@ -337,7 +338,7 @@ class TopologyPage extends Component {
     if (unknowns.length > 0)
       setTimeout(this.resolveUnknowns, 10, nodeInfo, unknowns);
 
-    var continueForce = function(extra) {
+    var continueForce = function (extra) {
       if (extra > 0) {
         --extra;
         this.force.start();
@@ -494,7 +495,7 @@ class TopologyPage extends Component {
     enterpath
       .append("path")
       .attr("class", "link")
-      .attr("id", function(d) {
+      .attr("id", function (d) {
         const si = d.source.uid();
         const ti = d.target.uid();
         return ["path", si, ti].join("-");
@@ -530,7 +531,7 @@ class TopologyPage extends Component {
     this.circle = d3
       .select("g.nodes")
       .selectAll("g")
-      .data(this.forceData.nodes.nodes, function(d) {
+      .data(this.forceData.nodes.nodes, function (d) {
         return d.uid();
       });
 
@@ -538,13 +539,13 @@ class TopologyPage extends Component {
     let enterCircle = this.circle
       .enter()
       .append("g")
-      .attr("id", function(d) {
+      .attr("id", function (d) {
         return (d.nodeType !== "normal" ? "router" : "client") + "-" + d.index;
       });
 
     let self = this;
     appendCircle(enterCircle)
-      .on("mouseover", function(d) {
+      .on("mouseover", function (d) {
         // mouseover a circle
         self.current_node = d;
         self.props.service.management.topology.delUpdatedAction(
@@ -552,7 +553,7 @@ class TopologyPage extends Component {
         );
         let e = d3.event;
         self.popupCancelled = false;
-        d.toolTip(self.props.service.management.topology).then(function(
+        d.toolTip(self.props.service.management.topology).then(function (
           toolTip
         ) {
           self.showToolTip(toolTip, e);
@@ -573,14 +574,14 @@ class TopologyPage extends Component {
               attrs: ["id", "nextHop"]
             }
           ],
-          function() {
+          function () {
             self.mouseover_node = d; // save this node in case the topology changes so we can restore the highlights
             self.nextHopHighlight(self.selected_node, d);
             self.restart();
           }
         );
       })
-      .on("mouseout", function() {
+      .on("mouseout", function () {
         // mouse out for a circle
         self.current_node = null;
         // unenlarge target node
@@ -603,7 +604,7 @@ class TopologyPage extends Component {
         // mouse position relative to svg
         this.initial_mouse_down_position = d3.mouse(this.svg.node());
       })
-      .on("mouseup", function(d) {
+      .on("mouseup", function (d) {
         // mouse up for circle
         self.backgroundMap.restartZoom();
         if (!self.mousedown_node) return;
@@ -686,7 +687,7 @@ class TopologyPage extends Component {
     // add text to client circles if there are any that represent multiple clients
     this.svg.selectAll(".subtext").remove();
     let multiples = this.svg.selectAll(".multiple");
-    multiples.each(function(d) {
+    multiples.each(function (d) {
       let g = d3.select(this);
       let r = Nodes.radius(d.nodeType);
       g.append("svg:text")
@@ -718,7 +719,7 @@ class TopologyPage extends Component {
     });
 
     // draw lines from node centers
-    this.path.selectAll("path").attr("d", function(d) {
+    this.path.selectAll("path").attr("d", function (d) {
       return `M${d.source.x},${d.source.y}L${d.target.x},${d.target.y}`;
     });
   };
@@ -1009,6 +1010,7 @@ class TopologyPage extends Component {
     });
     return (
       <TopologyView
+        aria-label="topology-viewer"
         viewToolbar={
           <TopologyToolbar
             legendOptions={this.state.legendOptions}
@@ -1027,7 +1029,7 @@ class TopologyPage extends Component {
         className="qdrTopology"
       >
         <div className="diagram">
-          <div ref={el => (this.topologyRef = el)} id="topology"></div>
+          <div aria-label="topology-diagram" ref={el => (this.topologyRef = el)} id="topology"></div>
         </div>
         {this.state.showContextMenu && (
           <ContextMenu
@@ -1059,8 +1061,8 @@ class TopologyPage extends Component {
             handleCloseRouterInfo={this.handleCloseRouterInfo}
           />
         ) : (
-          <div />
-        )}
+            <div />
+          )}
         {this.state.showClientInfo ? (
           <ClientInfoComponent
             d={this.d}
@@ -1068,8 +1070,8 @@ class TopologyPage extends Component {
             handleCloseClientInfo={this.handleCloseClientInfo}
           />
         ) : (
-          <div />
-        )}
+            <div />
+          )}
       </TopologyView>
     );
   }
diff --git a/console/react/src/topology/topologyViewer.test.js b/console/react/src/topology/topologyViewer.test.js
new file mode 100644
index 0000000..91a6b12
--- /dev/null
+++ b/console/react/src/topology/topologyViewer.test.js
@@ -0,0 +1,21 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import TopologyViewer from "./topologyViewer";
+import { mockService } from "../qdrService.mock";
+
+it("renders the TopologyViewer component", () => {
+  const props = {
+    service: mockService({})
+  }
+  const { getByLabelText } = render(
+    <TopologyViewer {...props} />
+  )
+
+  // make sure it rendered the component
+  const pfTopologyView = getByLabelText("topology-viewer");
+  expect(pfTopologyView).toBeInTheDocument();
+  expect(getByLabelText("topology-diagram")).toBeInTheDocument();
+
+  // make sure it created the svg
+  expect(getByLabelText("topology-svg")).toBeInTheDocument();
+});
diff --git a/console/react/src/updated.js b/console/react/src/updated.js
index 50020e0..e762d8e 100644
--- a/console/react/src/updated.js
+++ b/console/react/src/updated.js
@@ -27,7 +27,7 @@ class Updated extends Component {
 
   render() {
     return (
-      <pre data-pf-content="true" className="overview-loading">
+      <pre aria-label="last-updated" data-pf-content="true" className="overview-loading">
         {`Updated ${this.props.service.utilities.strDate(
           this.props.lastUpdated
         )}`}
diff --git a/console/react/src/updated.test.js b/console/react/src/updated.test.js
new file mode 100644
index 0000000..28353ae
--- /dev/null
+++ b/console/react/src/updated.test.js
@@ -0,0 +1,16 @@
+import React from "react";
+import { render } from '@testing-library/react';
+import { QDRService } from "./qdrService";
+import Updated from "./updated";
+
+it("should render the Updated component", () => {
+  const service = new QDRService(() => { });
+  const props = {
+    lastUpdated: new Date(),
+    service
+  }
+  const { getByLabelText } = render(
+    <Updated {...props} />
+  );
+  expect(getByLabelText("last-updated")).toBeInTheDocument()
+});
diff --git a/console/react/yarn.lock b/console/react/yarn.lock
index 59b7b90..a51a7e2 100644
--- a/console/react/yarn.lock
+++ b/console/react/yarn.lock
@@ -50,18 +50,18 @@
     source-map "^0.5.0"
 
 "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.4.5":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.2.tgz#069a776e8d5e9eefff76236bc8845566bd31dd91"
-  integrity sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ==
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91"
+  integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==
   dependencies:
     "@babel/code-frame" "^7.5.5"
-    "@babel/generator" "^7.6.2"
-    "@babel/helpers" "^7.6.2"
-    "@babel/parser" "^7.6.2"
-    "@babel/template" "^7.6.0"
-    "@babel/traverse" "^7.6.2"
-    "@babel/types" "^7.6.0"
-    convert-source-map "^1.1.0"
+    "@babel/generator" "^7.7.2"
+    "@babel/helpers" "^7.7.0"
+    "@babel/parser" "^7.7.2"
+    "@babel/template" "^7.7.0"
+    "@babel/traverse" "^7.7.2"
+    "@babel/types" "^7.7.2"
+    convert-source-map "^1.7.0"
     debug "^4.1.0"
     json5 "^2.1.0"
     lodash "^4.17.13"
@@ -69,132 +69,140 @@
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.4.0", "@babel/generator@^7.6.0", "@babel/generator@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03"
-  integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==
+"@babel/generator@^7.4.0", "@babel/generator@^7.6.0", "@babel/generator@^7.7.2":
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af"
+  integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==
   dependencies:
-    "@babel/types" "^7.6.0"
+    "@babel/types" "^7.7.2"
     jsesc "^2.5.1"
     lodash "^4.17.13"
     source-map "^0.5.0"
 
-"@babel/helper-annotate-as-pure@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
-  integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==
+"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz#efc54032d43891fe267679e63f6860aa7dbf4a5e"
+  integrity sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==
   dependencies:
-    "@babel/types" "^7.0.0"
+    "@babel/types" "^7.7.0"
 
 "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f"
-  integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz#32dd9551d6ed3a5fc2edc50d6912852aa18274d9"
+  integrity sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==
   dependencies:
-    "@babel/helper-explode-assignable-expression" "^7.1.0"
-    "@babel/types" "^7.0.0"
+    "@babel/helper-explode-assignable-expression" "^7.7.0"
+    "@babel/types" "^7.7.0"
 
-"@babel/helper-builder-react-jsx@^7.3.0":
-  version "7.3.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4"
-  integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==
+"@babel/helper-builder-react-jsx@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.0.tgz#c6b8254d305bacd62beb648e4dea7d3ed79f352d"
+  integrity sha512-LSln3cexwInTMYYoFeVLKnYPPMfWNJ8PubTBs3hkh7wCu9iBaqq1OOyW+xGmEdLxT1nhsl+9SJ+h2oUDYz0l2A==
   dependencies:
-    "@babel/types" "^7.3.0"
+    "@babel/types" "^7.7.0"
     esutils "^2.0.0"
 
 "@babel/helper-call-delegate@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43"
-  integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==
-  dependencies:
-    "@babel/helper-hoist-variables" "^7.4.4"
-    "@babel/traverse" "^7.4.4"
-    "@babel/types" "^7.4.4"
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz#df8942452c2c1a217335ca7e393b9afc67f668dc"
+  integrity sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw==
+  dependencies:
+    "@babel/helper-hoist-variables" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
+
+"@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.6.0", "@babel/helper-create-class-features-plugin@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz#bcdc223abbfdd386f94196ae2544987f8df775e8"
+  integrity sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==
+  dependencies:
+    "@babel/helper-function-name" "^7.7.0"
+    "@babel/helper-member-expression-to-functions" "^7.7.0"
+    "@babel/helper-optimise-call-expression" "^7.7.0"
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-replace-supers" "^7.7.0"
+    "@babel/helper-split-export-declaration" "^7.7.0"
 
-"@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.6.0":
-  version "7.6.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz#769711acca889be371e9bc2eb68641d55218021f"
-  integrity sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng==
+"@babel/helper-create-regexp-features-plugin@^7.7.0":
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz#6f20443778c8fce2af2ff4206284afc0ced65db6"
+  integrity sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==
   dependencies:
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/helper-member-expression-to-functions" "^7.5.5"
-    "@babel/helper-optimise-call-expression" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-replace-supers" "^7.5.5"
-    "@babel/helper-split-export-declaration" "^7.4.4"
+    "@babel/helper-regex" "^7.4.4"
+    regexpu-core "^4.6.0"
 
-"@babel/helper-define-map@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369"
-  integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==
+"@babel/helper-define-map@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz#60b0e9fd60def9de5054c38afde8c8ee409c7529"
+  integrity sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==
   dependencies:
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/types" "^7.5.5"
+    "@babel/helper-function-name" "^7.7.0"
+    "@babel/types" "^7.7.0"
     lodash "^4.17.13"
 
-"@babel/helper-explode-assignable-expression@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6"
-  integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==
+"@babel/helper-explode-assignable-expression@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz#db2a6705555ae1f9f33b4b8212a546bc7f9dc3ef"
+  integrity sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==
   dependencies:
-    "@babel/traverse" "^7.1.0"
-    "@babel/types" "^7.0.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
 
-"@babel/helper-function-name@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53"
-  integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==
+"@babel/helper-function-name@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3"
+  integrity sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.0.0"
-    "@babel/template" "^7.1.0"
-    "@babel/types" "^7.0.0"
+    "@babel/helper-get-function-arity" "^7.7.0"
+    "@babel/template" "^7.7.0"
+    "@babel/types" "^7.7.0"
 
-"@babel/helper-get-function-arity@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3"
-  integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==
+"@babel/helper-get-function-arity@^7.0.0", "@babel/helper-get-function-arity@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d"
+  integrity sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==
   dependencies:
-    "@babel/types" "^7.0.0"
+    "@babel/types" "^7.7.0"
 
-"@babel/helper-hoist-variables@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a"
-  integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==
+"@babel/helper-hoist-variables@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz#b4552e4cfe5577d7de7b183e193e84e4ec538c81"
+  integrity sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==
   dependencies:
-    "@babel/types" "^7.4.4"
+    "@babel/types" "^7.7.0"
 
-"@babel/helper-member-expression-to-functions@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590"
-  integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==
+"@babel/helper-member-expression-to-functions@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz#472b93003a57071f95a541ea6c2b098398bcad8a"
+  integrity sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==
   dependencies:
-    "@babel/types" "^7.5.5"
+    "@babel/types" "^7.7.0"
 
-"@babel/helper-module-imports@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d"
-  integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d"
+  integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==
   dependencies:
-    "@babel/types" "^7.0.0"
+    "@babel/types" "^7.7.0"
 
-"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a"
-  integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==
+"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz#154a69f0c5b8fd4d39e49750ff7ac4faa3f36786"
+  integrity sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==
   dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
-    "@babel/helper-simple-access" "^7.1.0"
-    "@babel/helper-split-export-declaration" "^7.4.4"
-    "@babel/template" "^7.4.4"
-    "@babel/types" "^7.5.5"
+    "@babel/helper-module-imports" "^7.7.0"
+    "@babel/helper-simple-access" "^7.7.0"
+    "@babel/helper-split-export-declaration" "^7.7.0"
+    "@babel/template" "^7.7.0"
+    "@babel/types" "^7.7.0"
     lodash "^4.17.13"
 
-"@babel/helper-optimise-call-expression@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5"
-  integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==
+"@babel/helper-optimise-call-expression@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz#4f66a216116a66164135dc618c5d8b7a959f9365"
+  integrity sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==
   dependencies:
-    "@babel/types" "^7.0.0"
+    "@babel/types" "^7.7.0"
 
 "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.0.0-beta.48":
   version "7.0.0"
@@ -208,60 +216,60 @@
   dependencies:
     lodash "^4.17.13"
 
-"@babel/helper-remap-async-to-generator@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f"
-  integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.0.0"
-    "@babel/helper-wrap-function" "^7.1.0"
-    "@babel/template" "^7.1.0"
-    "@babel/traverse" "^7.1.0"
-    "@babel/types" "^7.0.0"
-
-"@babel/helper-replace-supers@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2"
-  integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==
-  dependencies:
-    "@babel/helper-member-expression-to-functions" "^7.5.5"
-    "@babel/helper-optimise-call-expression" "^7.0.0"
-    "@babel/traverse" "^7.5.5"
-    "@babel/types" "^7.5.5"
-
-"@babel/helper-simple-access@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c"
-  integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==
-  dependencies:
-    "@babel/template" "^7.1.0"
-    "@babel/types" "^7.0.0"
-
-"@babel/helper-split-export-declaration@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677"
-  integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==
-  dependencies:
-    "@babel/types" "^7.4.4"
-
-"@babel/helper-wrap-function@^7.1.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa"
-  integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==
-  dependencies:
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/template" "^7.1.0"
-    "@babel/traverse" "^7.1.0"
-    "@babel/types" "^7.2.0"
-
-"@babel/helpers@^7.4.3", "@babel/helpers@^7.6.0", "@babel/helpers@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153"
-  integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==
-  dependencies:
-    "@babel/template" "^7.6.0"
-    "@babel/traverse" "^7.6.2"
-    "@babel/types" "^7.6.0"
+"@babel/helper-remap-async-to-generator@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz#4d69ec653e8bff5bce62f5d33fc1508f223c75a7"
+  integrity sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.7.0"
+    "@babel/helper-wrap-function" "^7.7.0"
+    "@babel/template" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
+
+"@babel/helper-replace-supers@^7.5.5", "@babel/helper-replace-supers@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz#d5365c8667fe7cbd13b8ddddceb9bd7f2b387512"
+  integrity sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.7.0"
+    "@babel/helper-optimise-call-expression" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
+
+"@babel/helper-simple-access@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz#97a8b6c52105d76031b86237dc1852b44837243d"
+  integrity sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==
+  dependencies:
+    "@babel/template" "^7.7.0"
+    "@babel/types" "^7.7.0"
+
+"@babel/helper-split-export-declaration@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300"
+  integrity sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==
+  dependencies:
+    "@babel/types" "^7.7.0"
+
+"@babel/helper-wrap-function@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74"
+  integrity sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==
+  dependencies:
+    "@babel/helper-function-name" "^7.7.0"
+    "@babel/template" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
+
+"@babel/helpers@^7.4.3", "@babel/helpers@^7.6.0", "@babel/helpers@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.0.tgz#359bb5ac3b4726f7c1fde0ec75f64b3f4275d60b"
+  integrity sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==
+  dependencies:
+    "@babel/template" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
 
 "@babel/highlight@^7.0.0":
   version "7.5.0"
@@ -272,18 +280,18 @@
     esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1"
-  integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2":
+  version "7.7.3"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.3.tgz#5fad457c2529de476a248f75b0f090b3060af043"
+  integrity sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==
 
-"@babel/plugin-proposal-async-generator-functions@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e"
-  integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==
+"@babel/plugin-proposal-async-generator-functions@^7.2.0", "@babel/plugin-proposal-async-generator-functions@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz#83ef2d6044496b4c15d8b4904e2219e6dccc6971"
+  integrity sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-remap-async-to-generator" "^7.1.0"
+    "@babel/helper-remap-async-to-generator" "^7.7.0"
     "@babel/plugin-syntax-async-generators" "^7.2.0"
 
 "@babel/plugin-proposal-class-properties@7.5.5":
@@ -303,10 +311,10 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-decorators" "^7.2.0"
 
-"@babel/plugin-proposal-dynamic-import@^7.5.0":
-  version "7.5.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506"
-  integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==
+"@babel/plugin-proposal-dynamic-import@^7.5.0", "@babel/plugin-proposal-dynamic-import@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz#dc02a8bad8d653fb59daf085516fa416edd2aa7f"
+  integrity sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-dynamic-import" "^7.2.0"
@@ -343,14 +351,13 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
 
-"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802"
-  integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==
+"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz#549fe1717a1bd0a2a7e63163841cb37e78179d5d"
+  integrity sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==
   dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-regex" "^7.4.4"
-    regexpu-core "^4.6.0"
 
 "@babel/plugin-syntax-async-generators@^7.2.0":
   version "7.2.0"
@@ -374,9 +381,9 @@
     "@babel/helper-plugin-utils" "^7.0.0"
 
 "@babel/plugin-syntax-flow@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c"
-  integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz#5c9465bcd26354d5215294ea90ab1c706a571386"
+  integrity sha512-vQMV07p+L+jZeUnvX3pEJ9EiXGCjB5CTTvsirFD9rpEuATnoAvLBLoYbw1v5tyn3d2XxSuvEKi8cV3KqYUa0vQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
@@ -408,6 +415,13 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
+"@babel/plugin-syntax-top-level-await@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz#f5699549f50bbe8d12b1843a4e82f0a37bb65f4d"
+  integrity sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+
 "@babel/plugin-syntax-typescript@^7.2.0":
   version "7.3.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991"
@@ -422,14 +436,14 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-async-to-generator@^7.5.0":
-  version "7.5.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e"
-  integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==
+"@babel/plugin-transform-async-to-generator@^7.5.0", "@babel/plugin-transform-async-to-generator@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz#e2b84f11952cf5913fe3438b7d2585042772f492"
+  integrity sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==
   dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
+    "@babel/helper-module-imports" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-remap-async-to-generator" "^7.1.0"
+    "@babel/helper-remap-async-to-generator" "^7.7.0"
 
 "@babel/plugin-transform-block-scoped-functions@^7.2.0":
   version "7.2.0"
@@ -438,26 +452,26 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79"
-  integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==
+"@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.6.3":
+  version "7.6.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a"
+  integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
     lodash "^4.17.13"
 
-"@babel/plugin-transform-classes@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9"
-  integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==
+"@babel/plugin-transform-classes@^7.5.5", "@babel/plugin-transform-classes@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz#b411ecc1b8822d24b81e5d184f24149136eddd4a"
+  integrity sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.0.0"
-    "@babel/helper-define-map" "^7.5.5"
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/helper-optimise-call-expression" "^7.0.0"
+    "@babel/helper-annotate-as-pure" "^7.7.0"
+    "@babel/helper-define-map" "^7.7.0"
+    "@babel/helper-function-name" "^7.7.0"
+    "@babel/helper-optimise-call-expression" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-replace-supers" "^7.5.5"
-    "@babel/helper-split-export-declaration" "^7.4.4"
+    "@babel/helper-replace-supers" "^7.7.0"
+    "@babel/helper-split-export-declaration" "^7.7.0"
     globals "^11.1.0"
 
 "@babel/plugin-transform-computed-properties@^7.2.0":
@@ -474,14 +488,13 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9"
-  integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==
+"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz#c5c9ecacab3a5e0c11db6981610f0c32fd698b3b"
+  integrity sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==
   dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-regex" "^7.4.4"
-    regexpu-core "^4.6.0"
 
 "@babel/plugin-transform-duplicate-keys@^7.5.0":
   version "7.5.0"
@@ -513,12 +526,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-function-name@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad"
-  integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==
+"@babel/plugin-transform-function-name@^7.4.4", "@babel/plugin-transform-function-name@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz#0fa786f1eef52e3b7d4fc02e54b2129de8a04c2a"
+  integrity sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==
   dependencies:
-    "@babel/helper-function-name" "^7.1.0"
+    "@babel/helper-function-name" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
 
 "@babel/plugin-transform-literals@^7.2.0":
@@ -544,39 +557,39 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-commonjs@^7.6.0":
-  version "7.6.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486"
-  integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==
+"@babel/plugin-transform-modules-commonjs@^7.6.0", "@babel/plugin-transform-modules-commonjs@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3"
+  integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==
   dependencies:
-    "@babel/helper-module-transforms" "^7.4.4"
+    "@babel/helper-module-transforms" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-simple-access" "^7.1.0"
+    "@babel/helper-simple-access" "^7.7.0"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-systemjs@^7.5.0":
-  version "7.5.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249"
-  integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==
+"@babel/plugin-transform-modules-systemjs@^7.5.0", "@babel/plugin-transform-modules-systemjs@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz#9baf471213af9761c1617bb12fd278e629041417"
+  integrity sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.4.4"
+    "@babel/helper-hoist-variables" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-umd@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae"
-  integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==
+"@babel/plugin-transform-modules-umd@^7.2.0", "@babel/plugin-transform-modules-umd@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz#d62c7da16670908e1d8c68ca0b5d4c0097b69966"
+  integrity sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==
   dependencies:
-    "@babel/helper-module-transforms" "^7.1.0"
+    "@babel/helper-module-transforms" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.6.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz#c1ca0bb84b94f385ca302c3932e870b0fb0e522b"
-  integrity sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.6.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz#358e6fd869b9a4d8f5cbc79e4ed4fc340e60dcaf"
+  integrity sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==
   dependencies:
-    regexpu-core "^4.6.0"
+    "@babel/helper-create-regexp-features-plugin" "^7.7.0"
 
 "@babel/plugin-transform-new-target@^7.4.4":
   version "7.4.4"
@@ -610,9 +623,9 @@
     "@babel/helper-plugin-utils" "^7.0.0"
 
 "@babel/plugin-transform-react-constant-elements@^7.0.0":
-  version "7.6.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.6.0.tgz#13b8434fb817d30feebd811256eb402c9a245c9e"
-  integrity sha512-np/nPuII8DHOZWB3u8u+NSeKlEz0eBrOlnVksIQog4C9NGVzXO+NLxMcXn4Eu4GMFzOw2W6Tyo6L3+Wv8z9Y5w==
+  version "7.6.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.6.3.tgz#9fc9ea060b983c7c035acbe481cbe1fb1245bfff"
+  integrity sha512-1/YogSSU7Tby9rq2VCmhuRg+6pxsHy2rI7w/oo8RKoBt6uBUFG+mk6x13kK+FY1/ggN92HAfg7ADd1v1+NCOKg==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.0.0"
     "@babel/helper-plugin-utils" "^7.0.0"
@@ -640,19 +653,19 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-jsx" "^7.2.0"
 
-"@babel/plugin-transform-react-jsx@^7.0.0":
-  version "7.3.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290"
-  integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==
+"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.0.tgz#834b0723ba78cd4d24d7d629300c2270f516d0b7"
+  integrity sha512-mXhBtyVB1Ujfy+0L6934jeJcSXj/VCg6whZzEcgiiZHNS0PGC7vUCsZDQCxxztkpIdF+dY1fUMcjAgEOC3ZOMQ==
   dependencies:
-    "@babel/helper-builder-react-jsx" "^7.3.0"
+    "@babel/helper-builder-react-jsx" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-jsx" "^7.2.0"
 
-"@babel/plugin-transform-regenerator@^7.4.5":
-  version "7.4.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f"
-  integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==
+"@babel/plugin-transform-regenerator@^7.4.5", "@babel/plugin-transform-regenerator@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz#f1b20b535e7716b622c99e989259d7dd942dd9cc"
+  integrity sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==
   dependencies:
     regenerator-transform "^0.14.0"
 
@@ -711,22 +724,21 @@
     "@babel/helper-plugin-utils" "^7.0.0"
 
 "@babel/plugin-transform-typescript@^7.6.0":
-  version "7.6.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.0.tgz#48d78405f1aa856ebeea7288a48a19ed8da377a6"
-  integrity sha512-yzw7EopOOr6saONZ3KA3lpizKnWRTe+rfBqg4AmQbSow7ik7fqmzrfIqt053osLwLE2AaTqGinLM2tl6+M/uog==
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.2.tgz#eb9f14c516b5d36f4d6f3a9d7badae6d0fc313d4"
+  integrity sha512-UWhDaJRqdPUtdK1s0sKYdoRuqK0NepjZto2UZltvuCgMoMZmdjhgz5hcRokie/3aYEaSz3xvusyoayVaq4PjRg==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.6.0"
+    "@babel/helper-create-class-features-plugin" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-typescript" "^7.2.0"
 
-"@babel/plugin-transform-unicode-regex@^7.4.4", "@babel/plugin-transform-unicode-regex@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698"
-  integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==
+"@babel/plugin-transform-unicode-regex@^7.4.4", "@babel/plugin-transform-unicode-regex@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz#743d9bcc44080e3cc7d49259a066efa30f9187a3"
+  integrity sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==
   dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-regex" "^7.4.4"
-    regexpu-core "^4.6.0"
 
 "@babel/preset-env@7.6.0":
   version "7.6.0"
@@ -785,62 +797,63 @@
     semver "^5.5.0"
 
 "@babel/preset-env@^7.1.6":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.2.tgz#abbb3ed785c7fe4220d4c82a53621d71fc0c75d3"
-  integrity sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q==
+  version "7.7.1"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb"
+  integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==
   dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
+    "@babel/helper-module-imports" "^7.7.0"
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
-    "@babel/plugin-proposal-dynamic-import" "^7.5.0"
+    "@babel/plugin-proposal-async-generator-functions" "^7.7.0"
+    "@babel/plugin-proposal-dynamic-import" "^7.7.0"
     "@babel/plugin-proposal-json-strings" "^7.2.0"
     "@babel/plugin-proposal-object-rest-spread" "^7.6.2"
     "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.6.2"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.7.0"
     "@babel/plugin-syntax-async-generators" "^7.2.0"
     "@babel/plugin-syntax-dynamic-import" "^7.2.0"
     "@babel/plugin-syntax-json-strings" "^7.2.0"
     "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+    "@babel/plugin-syntax-top-level-await" "^7.7.0"
     "@babel/plugin-transform-arrow-functions" "^7.2.0"
-    "@babel/plugin-transform-async-to-generator" "^7.5.0"
+    "@babel/plugin-transform-async-to-generator" "^7.7.0"
     "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
-    "@babel/plugin-transform-block-scoping" "^7.6.2"
-    "@babel/plugin-transform-classes" "^7.5.5"
+    "@babel/plugin-transform-block-scoping" "^7.6.3"
+    "@babel/plugin-transform-classes" "^7.7.0"
     "@babel/plugin-transform-computed-properties" "^7.2.0"
     "@babel/plugin-transform-destructuring" "^7.6.0"
-    "@babel/plugin-transform-dotall-regex" "^7.6.2"
+    "@babel/plugin-transform-dotall-regex" "^7.7.0"
     "@babel/plugin-transform-duplicate-keys" "^7.5.0"
     "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
     "@babel/plugin-transform-for-of" "^7.4.4"
-    "@babel/plugin-transform-function-name" "^7.4.4"
+    "@babel/plugin-transform-function-name" "^7.7.0"
     "@babel/plugin-transform-literals" "^7.2.0"
     "@babel/plugin-transform-member-expression-literals" "^7.2.0"
     "@babel/plugin-transform-modules-amd" "^7.5.0"
-    "@babel/plugin-transform-modules-commonjs" "^7.6.0"
-    "@babel/plugin-transform-modules-systemjs" "^7.5.0"
-    "@babel/plugin-transform-modules-umd" "^7.2.0"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.2"
+    "@babel/plugin-transform-modules-commonjs" "^7.7.0"
+    "@babel/plugin-transform-modules-systemjs" "^7.7.0"
+    "@babel/plugin-transform-modules-umd" "^7.7.0"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0"
     "@babel/plugin-transform-new-target" "^7.4.4"
     "@babel/plugin-transform-object-super" "^7.5.5"
     "@babel/plugin-transform-parameters" "^7.4.4"
     "@babel/plugin-transform-property-literals" "^7.2.0"
-    "@babel/plugin-transform-regenerator" "^7.4.5"
+    "@babel/plugin-transform-regenerator" "^7.7.0"
     "@babel/plugin-transform-reserved-words" "^7.2.0"
     "@babel/plugin-transform-shorthand-properties" "^7.2.0"
     "@babel/plugin-transform-spread" "^7.6.2"
     "@babel/plugin-transform-sticky-regex" "^7.2.0"
     "@babel/plugin-transform-template-literals" "^7.4.4"
     "@babel/plugin-transform-typeof-symbol" "^7.2.0"
-    "@babel/plugin-transform-unicode-regex" "^7.6.2"
-    "@babel/types" "^7.6.0"
+    "@babel/plugin-transform-unicode-regex" "^7.7.0"
+    "@babel/types" "^7.7.1"
     browserslist "^4.6.0"
     core-js-compat "^3.1.1"
     invariant "^2.2.2"
     js-levenshtein "^1.1.3"
     semver "^5.5.0"
 
-"@babel/preset-react@7.0.0", "@babel/preset-react@^7.0.0":
+"@babel/preset-react@7.0.0":
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0"
   integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==
@@ -851,6 +864,17 @@
     "@babel/plugin-transform-react-jsx-self" "^7.0.0"
     "@babel/plugin-transform-react-jsx-source" "^7.0.0"
 
+"@babel/preset-react@^7.0.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.7.0.tgz#8ab0c4787d98cf1f5f22dabf115552bf9e4e406c"
+  integrity sha512-IXXgSUYBPHUGhUkH+89TR6faMcBtuMW0h5OHbMuVbL3/5wK2g6a2M2BBpkLa+Kw0sAHiZ9dNVgqJMDP/O4GRBA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/plugin-transform-react-display-name" "^7.0.0"
+    "@babel/plugin-transform-react-jsx" "^7.7.0"
+    "@babel/plugin-transform-react-jsx-self" "^7.0.0"
+    "@babel/plugin-transform-react-jsx-source" "^7.0.0"
+
 "@babel/preset-typescript@7.6.0":
   version "7.6.0"
   resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.6.0.tgz#25768cb8830280baf47c45ab1a519a9977498c98"
@@ -860,9 +884,9 @@
     "@babel/plugin-transform-typescript" "^7.6.0"
 
 "@babel/runtime-corejs2@^7.0.0":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.6.2.tgz#062f8e31f3df30fc1a3dea68aa1bd854e06e9ba6"
-  integrity sha512-wdyVKnTv9Be4YlwF/7pByYNfcl23qC21aAQ0aIaZOo2ZOvhFEyJdBLJClYZ9i+Pmrz7sUQgg/MwbJa2RZTkygg==
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.7.2.tgz#5a8c4e2f8688ce58adc9eb1d8320b6e7341f96ce"
+  integrity sha512-GfVnHchOBvIMsweQ13l4jd9lT4brkevnavnVOej5g2y7PpTRY+R4pcQlCjWMZoUla5rMLFzaS/Ll2s59cB1TqQ==
   dependencies:
     core-js "^2.6.5"
     regenerator-runtime "^0.13.2"
@@ -874,41 +898,41 @@
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.2.tgz#c3d6e41b304ef10dcf13777a33e7694ec4a9a6dd"
-  integrity sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.1", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3":
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a"
+  integrity sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0":
-  version "7.6.0"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
-  integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==
+"@babel/template@^7.4.0", "@babel/template@^7.6.0", "@babel/template@^7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0"
+  integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.6.0"
-    "@babel/types" "^7.6.0"
+    "@babel/parser" "^7.7.0"
+    "@babel/types" "^7.7.0"
 
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.0", "@babel/traverse@^7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c"
-  integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.6.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2":
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09"
+  integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==
   dependencies:
     "@babel/code-frame" "^7.5.5"
-    "@babel/generator" "^7.6.2"
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/helper-split-export-declaration" "^7.4.4"
-    "@babel/parser" "^7.6.2"
-    "@babel/types" "^7.6.0"
+    "@babel/generator" "^7.7.2"
+    "@babel/helper-function-name" "^7.7.0"
+    "@babel/helper-split-export-declaration" "^7.7.0"
+    "@babel/parser" "^7.7.2"
+    "@babel/types" "^7.7.2"
     debug "^4.1.0"
     globals "^11.1.0"
     lodash "^4.17.13"
 
-"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0":
-  version "7.6.1"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648"
-  integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==
+"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0", "@babel/types@^7.7.0", "@babel/types@^7.7.1", "@babel/types@^7.7.2":
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7"
+  integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==
   dependencies:
     esutils "^2.0.2"
     lodash "^4.17.13"
@@ -1030,10 +1054,10 @@
   resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a"
   integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==
 
-"@hapi/hoek@8.x.x":
-  version "8.2.5"
-  resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.2.5.tgz#b307d3f1aced22e05bd6a2403c302eaebb577da3"
-  integrity sha512-rmGFzok1zR3xZKd5m3ihWdqafXFxvPHoQ/78+AG5URKbEbJiwBBfRgzbu+07W5f3+07JRshw6QqGbVmCp8ntig==
+"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0":
+  version "8.5.0"
+  resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.0.tgz#2f9ce301c8898e1c3248b0a8564696b24d1a9a5a"
+  integrity sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==
 
 "@hapi/joi@^15.0.0":
   version "15.1.1"
@@ -1046,11 +1070,11 @@
     "@hapi/topo" "3.x.x"
 
 "@hapi/topo@3.x.x":
-  version "3.1.4"
-  resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.4.tgz#42e2fe36f593d90ad258a08b582be128c141c45d"
-  integrity sha512-aVWQTOI9wBD6zawmOr6f+tdEIxQC8JXfQVLTjgGe8YEStAWGn/GNNVTobKJhbWKveQj2RyYF3oYbO9SC8/eOCA==
+  version "3.1.6"
+  resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
+  integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==
   dependencies:
-    "@hapi/hoek" "8.x.x"
+    "@hapi/hoek" "^8.3.0"
 
 "@jest/console@^24.7.1", "@jest/console@^24.9.0":
   version "24.9.0"
@@ -1208,55 +1232,58 @@
     call-me-maybe "^1.0.1"
     glob-to-regexp "^0.3.0"
 
-"@nodelib/fs.scandir@2.1.2":
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.2.tgz#1f981cd5b83e85cfdeb386fc693d4baab392fa54"
-  integrity sha512-wrIBsjA5pl13f0RN4Zx4FNWmU71lv03meGKnqRUoCyan17s4V3WL92f3w3AIuWbNnpcrQyFBU5qMavJoB8d27w==
+"@nodelib/fs.scandir@2.1.3":
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+  integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
   dependencies:
-    "@nodelib/fs.stat" "2.0.2"
+    "@nodelib/fs.stat" "2.0.3"
     run-parallel "^1.1.9"
 
-"@nodelib/fs.stat@2.0.2", "@nodelib/fs.stat@^2.0.1":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.2.tgz#2762aea8fe78ea256860182dcb52d61ee4b8fda6"
-  integrity sha512-z8+wGWV2dgUhLqrtRYa03yDx4HWMvXKi1z8g3m2JyxAx8F7xk74asqPk5LAETjqDSGLFML/6CDl0+yFunSYicw==
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+  integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
 
 "@nodelib/fs.stat@^1.1.2":
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
   integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
 
-"@nodelib/fs.walk@^1.2.1":
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.3.tgz#a555dc256acaf00c62b0db29529028dd4d4cb141"
-  integrity sha512-l6t8xEhfK9Sa4YO5mIRdau7XSOADfmh3jCr0evNHdY+HNkW6xuQhgMH7D73VV6WpZOagrW0UludvMTiifiwTfA==
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+  integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
   dependencies:
-    "@nodelib/fs.scandir" "2.1.2"
+    "@nodelib/fs.scandir" "2.1.3"
     fastq "^1.6.0"
 
-"@octokit/endpoint@^5.1.0":
-  version "5.3.6"
-  resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.3.6.tgz#58a67b75b853127568e0db533cdd10f3bdca2e23"
-  integrity sha512-XuerByak8H+jW9J/rVMEdBXfI4UTsDWUwAKgIP/uhQjXIUVdPRwt2Zg+SmbWQ+WY7pRkw/hFVES8C4G/Kle7oA==
+"@octokit/endpoint@^5.5.0":
+  version "5.5.1"
+  resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.5.1.tgz#2eea81e110ca754ff2de11c79154ccab4ae16b3f"
+  integrity sha512-nBFhRUb5YzVTCX/iAK1MgQ4uWo89Gu0TH00qQHoYRCsE12dWcG1OiLd7v2EIo2+tpUKPMOQ62QFy9hy9Vg2ULg==
   dependencies:
+    "@octokit/types" "^2.0.0"
     is-plain-object "^3.0.0"
     universal-user-agent "^4.0.0"
 
 "@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2":
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.0.4.tgz#15e1dc22123ba4a9a4391914d80ec1e5303a23be"
-  integrity sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig==
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.0.tgz#a64d2a9d7a13555570cd79722de4a4d76371baaa"
+  integrity sha512-DNBhROBYjjV/I9n7A8kVkmQNkqFAMem90dSxqvPq57e2hBr7mNTX98y3R2zDpqMQHVRpBDjsvsfIGgBzy+4PAg==
   dependencies:
+    "@octokit/types" "^2.0.0"
     deprecation "^2.0.0"
     once "^1.4.0"
 
-"@octokit/request@^5.0.0":
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.1.0.tgz#5609dcc7b5323e529f29d535214383d9eaf0c05c"
-  integrity sha512-I15T9PwjFs4tbWyhtFU2Kq7WDPidYMvRB7spmxoQRZfxSmiqullG+Nz+KbSmpkfnlvHwTr1e31R5WReFRKMXjg==
+"@octokit/request@^5.2.0":
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.1.tgz#3a1ace45e6f88b1be4749c5da963b3a3b4a2f120"
+  integrity sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg==
   dependencies:
-    "@octokit/endpoint" "^5.1.0"
+    "@octokit/endpoint" "^5.5.0"
     "@octokit/request-error" "^1.0.1"
+    "@octokit/types" "^2.0.0"
     deprecation "^2.0.0"
     is-plain-object "^3.0.0"
     node-fetch "^2.3.0"
@@ -1264,11 +1291,11 @@
     universal-user-agent "^4.0.0"
 
 "@octokit/rest@^16.27.0":
-  version "16.30.1"
-  resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.30.1.tgz#03e6dfb93e9a9cd2b3bacb95c49a8c7923f42ad0"
-  integrity sha512-1n2QzTbbaBXNLpx7WHlcsSMdJvxSdKmerXQm+bMYlKDbQM19uq446ZpGs7Ynq5SsdLj1usIfgJ9gJf4LtcWkDw==
+  version "16.35.0"
+  resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.35.0.tgz#7ccc1f802f407d5b8eb21768c6deca44e7b4c0d8"
+  integrity sha512-9ShFqYWo0CLoGYhA1FdtdykJuMzS/9H6vSbbQWDX4pWr4p9v+15MsH/wpd/3fIU+tSxylaNO48+PIHqOkBRx3w==
   dependencies:
-    "@octokit/request" "^5.0.0"
+    "@octokit/request" "^5.2.0"
     "@octokit/request-error" "^1.0.2"
     atob-lite "^2.0.0"
     before-after-hook "^2.0.0"
@@ -1281,10 +1308,22 @@
     once "^1.4.0"
     universal-user-agent "^4.0.0"
 
-"@patternfly/patternfly@2.33.5", "@patternfly/patternfly@^2.13.0":
-  version "2.33.5"
-  resolved "https://registry.yarnpkg.com/@patternfly/patternfly/-/patternfly-2.33.5.tgz#e8abad22510d32de4933a42d7f567b152ccc0e6d"
-  integrity sha512-/4S19Ln2BY62nUP/Ow+j4gzCKm4e3HYehW92R+iaREaBgatfq55G50QdPsXDvTvLeTp9lS6YfXJlLz7OTIHnhw==
+"@octokit/types@^2.0.0":
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.0.1.tgz#0caf0364e010296265621593ac9a37f40ef75dad"
+  integrity sha512-YDYgV6nCzdGdOm7wy43Ce8SQ3M5DMKegB8E5sTB/1xrxOdo2yS/KgUgML2N2ZGD621mkbdrAglwTyA4NDOlFFA==
+  dependencies:
+    "@types/node" ">= 8"
+
+"@patternfly/patternfly@2.40.13":
+  version "2.40.13"
+  resolved "https://registry.yarnpkg.com/@patternfly/patternfly/-/patternfly-2.40.13.tgz#d1aa7de123dd63972951a67ecc0a6e04117f85db"
+  integrity sha512-2s9mHRQ117u+6XZJnodtaYpc/dcknWT+7ZRRtmAQ2Qx25iIYG4KT43/SYu0+8KlTEB/UP9e97ZG8WkuhNlK/7Q==
+
+"@patternfly/patternfly@^2.13.0":
+  version "2.41.0"
+  resolved "https://registry.yarnpkg.com/@patternfly/patternfly/-/patternfly-2.41.0.tgz#64437b2b54c91cbfe5a37f2490b6a3fba515eba2"
+  integrity sha512-w85M4hr/fhnedIcSyjxeswgdkKREd7Y2To8tl0/EiVlNfmNowZ06NuRXrzmPKjVEB8AWtSwvgCwUo+YWL2ZUJg==
 
 "@patternfly/react-charts@^4.1.5":
   version "4.9.14"
@@ -1301,30 +1340,30 @@
     victory-core "^32.2.3"
     victory-legend "^32.2.3"
 
-"@patternfly/react-core@^3.112.3", "@patternfly/react-core@^3.38.1":
-  version "3.112.3"
-  resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-3.112.3.tgz#b0af9746581091446052881537106022ed0bbd03"
-  integrity sha512-szN9UtDU3k3X5/UAWb4kv2Z4+UrB9Pd1vYg09Cr7TpjZPGtAVxNVJ6+TzUj58PLwTlS4TYO/+lWl3wjmUukbyQ==
+"@patternfly/react-core@^3.120.8", "@patternfly/react-core@^3.38.1":
+  version "3.120.8"
+  resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-3.120.8.tgz#116cc1a4c03c3dbea889295e36b6d6bf86d40e9c"
+  integrity sha512-YXyi1v7bXscjz8kDby8Qp8OSa1v83Pbre8Ow/Nzr7LuWi1IM/J1jOcTuOhDRH9+OHNAz9AUBnyxZNvE7ZL6ebQ==
   dependencies:
-    "@patternfly/react-icons" "^3.14.7"
-    "@patternfly/react-styles" "^3.5.27"
-    "@patternfly/react-tokens" "^2.6.31"
+    "@patternfly/react-icons" "^3.14.19"
+    "@patternfly/react-styles" "^3.6.6"
+    "@patternfly/react-tokens" "^2.7.6"
     emotion "^9.2.9"
     exenv "^1.2.2"
     focus-trap-react "^4.0.1"
     tippy.js "3.4.1"
 
-"@patternfly/react-icons@^3.10.4", "@patternfly/react-icons@^3.14.7":
-  version "3.14.8"
-  resolved "https://registry.yarnpkg.com/@patternfly/react-icons/-/react-icons-3.14.8.tgz#9aa526999c3720378fb071a38e611cf846495760"
-  integrity sha512-jd0idsG1s3uvD8mZy/WYEFIyRKN6V/jTzgGYzfJrROedBlhwrmjVX0ANrWtd1LEiMq17uWTdtTlpb8JdzUYZXQ==
+"@patternfly/react-icons@^3.10.4", "@patternfly/react-icons@^3.14.19":
+  version "3.14.19"
+  resolved "https://registry.yarnpkg.com/@patternfly/react-icons/-/react-icons-3.14.19.tgz#03c08b9eaab2ff51d2be855160265e62ca110c7a"
+  integrity sha512-eQekxeLRMwIViV7FH41e0/dWwEcZLm97kq51zYFKzUI7LqaiY2n8myIQ7H5znEhTA4h3q9V6iPQm5l8Ryx3fTA==
   dependencies:
     "@fortawesome/free-brands-svg-icons" "^5.8.1"
 
-"@patternfly/react-styles@^3.3.3", "@patternfly/react-styles@^3.5.23", "@patternfly/react-styles@^3.5.27":
-  version "3.5.27"
-  resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-3.5.27.tgz#a513495932ebe64ecb013d8fb1589d746ac7ea1e"
-  integrity sha512-nDhWOR+7W/oQgIw+4nwvGpoS2OgarfxlIEkFQaNdete6QyKwp2erPxDBNnj2gOGaB/+CKDWvTWD6JPhiuU56ew==
+"@patternfly/react-styles@^3.3.3", "@patternfly/react-styles@^3.5.23", "@patternfly/react-styles@^3.6.6":
+  version "3.6.6"
+  resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-3.6.6.tgz#d4b481fbd34adc28b3129842aea4834c384d4382"
+  integrity sha512-BOn6s9kuwsWRVHeTvA9D55JMYMwoNaQn9eB+MBzX2zIbZxy0TGOTgNifU99lJct+6TFxSUxx81gzpby+xBcDSQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0-beta.48"
     camel-case "^3.0.0"
@@ -1341,41 +1380,42 @@
     typescript "3.4.5"
 
 "@patternfly/react-table@^2.11.1":
-  version "2.22.19"
-  resolved "https://registry.yarnpkg.com/@patternfly/react-table/-/react-table-2.22.19.tgz#ad2aedfcf0575473b749c8a3ea00be947d9b96cb"
-  integrity sha512-pYHYqBth2c5hCkWQNJKx5l5GBfVcDtN9d8kVGNDlbvOuqfBzG64QVB0zdpSXo8tiSgmOuvyRN7ElNVZRA95QrQ==
-  dependencies:
-    "@patternfly/patternfly" "2.33.5"
-    "@patternfly/react-core" "^3.112.3"
-    "@patternfly/react-icons" "^3.14.7"
-    "@patternfly/react-styles" "^3.5.27"
-    "@patternfly/react-tokens" "^2.6.31"
+  version "2.24.22"
+  resolved "https://registry.yarnpkg.com/@patternfly/react-table/-/react-table-2.24.22.tgz#a801f87511c02664696dd3ad2d607e58d1760b72"
+  integrity sha512-FT76bY8tPhB7nn9mh739NUV/OzOPEW/MQGF4oZa6A1ABgQTq/PZ5oGxbwAc7DBow/9pKdsm5J39Tz4EWzE9RPA==
+  dependencies:
+    "@patternfly/patternfly" "2.40.13"
+    "@patternfly/react-core" "^3.120.8"
+    "@patternfly/react-icons" "^3.14.19"
+    "@patternfly/react-styles" "^3.6.6"
+    "@patternfly/react-tokens" "^2.7.6"
     classnames "^2.2.5"
     exenv "^1.2.2"
     lodash "^4.17.15"
 
-"@patternfly/react-tokens@^2.6.31":
-  version "2.6.31"
-  resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-2.6.31.tgz#3fab62e9ccf4d81f6c10edbcf66836264362b3d3"
-  integrity sha512-K9semfLIdf2vECefAbheXPVwZqq8nXY0Hf/VkWh6OBCL6R4FekxajpSBgobeoTQUotmvz5boMngqhkUjE7yChA==
+"@patternfly/react-tokens@^2.7.6":
+  version "2.7.6"
+  resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-2.7.6.tgz#8a8f4422aca1ead3cf4f024f323d33a793953aaa"
+  integrity sha512-fNrzE+XAFunYLs/djNDf/qVqzGT09yzwW898NwjyeWuZCf/tqHOIN+kRU+goq2eaRjSKCnM0XrUAFGPQIelarQ==
 
 "@patternfly/react-topology@^2.7.31":
-  version "2.8.65"
-  resolved "https://registry.yarnpkg.com/@patternfly/react-topology/-/react-topology-2.8.65.tgz#bb56244ece9527c962ea6ce77094043d72f8a241"
-  integrity sha512-8aVXlq5zV3kNbd8lpRQ2ZVF2b1G2TxsepVw2NnXq4BhMFH4rPp69DjohlTBZrMzYSlF2OIGn7ggXXGwNunreIA==
+  version "2.11.8"
+  resolved "https://registry.yarnpkg.com/@patternfly/react-topology/-/react-topology-2.11.8.tgz#88a07c7113ba467da1c4b5d69752c14767f95db8"
+  integrity sha512-/o5gMC+OAhyotGsrnW8dovd9870p7YW1lUdYh/MVGJV4T+yjitVSyOsnoTGMxxrWRKlH3OMeo8koRutJAiFH3Q==
   dependencies:
-    "@patternfly/react-core" "^3.112.3"
-    "@patternfly/react-icons" "^3.14.7"
-    "@patternfly/react-styles" "^3.5.27"
+    "@patternfly/patternfly" "2.40.13"
+    "@patternfly/react-core" "^3.120.8"
+    "@patternfly/react-icons" "^3.14.19"
+    "@patternfly/react-styles" "^3.6.6"
 
 "@semantic-release/commit-analyzer@^6.1.0":
-  version "6.3.0"
-  resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-6.3.0.tgz#e0fb2f6af7be2321ad9401d8ae25be0cc1005d83"
-  integrity sha512-sh51MVlV8VyrvGIemcvzueDADX/8qGbAgce1F0CtQv8hNKYyhdaJeHzfiM1rNXwCynDmcQj+Yq9rrWt71tBd/Q==
+  version "6.3.3"
+  resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-6.3.3.tgz#885f7e46e2f0aef23a23be0904dbf18d6ece45ca"
+  integrity sha512-Pyv1ZL2u5AIOY4YbxFCAB5J1PEh5yON8ylbfiPiriDGGW6Uu1U3Y8lysMtWu+FUD5x7tSnyIzhqx0+fxPxqbgw==
   dependencies:
     conventional-changelog-angular "^5.0.0"
     conventional-commits-filter "^2.0.0"
-    conventional-commits-parser "^3.0.0"
+    conventional-commits-parser "^3.0.7"
     debug "^4.0.0"
     import-from "^3.0.0"
     lodash "^4.17.4"
@@ -1386,9 +1426,9 @@
   integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==
 
 "@semantic-release/github@^5.1.0":
-  version "5.5.0"
-  resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-5.5.0.tgz#2a9ae28d5980b0282cd646f19fb062128c8862f0"
-  integrity sha512-Rg7cZr1sgUmo5iuzhGOhFdAw6NWGH7I9RbZA1wySO4M+enFkBxtA3Joy+RQKrzbrSAPwEJyP6ZixXXB1qfKAtg==
+  version "5.5.5"
+  resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-5.5.5.tgz#4666367f16d8ad91fd1d3c71a7238498de14ec38"
+  integrity sha512-Wo9OIULMRydbq+HpFh9yiLvra1XyEULPro9Tp4T5MQJ0WZyAQ3YQm74IdT8Pe/UmVDq2nfpT1oHrWkwOc4loHg==
   dependencies:
     "@octokit/rest" "^16.27.0"
     "@semantic-release/error" "^2.2.0"
@@ -1399,23 +1439,22 @@
     fs-extra "^8.0.0"
     globby "^10.0.0"
     http-proxy-agent "^2.1.0"
-    https-proxy-agent "^2.2.1"
-    issue-parser "^4.0.0"
+    https-proxy-agent "^3.0.0"
+    issue-parser "^5.0.0"
     lodash "^4.17.4"
     mime "^2.4.3"
     p-filter "^2.0.0"
     p-retry "^4.0.0"
-    parse-github-url "^1.0.1"
     url-join "^4.0.0"
 
 "@semantic-release/npm@^5.0.5":
-  version "5.1.15"
-  resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-5.1.15.tgz#dbf5e37bc4ce4be0a48a82c27ca4ad1e584f12ee"
-  integrity sha512-MUUKOOtqsX/aJZJIjiAdw7SkCH+D3De060l1HhTlqrwTB7PzMtXcUMen6Prd1Hv8+gknUFkSWhVmi8tIaGDVnA==
+  version "5.3.4"
+  resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-5.3.4.tgz#2998cd9455aaedf278334d4a5b56f8e0b715919d"
+  integrity sha512-XjITNRA/oOpJ7BfHk/WaOHs1WniYBszTde/bwADjjk1Luacpxg87jbDQVVt/oA3Zlx+MelxACRIEuRiPC5gu8g==
   dependencies:
     "@semantic-release/error" "^2.2.0"
     aggregate-error "^3.0.0"
-    execa "^2.0.2"
+    execa "^3.2.0"
     fs-extra "^8.0.0"
     lodash "^4.17.15"
     nerf-dart "^1.0.0"
@@ -1424,11 +1463,12 @@
     rc "^1.2.8"
     read-pkg "^5.0.0"
     registry-auth-token "^4.0.0"
+    tempy "^0.3.0"
 
 "@semantic-release/release-notes-generator@^7.1.2":
-  version "7.3.0"
-  resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-7.3.0.tgz#b94f3d84d7071eb8e921b53a9729ca48722e7c0f"
-  integrity sha512-6ozBLHM9XZR6Z8PFSKssLtwBYc5l1WOnxj034F8051QOo3TMKDDPKwdj2Niyc+e7ru7tGa3Ftq7nfN0YnD6//A==
+  version "7.3.2"
+  resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-7.3.2.tgz#a858b35c9c62f780d285aeaca8ef9891a62c2f9c"
+  integrity sha512-vYGydZPoQqL4aJOsaqXTZIekRb3aa/OlxlEVUvyrWWlNGqmQ1T7NUOos9eoN5DBCEuk6PwDrxPbhzgswxcvprQ==
   dependencies:
     conventional-changelog-angular "^5.0.0"
     conventional-changelog-writer "^4.0.0"
@@ -1439,7 +1479,12 @@
     import-from "^3.0.0"
     into-stream "^5.0.0"
     lodash "^4.17.4"
-    read-pkg-up "^6.0.0"
+    read-pkg-up "^7.0.0"
+
+"@sheerun/mutationobserver-shim@^0.3.2":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b"
+  integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==
 
 "@svgr/babel-plugin-add-jsx-attribute@^4.2.0":
   version "4.2.0"
@@ -1544,6 +1589,42 @@
     "@svgr/plugin-svgo" "^4.0.3"
     loader-utils "^1.1.0"
 
+"@testing-library/dom@^6.3.0":
+  version "6.10.1"
+  resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.10.1.tgz#da5bf5065d3f9e484aef4cc495f4e1a5bea6df2e"
+  integrity sha512-5BPKxaO+zSJDUbVZBRNf9KrmDkm/EcjjaHSg3F9+031VZyPACKXlwLBjVzZxheunT9m72DoIq7WvyE457/Xweg==
+  dependencies:
+    "@babel/runtime" "^7.6.2"
+    "@sheerun/mutationobserver-shim" "^0.3.2"
+    "@types/testing-library__dom" "^6.0.0"
+    aria-query "3.0.0"
+    pretty-format "^24.9.0"
+    wait-for-expect "^3.0.0"
+
+"@testing-library/jest-dom@^4.2.3":
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.3.tgz#2b40d463d6cb00b5550d04381912e048e8e35966"
+  integrity sha512-lrsm8OMaOLjh8AJhTNZW85Vur+a2U00ej1r/dNzABN4vfJ2kllsP/eLgkOdfCHuspdXn3/Q6rLt/41dSueVCyg==
+  dependencies:
+    "@babel/runtime" "^7.5.1"
+    chalk "^2.4.1"
+    css "^2.2.3"
+    css.escape "^1.5.1"
+    jest-diff "^24.0.0"
+    jest-matcher-utils "^24.0.0"
+    lodash "^4.17.11"
+    pretty-format "^24.0.0"
+    redent "^3.0.0"
+
+"@testing-library/react@^9.3.2":
+  version "9.3.2"
+  resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.3.2.tgz#418000daa980dafd2d9420cc733d661daece9aa0"
+  integrity sha512-J6ftWtm218tOLS175MF9eWCxGp+X+cUXCpkPIin8KAXWtyZbr9CbqJ8M8QNd6spZxJDAGlw+leLG4MJWLlqVgg==
+  dependencies:
+    "@babel/runtime" "^7.6.0"
+    "@testing-library/dom" "^6.3.0"
+    "@types/testing-library__react" "^9.1.0"
+
 "@types/babel__core@^7.1.0":
   version "7.1.3"
   resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30"
@@ -1636,9 +1717,9 @@
   integrity sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA==
 
 "@types/d3-ease@*":
-  version "1.0.8"
-  resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.8.tgz#b440761fb85985d76259ec9c5bf01c4c56778ac2"
-  integrity sha512-VRf8czVWHSJPoUWxMunzpePK02//wHDAswknU8QWzcyrQn6pqe46bHRYi2smSpw5VjsT2CG8k/QeWIdWPS3Bmg==
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.9.tgz#1dd849bd7edef6426e915e220ed9970db5ea4e04"
+  integrity sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q==
 
 "@types/d3-force@*":
   version "1.2.1"
@@ -1714,9 +1795,9 @@
   integrity sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA==
 
 "@types/d3-shape@*":
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.1.tgz#1b4f92b7efd7306fe2474dc6ee94c0f0ed2e6ab6"
-  integrity sha512-usqdvUvPJ7AJNwpd2drOzRKs1ELie53p2m2GnPKr076/ADM579jVTJ5dPsoZ5E/CMNWk8lvPWYQSvilpp6jjwg==
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.2.tgz#a41d9d6b10d02e221696b240caf0b5d0f5a588ec"
+  integrity sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w==
   dependencies:
     "@types/d3-path" "*"
 
@@ -1736,9 +1817,9 @@
   integrity sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ==
 
 "@types/d3-transition@*":
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.1.4.tgz#3c7a35ae9acfc59dfef1eb7308ebabf0fc0680de"
-  integrity sha512-/vsmKVUIXEyCcIXYAlw7bnYkIs9/J/nZbptRJFKUN3FdXq/dF6j9z9xXzerkyU6TDHLrMrwx9eGwdKyTIy/j9w==
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.1.5.tgz#b75b871664a45ce7c862e337a16bd1c42cc14857"
+  integrity sha512-4IexeQEmEk2u5/ZxqHPCiKxX+sn7uPsg+wb6zL3KLqj8jFlhcueAo3a5Tj1Z74VBeeeQjirdSFNtR87Gox/iwA==
   dependencies:
     "@types/d3-selection" "*"
 
@@ -1831,25 +1912,30 @@
     "@types/istanbul-lib-report" "*"
 
 "@types/lodash@^4.14.132":
-  version "4.14.141"
-  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.141.tgz#d81f4d0c562abe28713406b571ffb27692a82ae6"
-  integrity sha512-v5NYIi9qEbFEUpCyikmnOYe4YlP8BMUdTcNCAquAKzu+FA7rZ1onj9x80mbnDdOW/K5bFf3Tv5kJplP33+gAbQ==
+  version "4.14.146"
+  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.146.tgz#de0d2c8610012f12a6a796455054cbc654f8fecf"
+  integrity sha512-JzJcmQ/ikHSv7pbvrVNKJU5j9jL9VLf3/gqs048CEnBVVVEv4kve3vLxoPHGvclutS+Il4SBIuQQ087m1eHffw==
 
 "@types/minimatch@*":
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
   integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
 
-"@types/node@*", "@types/node@^12.0.2":
-  version "12.7.9"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.9.tgz#da0210f91096aa67138cf5afd04c4d629f8a406a"
-  integrity sha512-P57oKTJ/vYivL2BCfxCC5tQjlS8qW31pbOL6qt99Yrjm95YdHgNZwjrTTjMBh+C2/y6PXIX4oz253+jUzxKKfQ==
+"@types/node@*", "@types/node@>= 8", "@types/node@^12.0.2":
+  version "12.12.7"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.7.tgz#01e4ea724d9e3bd50d90c11fd5980ba317d8fa11"
+  integrity sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==
 
 "@types/normalize-package-data@^2.4.0":
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
   integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
 
+"@types/parse-json@^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+  integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
 "@types/prop-types@*":
   version "15.7.3"
   resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
@@ -1860,10 +1946,17 @@
   resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
   integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
 
-"@types/react@*":
+"@types/react-dom@*":
   version "16.9.4"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.4.tgz#de8cf5e5e2838659fb78fa93181078469eeb19fc"
-  integrity sha512-ItGNmJvQ0IvWt8rbk5PLdpdQhvBVxAaXI9hDlx7UMd8Ie1iMIuwMNiKeTfmVN517CdplpyXvA22X4zm4jGGZnw==
+  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.4.tgz#0b58df09a60961dcb77f62d4f1832427513420df"
+  integrity sha512-fya9xteU/n90tda0s+FtN5Ym4tbgxpq/hb/Af24dvs6uYnYn+fspaxw5USlw0R8apDNwxsqumdRoCoKitckQqw==
+  dependencies:
+    "@types/react" "*"
+
+"@types/react@*", "@types/react@^16.9.11":
+  version "16.9.11"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.11.tgz#70e0b7ad79058a7842f25ccf2999807076ada120"
+  integrity sha512-UBT4GZ3PokTXSWmdgC/GeCGEJXE5ofWyibCcecRLUVN2ZBpXQGVgQGtG2foS7CrTKFKlQVVswLvf7Js6XA/CVQ==
   dependencies:
     "@types/prop-types" "*"
     csstype "^2.2.0"
@@ -1878,6 +1971,21 @@
   resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
   integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
 
+"@types/testing-library__dom@*", "@types/testing-library__dom@^6.0.0":
+  version "6.10.0"
+  resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.10.0.tgz#590d76e3875a7c536dc744eb530cbf51b6483404"
+  integrity sha512-mL/GMlyQxiZplbUuFNwA0vAI3k3uJNSf6slr5AVve9TXmfLfyefNT0uHHnxwdYuPMxYD5gI/+dgAvc/5opW9JQ==
+  dependencies:
+    pretty-format "^24.3.0"
+
+"@types/testing-library__react@^9.1.0":
+  version "9.1.2"
+  resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.2.tgz#e33af9124c60a010fc03a34eff8f8a34a75c4351"
+  integrity sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==
+  dependencies:
+    "@types/react-dom" "*"
+    "@types/testing-library__dom" "*"
+
 "@types/victory@^31.0.18":
   version "31.0.22"
   resolved "https://registry.yarnpkg.com/@types/victory/-/victory-31.0.22.tgz#b1c0f87261af7bc264207e3864acfe75d0abf605"
@@ -2089,9 +2197,9 @@ JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5:
     through ">=2.2.7 <3"
 
 abab@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.2.tgz#a2fba1b122c69a85caa02d10f9270c7219709a9d"
-  integrity sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a"
+  integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==
 
 abbrev@1, abbrev@~1.1.1:
   version "1.1.1"
@@ -2120,9 +2228,9 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.0, acorn-globals@^4.3.2:
     acorn-walk "^6.0.1"
 
 acorn-jsx@^5.0.0:
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f"
-  integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
+  integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==
 
 acorn-walk@^6.0.1:
   version "6.2.0"
@@ -2134,11 +2242,16 @@ acorn@^5.5.3:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
   integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
 
-acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.5, acorn@^6.0.7, acorn@^6.1.1:
+acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.5, acorn@^6.0.7:
   version "6.3.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
   integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
 
+acorn@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
+  integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
+
 address@1.1.2, address@^1.0.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
@@ -2166,12 +2279,12 @@ agentkeepalive@^3.4.1:
     humanize-ms "^1.2.1"
 
 aggregate-error@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79"
-  integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA==
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
+  integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==
   dependencies:
     clean-stack "^2.0.0"
-    indent-string "^3.2.0"
+    indent-string "^4.0.0"
 
 ajv-errors@^1.0.0:
   version "1.0.1"
@@ -2333,7 +2446,7 @@ argv-formatter@~1.0.0:
   resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9"
   integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=
 
-aria-query@^3.0.0:
+aria-query@3.0.0, aria-query@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc"
   integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=
@@ -2498,10 +2611,12 @@ async-limiter@^1.0.0, async-limiter@~1.0.0:
   resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
   integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
 
-async@^1.5.2:
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
-  integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+async@^2.6.2:
+  version "2.6.3"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+  dependencies:
+    lodash "^4.17.14"
 
 asynckit@^0.4.0:
   version "0.4.0"
@@ -2519,17 +2634,17 @@ atob@^2.1.1:
   integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
 
 autoprefixer@^9.4.9:
-  version "9.6.1"
-  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47"
-  integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==
+  version "9.7.1"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.1.tgz#9ffc44c55f5ca89253d9bb7186cefb01ef57747f"
+  integrity sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==
   dependencies:
-    browserslist "^4.6.3"
-    caniuse-lite "^1.0.30000980"
+    browserslist "^4.7.2"
+    caniuse-lite "^1.0.30001006"
     chalk "^2.4.2"
     normalize-range "^0.1.2"
     num2fraction "^1.2.2"
-    postcss "^7.0.17"
-    postcss-value-parser "^4.0.0"
+    postcss "^7.0.21"
+    postcss-value-parser "^4.0.2"
 
 aws-sign2@~0.7.0:
   version "0.7.0"
@@ -2594,6 +2709,18 @@ babel-eslint@10.0.1:
     eslint-scope "3.7.1"
     eslint-visitor-keys "^1.0.0"
 
+babel-eslint@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220"
+  integrity sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "@babel/parser" "^7.0.0"
+    "@babel/traverse" "^7.0.0"
+    "@babel/types" "^7.0.0"
+    eslint-scope "3.7.1"
+    eslint-visitor-keys "^1.0.0"
+
 babel-extract-comments@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21"
@@ -3204,9 +3331,9 @@ binary-extensions@^1.0.0:
   integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
 
 bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf"
-  integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de"
+  integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==
 
 bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
   version "4.11.8"
@@ -3420,7 +3547,7 @@ browserify-zlib@^0.2.0:
   dependencies:
     pako "~1.0.5"
 
-browserslist@4.7.0, browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.4.2, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.6:
+browserslist@4.7.0:
   version "4.7.0"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17"
   integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==
@@ -3429,10 +3556,19 @@ browserslist@4.7.0, browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.4.
     electron-to-chromium "^1.3.247"
     node-releases "^1.1.29"
 
+browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.4.2, browserslist@^4.6.0, browserslist@^4.7.2:
+  version "4.7.2"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348"
+  integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==
+  dependencies:
+    caniuse-lite "^1.0.30001004"
+    electron-to-chromium "^1.3.295"
+    node-releases "^1.1.38"
+
 bser@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5"
-  integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+  integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
   dependencies:
     node-int64 "^0.4.0"
 
@@ -3462,9 +3598,9 @@ buffer-xor@^1.0.3:
   integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
 
 buffer@^4.3.0:
-  version "4.9.1"
-  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
-  integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
+  version "4.9.2"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+  integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
   dependencies:
     base64-js "^1.0.2"
     ieee754 "^1.1.4"
@@ -3639,10 +3775,10 @@ caniuse-api@^3.0.0:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000939, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000989:
-  version "1.0.30000998"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000998.tgz#7227a8046841e7d01e156ae7227a504d065f6744"
-  integrity sha512-8Tj5sPZR9kMHeDD9SZXIVr5m9ofufLLCG2Y4QwQrH18GIwG+kCc+zYdlR036ZRkuKjVVetyxeAgGA1xF7XdmzQ==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000939, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001004, caniuse-lite@^1.0.30001006:
+  version "1.0.30001009"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001009.tgz#69b77997b882a7aee6af24c8d7d2fa27ee41f348"
+  integrity sha512-M3rEqHN6SaVjgo4bIik7HsGcWXsi+lI9WA0p51RPMFx5gXfduyOXWJrc0R4xBkSK1pgNf4CNgy5M+6H+WiEP8g==
 
 capture-exit@^2.0.0:
   version "2.0.0"
@@ -3723,7 +3859,7 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4:
   optionalDependencies:
     fsevents "^1.2.7"
 
-chownr@^1.1.1, chownr@^1.1.2:
+chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
   integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==
@@ -3971,10 +4107,10 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@2, commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0:
-  version "2.20.1"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.1.tgz#3863ce3ca92d0831dcf2a102f5fb4b5926afd0f9"
-  integrity sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==
+commander@2, commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
+  version "2.20.3"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
 
 commander@2.17.x:
   version "2.17.1"
@@ -4096,11 +4232,9 @@ connect-history-api-fallback@^1.3.0:
   integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
 
 console-browserify@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
-  integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
-  dependencies:
-    date-now "^0.1.4"
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+  integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
 
 console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0:
   version "1.1.0"
@@ -4130,43 +4264,35 @@ content-type@~1.0.4:
   integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
 
 conventional-changelog-angular@^5.0.0:
-  version "5.0.3"
-  resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0"
-  integrity sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA==
+  version "5.0.6"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059"
+  integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==
   dependencies:
     compare-func "^1.3.1"
     q "^1.5.1"
 
 conventional-changelog-writer@^4.0.0:
-  version "4.0.7"
-  resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.7.tgz#e4b7d9cbea902394ad671f67108a71fa90c7095f"
-  integrity sha512-p/wzs9eYaxhFbrmX/mCJNwJuvvHR+j4Fd0SQa2xyAhYed6KBiZ780LvoqUUvsayP4R1DtC27czalGUhKV2oabw==
+  version "4.0.10"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.10.tgz#39f6458cca62a8151b3ce582a57ff71fd2b0ff7a"
+  integrity sha512-vtO9vBAVh7XnSpGLTB1BOGgsGTz1MdvFjzbSXLrtapWCHWwuVOZFgwdLhlS0MaXwlF1dksWdEb6tnr42Ie2INw==
   dependencies:
     compare-func "^1.3.1"
     conventional-commits-filter "^2.0.2"
     dateformat "^3.0.0"
-    handlebars "^4.1.2"
+    handlebars "^4.4.0"
     json-stringify-safe "^5.0.1"
-    lodash "^4.2.1"
+    lodash "^4.17.15"
     meow "^4.0.0"
     semver "^6.0.0"
     split "^1.0.0"
     through2 "^3.0.0"
 
 conventional-commit-types@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.1.1.tgz#352eb53f56fbc7c1a6c1ba059c2b6670c90b2a8a"
-  integrity sha512-0Ts+fEdmjqYDOQ1yZ+LNgdSPO335XZw9qC10M7CxtLP3nIMGmeMhmkM8Taffa4+MXN13bRPlp0CtH+QfOzKTzw==
-
-conventional-commits-filter@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz#55a135de1802f6510b6758e0a6aa9e0b28618db3"
-  integrity sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A==
-  dependencies:
-    is-subset "^0.1.1"
-    modify-values "^1.0.0"
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz#bc3c8ebba0a9e4b3ecc548f1d0674e251ab8be22"
+  integrity sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ==
 
-conventional-commits-filter@^2.0.2:
+conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz#f122f89fbcd5bb81e2af2fcac0254d062d1039c1"
   integrity sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==
@@ -4174,23 +4300,23 @@ conventional-commits-filter@^2.0.2:
     lodash.ismatch "^4.4.0"
     modify-values "^1.0.0"
 
-conventional-commits-parser@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz#fe1c49753df3f98edb2285a5e485e11ffa7f2e4c"
-  integrity sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg==
+conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.7:
+  version "3.0.7"
+  resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.7.tgz#55b6cde6a2d0b4a7ab399392777d527134a8d05c"
+  integrity sha512-4mx/FRC92z0yIiXGyRVYQFhn0jWDwvxnj2UuLaUi3hJSG4Thall6GXA8YOPHQK2qvotciJandJIVmuSvLgDLbQ==
   dependencies:
     JSONStream "^1.0.4"
-    is-text-path "^1.0.0"
-    lodash "^4.2.1"
+    is-text-path "^1.0.1"
+    lodash "^4.17.15"
     meow "^4.0.0"
     split2 "^2.0.0"
-    through2 "^2.0.0"
+    through2 "^3.0.0"
     trim-off-newlines "^1.0.0"
 
-convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
-  integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
+convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+  integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
   dependencies:
     safe-buffer "~5.1.1"
 
@@ -4222,11 +4348,11 @@ copy-descriptor@^0.1.0:
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
 core-js-compat@^3.1.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150"
-  integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.1.tgz#e12c5a3ef9fcb50fd9d9a32805bfe674f9139246"
+  integrity sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw==
   dependencies:
-    browserslist "^4.6.6"
+    browserslist "^4.7.2"
     semver "^6.3.0"
 
 core-js@3.2.1:
@@ -4240,16 +4366,16 @@ core-js@^1.0.0:
   integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
 
 core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.6.5:
-  version "2.6.9"
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
-  integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
+  version "2.6.10"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f"
+  integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==
 
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 
-cosmiconfig@^5.0.0, cosmiconfig@^5.0.1, cosmiconfig@^5.2.0, cosmiconfig@^5.2.1:
+cosmiconfig@^5.0.0, cosmiconfig@^5.2.0, cosmiconfig@^5.2.1:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
   integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
@@ -4259,6 +4385,17 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.0.1, cosmiconfig@^5.2.0, cosmiconfig@^5.2.1:
     js-yaml "^3.13.1"
     parse-json "^4.0.0"
 
+cosmiconfig@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+  integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+  dependencies:
+    "@types/parse-json" "^4.0.0"
+    import-fresh "^3.1.0"
+    parse-json "^5.0.0"
+    path-type "^4.0.0"
+    yaml "^1.7.2"
+
 create-ecdh@^4.0.0:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
@@ -4347,6 +4484,15 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
+cross-spawn@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
+  integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
 crypto-browserify@^3.11.0:
   version "3.12.0"
   resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
@@ -4442,41 +4588,43 @@ css-select@^1.1.0:
     nth-check "~1.0.1"
 
 css-select@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede"
-  integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+  integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
   dependencies:
     boolbase "^1.0.0"
-    css-what "^2.1.2"
+    css-what "^3.2.1"
     domutils "^1.7.0"
     nth-check "^1.0.2"
 
-css-tree@1.0.0-alpha.29:
-  version "1.0.0-alpha.29"
-  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
-  integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==
-  dependencies:
-    mdn-data "~1.1.0"
-    source-map "^0.5.3"
-
-css-tree@1.0.0-alpha.33:
-  version "1.0.0-alpha.33"
-  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.33.tgz#970e20e5a91f7a378ddd0fc58d0b6c8d4f3be93e"
-  integrity sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==
+css-tree@1.0.0-alpha.37:
+  version "1.0.0-alpha.37"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
+  integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
   dependencies:
     mdn-data "2.0.4"
-    source-map "^0.5.3"
+    source-map "^0.6.1"
 
 css-unit-converter@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
   integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=
 
-css-what@2.1, css-what@^2.1.2:
+css-what@2.1:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
   integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
 
+css-what@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1"
+  integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==
+
+css.escape@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
+  integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=
+
 css@^2.2.3:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
@@ -4570,18 +4718,23 @@ cssnano@^4.1.0:
     is-resolvable "^1.0.0"
     postcss "^7.0.0"
 
-csso@^3.5.1:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
-  integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==
+csso@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d"
+  integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==
   dependencies:
-    css-tree "1.0.0-alpha.29"
+    css-tree "1.0.0-alpha.37"
 
-cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4, cssom@^0.3.6:
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4, cssom@~0.3.6:
   version "0.3.8"
   resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
   integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
 
+cssom@^0.4.1:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.2.tgz#e2abd06e1267a7f2e5eccd7770c9ebe1bd88648b"
+  integrity sha512-fVXFVBr7JPDcgqa92UNr6HIpeMypyG/XVloB+512KH43Z2aum8ZNVzRapWR4mZ/f2UlRMymIoDO3aFJmQ6Y3RA==
+
 cssstyle@^0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf"
@@ -4589,17 +4742,24 @@ cssstyle@^0.3.1:
   dependencies:
     cssom "0.3.x"
 
-cssstyle@^1.0.0, cssstyle@^1.1.1, cssstyle@^1.2.2:
+cssstyle@^1.0.0, cssstyle@^1.1.1:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1"
   integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==
   dependencies:
     cssom "0.3.x"
 
+cssstyle@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.0.0.tgz#911f0fe25532db4f5d44afc83f89cc4b82c97fe3"
+  integrity sha512-QXSAu2WBsSRXCPjvI43Y40m6fMevvyRm8JVAuF9ksQz5jha4pWP1wpaK7Yu5oLFc6+XAY+hj8YhefyXcBB53gg==
+  dependencies:
+    cssom "~0.3.6"
+
 csstype@^2.2.0, csstype@^2.5.2:
-  version "2.6.6"
-  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41"
-  integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==
+  version "2.6.7"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5"
+  integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==
 
 currently-unhandled@^0.4.1:
   version "0.4.1"
@@ -4705,9 +4865,9 @@ d3-shape@^1.0.0, d3-shape@^1.2.0:
     d3-path "1"
 
 d3-time-format@2:
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.3.tgz#ae06f8e0126a9d60d6364eac5b1533ae1bac826b"
-  integrity sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.2.1.tgz#971f66aae3b8fb268040494986f41512d4d4dca6"
+  integrity sha512-VA6WqORO1+H1SvSzgl2oT0z3niANh3opa8Cencpen1LFthw/bEX71R/DgjPlWw78J4UHmD0jCPP1W0HpwMkhjg==
   dependencies:
     d3-time "1"
 
@@ -4792,17 +4952,12 @@ datatables.net@1.10.20, datatables.net@^1.10.15:
   dependencies:
     jquery ">=1.7"
 
-date-now@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
-  integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
-
 dateformat@^3.0.0:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
   integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
 
-"debug@0.8.0 - 3.5.0", debug@^3.0.0, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6:
+"debug@0.8.0 - 3.5.0", debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6:
   version "3.2.6"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
   integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@@ -4830,7 +4985,7 @@ debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
   dependencies:
     ms "^2.1.1"
 
-debuglog@^1.0.1:
+debuglog@*, debuglog@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
   integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
@@ -4866,9 +5021,9 @@ dedent@0.7.0:
   integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
 
 deep-equal@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.0.tgz#3103cdf8ab6d32cf4a8df7865458f2b8d33f3745"
-  integrity sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+  integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
   dependencies:
     is-arguments "^1.0.4"
     is-date-object "^1.0.1"
@@ -4976,9 +5131,9 @@ deprecation@^2.0.0:
   integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
 
 des.js@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
-  integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+  integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
   dependencies:
     inherits "^2.0.1"
     minimalistic-assert "^1.0.0"
@@ -5127,9 +5282,9 @@ dom-helpers@^3.2.0, dom-helpers@^3.2.1, dom-helpers@^3.4.0:
     "@babel/runtime" "^7.1.2"
 
 dom-serializer@0:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb"
-  integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+  integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
   dependencies:
     domelementtype "^2.0.1"
     entities "^2.0.0"
@@ -5260,10 +5415,10 @@ ee-first@1.1.1:
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
   integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
 
-electron-to-chromium@^1.3.247:
-  version "1.3.273"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.273.tgz#94872d6823219f2812f2e35a2ce2a7d03c1eaa3f"
-  integrity sha512-0kUppiHQvHEENHh+nTtvTt4eXMwcPyWmMaj73GPrSEm3ldKhmmHuOH6IjrmuW6YmyS/fpXcLvMQLNVpqRhpNWw==
+electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.295:
+  version "1.3.306"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz#e8265301d053d5f74e36cb876486830261fbe946"
+  integrity sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==
 
 elliptic@^6.0.0:
   version "6.5.1"
@@ -5323,12 +5478,12 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
     once "^1.4.0"
 
 enhanced-resolve@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
-  integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66"
+  integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==
   dependencies:
     graceful-fs "^4.1.2"
-    memory-fs "^0.4.0"
+    memory-fs "^0.5.0"
     tapable "^1.0.0"
 
 entities@^1.1.1:
@@ -5342,11 +5497,11 @@ entities@^2.0.0:
   integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
 
 env-ci@^4.0.0:
-  version "4.1.3"
-  resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-4.1.3.tgz#60af625cc610c13e6679640833677ca2d7e6aef5"
-  integrity sha512-OMXwuUCCcmO4gfm/KiBHYSdTcvbl3H48OaSPp0uFHjcJw/opALT1A8hbhg8U3gut7NUHEbYMt6g97FvQvHVb9w==
+  version "4.5.1"
+  resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-4.5.1.tgz#2ef014dcb974728b46d1244e491e9e6ccc1923ef"
+  integrity sha512-Xtmr+ordf8POu3NcNzx3eOa2zHyfD4h3fPHX5fLklkWa86ck35n1c9oZmyUnVPUl9zHnpZWdWtCUBPSWEagjCQ==
   dependencies:
-    execa "^1.0.0"
+    execa "^3.2.0"
     java-properties "^1.0.0"
 
 env-paths@^1.0.0:
@@ -5383,10 +5538,10 @@ error-ex@^1.2.0, error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
-es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
-  version "1.15.0"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.15.0.tgz#8884928ec7e40a79e3c9bc812d37d10c8b24cc57"
-  integrity sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==
+es-abstract@^1.12.0, es-abstract@^1.15.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
+  version "1.16.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d"
+  integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==
   dependencies:
     es-to-primitive "^1.2.0"
     function-bind "^1.1.1"
@@ -5400,9 +5555,9 @@ es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0
     string.prototype.trimright "^2.1.0"
 
 es-to-primitive@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
-  integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
   dependencies:
     is-callable "^1.1.4"
     is-date-object "^1.0.1"
@@ -5442,6 +5597,27 @@ escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.9.1:
   optionalDependencies:
     source-map "~0.6.1"
 
+eslint-config-airbnb-base@^12.1.0:
+  version "12.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944"
+  integrity sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==
+  dependencies:
+    eslint-restricted-globals "^0.1.1"
+
+eslint-config-airbnb@^16.1.0:
+  version "16.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz#2546bfb02cc9fe92284bf1723ccf2e87bc45ca46"
+  integrity sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==
+  dependencies:
+    eslint-config-airbnb-base "^12.1.0"
+
+eslint-config-prettier@^2.9.0:
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz#ec07bc1d01f87d09f61d3840d112dc8a9791e30b"
+  integrity sha512-Mhl90VLucfBuhmcWBgbUNtgBiK955iCDK1+aHAz7QfDQF6wuzWZ6JjihZ3ejJoGlJWIuko7xLqNm8BA5uenKhA==
+  dependencies:
+    get-stdin "^5.0.1"
+
 eslint-config-react-app@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz#23fd0fd7ea89442ef1e733f66a7207674b23c8db"
@@ -5449,6 +5625,23 @@ eslint-config-react-app@^4.0.1:
   dependencies:
     confusing-browser-globals "^1.0.7"
 
+eslint-config-standard-jsx@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz#4abfac554f38668e0078c664569e7b2384e5d2aa"
+  integrity sha512-rLToPAEqLMPBfWnYTu6xRhm2OWziS2n40QFqJ8jAM8NSVzeVKTa3nclhsU4DpPJQRY60F34Oo1wi/71PN/eITg==
+
+eslint-config-standard-react@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-standard-react/-/eslint-config-standard-react-6.0.0.tgz#d366d6c3c092426fd3ae794a4ca0b3cb131f2964"
+  integrity sha512-YWlqfvREbH1r6SaRTgFOq+VE3f8/ZQypkfnpDpSmZjztEjxnzznm4xeE2/mDQRx77Okhd/pKHXNZLMsSneJH8A==
+  dependencies:
+    eslint-config-standard-jsx "^5.0.0"
+
+eslint-config-standard@^11.0.0:
+  version "11.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz#87ee0d3c9d95382dc761958cbb23da9eea31e0ba"
+  integrity sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==
+
 eslint-import-resolver-node@^0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a"
@@ -5468,7 +5661,7 @@ eslint-loader@2.1.2:
     object-hash "^1.1.4"
     rimraf "^2.6.1"
 
-eslint-module-utils@^2.3.0:
+eslint-module-utils@^2.3.0, eslint-module-utils@^2.4.0:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c"
   integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==
@@ -5499,6 +5692,28 @@ eslint-plugin-import@2.16.0:
     read-pkg-up "^2.0.0"
     resolve "^1.9.0"
 
+eslint-plugin-import@^2.13.0:
+  version "2.18.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6"
+  integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==
+  dependencies:
+    array-includes "^3.0.3"
+    contains-path "^0.1.0"
+    debug "^2.6.9"
+    doctrine "1.5.0"
+    eslint-import-resolver-node "^0.3.2"
+    eslint-module-utils "^2.4.0"
+    has "^1.0.3"
+    minimatch "^3.0.4"
+    object.values "^1.1.0"
+    read-pkg-up "^2.0.0"
+    resolve "^1.11.0"
+
+eslint-plugin-jest@^21.15.0:
+  version "21.27.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.27.2.tgz#2a795b7c3b5e707df48a953d651042bd01d7b0a8"
+  integrity sha512-0E4OIgBJVlAmf1KfYFtZ3gYxgUzC5Eb3Jzmrc9ikI1OY+/cM8Kh72Ti7KfpeHNeD3HJNf9SmEfmvQLIz44Hrhw==
+
 eslint-plugin-jsx-a11y@6.2.1:
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz#4ebba9f339b600ff415ae4166e3e2e008831cf0c"
@@ -5511,7 +5726,66 @@ eslint-plugin-jsx-a11y@6.2.1:
     damerau-levenshtein "^1.0.4"
     emoji-regex "^7.0.2"
     has "^1.0.3"
-    jsx-ast-utils "^2.0.1"
+    jsx-ast-utils "^2.0.1"
+
+eslint-plugin-jsx-a11y@^6.0.3:
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa"
+  integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==
+  dependencies:
+    "@babel/runtime" "^7.4.5"
+    aria-query "^3.0.0"
+    array-includes "^3.0.3"
+    ast-types-flow "^0.0.7"
+    axobject-query "^2.0.2"
+    damerau-levenshtein "^1.0.4"
+    emoji-regex "^7.0.2"
+    has "^1.0.3"
+    jsx-ast-utils "^2.2.1"
+
+eslint-plugin-node@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4"
+  integrity sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==
+  dependencies:
+    ignore "^3.3.6"
+    minimatch "^3.0.4"
+    resolve "^1.3.3"
+    semver "^5.4.1"
+
+eslint-plugin-patternfly-react@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-patternfly-react/-/eslint-plugin-patternfly-react-0.2.3.tgz#e9096268a928ed7f11bb96d17ede1693b68accfe"
+  integrity sha512-DiGFp5KTX124C/CrnL7Pjxvt5bk5vEIU08BcrMBQOXNLR9cuaTB5tj8PhiURTwd64iol+UcQeXG4WxjXMkBeDw==
+  dependencies:
+    babel-eslint "^9.0.0"
+    eslint-config-airbnb "^16.1.0"
+    eslint-config-prettier "^2.9.0"
+    eslint-config-standard "^11.0.0"
+    eslint-config-standard-jsx "^5.0.0"
+    eslint-config-standard-react "^6.0.0"
+    eslint-plugin-import "^2.13.0"
+    eslint-plugin-jest "^21.15.0"
+    eslint-plugin-jsx-a11y "^6.0.3"
+    eslint-plugin-node "^6.0.1"
+    eslint-plugin-prettier "^2.6.0"
+    eslint-plugin-promise "^3.7.0"
+    eslint-plugin-react "^7.7.0"
+    eslint-plugin-rulesdir "^0.1.0"
+    eslint-plugin-standard "^3.0.1"
+
+eslint-plugin-prettier@^2.6.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz#b4312dcf2c1d965379d7f9d5b5f8aaadc6a45904"
+  integrity sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA==
+  dependencies:
+    fast-diff "^1.1.1"
+    jest-docblock "^21.0.0"
+
+eslint-plugin-promise@^3.7.0:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621"
+  integrity sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==
 
 eslint-plugin-react-hooks@^1.5.0:
   version "1.7.0"
@@ -5531,6 +5805,36 @@ eslint-plugin-react@7.12.4:
     prop-types "^15.6.2"
     resolve "^1.9.0"
 
+eslint-plugin-react@^7.7.0:
+  version "7.16.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz#9928e4f3e2122ed3ba6a5b56d0303ba3e41d8c09"
+  integrity sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==
+  dependencies:
+    array-includes "^3.0.3"
+    doctrine "^2.1.0"
+    has "^1.0.3"
+    jsx-ast-utils "^2.2.1"
+    object.entries "^1.1.0"
+    object.fromentries "^2.0.0"
+    object.values "^1.1.0"
+    prop-types "^15.7.2"
+    resolve "^1.12.0"
+
+eslint-plugin-rulesdir@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-rulesdir/-/eslint-plugin-rulesdir-0.1.0.tgz#ad144d7e98464fda82963eff3fab331aecb2bf08"
+  integrity sha1-rRRNfphGT9qClj7/P6szGuyyvwg=
+
+eslint-plugin-standard@^3.0.1:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz#2a9e21259ba4c47c02d53b2d0c9135d4b1022d47"
+  integrity sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==
+
+eslint-restricted-globals@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7"
+  integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=
+
 eslint-scope@3.7.1:
   version "3.7.1"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
@@ -5548,13 +5852,13 @@ eslint-scope@^4.0.0, eslint-scope@^4.0.3:
     estraverse "^4.1.1"
 
 eslint-utils@^1.3.1:
-  version "1.4.2"
-  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
-  integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
+  integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
   dependencies:
-    eslint-visitor-keys "^1.0.0"
+    eslint-visitor-keys "^1.1.0"
 
-eslint-visitor-keys@^1.0.0:
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
   integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
@@ -5675,9 +5979,9 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
     safe-buffer "^5.1.1"
 
 exec-sh@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b"
-  integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5"
+  integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==
 
 execa@^0.7.0:
   version "0.7.0"
@@ -5705,16 +6009,17 @@ execa@^1.0.0:
     signal-exit "^3.0.0"
     strip-eof "^1.0.0"
 
-execa@^2.0.2:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-2.0.4.tgz#2f5cc589c81db316628627004ea4e37b93391d8e"
-  integrity sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==
+execa@^3.2.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-3.3.0.tgz#7e348eef129a1937f21ecbbd53390942653522c1"
+  integrity sha512-j5Vit5WZR/cbHlqU97+qcnw9WHRCIL4V1SVe75VcHcD1JRBdt8fv0zw89b7CQHQdUHTt2VjuhcF5ibAgVOxqpg==
   dependencies:
-    cross-spawn "^6.0.5"
+    cross-spawn "^7.0.0"
     get-stream "^5.0.0"
+    human-signals "^1.1.1"
     is-stream "^2.0.0"
     merge-stream "^2.0.0"
-    npm-run-path "^3.0.0"
+    npm-run-path "^4.0.0"
     onetime "^5.1.0"
     p-finally "^2.0.0"
     signal-exit "^3.0.2"
@@ -5873,6 +6178,11 @@ fast-deep-equal@^2.0.1:
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
   integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
 
+fast-diff@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
+  integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+
 fast-glob@^2.0.2:
   version "2.2.7"
   resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
@@ -5886,15 +6196,14 @@ fast-glob@^2.0.2:
     micromatch "^3.1.10"
 
 fast-glob@^3.0.3:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.0.4.tgz#d484a41005cb6faeb399b951fd1bd70ddaebb602"
-  integrity sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.0.tgz#77375a7e3e6f6fc9b18f061cddd28b8d1eec75ae"
+  integrity sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==
   dependencies:
-    "@nodelib/fs.stat" "^2.0.1"
-    "@nodelib/fs.walk" "^1.2.1"
-    glob-parent "^5.0.0"
-    is-glob "^4.0.1"
-    merge2 "^1.2.3"
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.0"
+    merge2 "^1.3.0"
     micromatch "^4.0.2"
 
 fast-json-stable-stringify@^2.0.0:
@@ -5902,7 +6211,7 @@ fast-json-stable-stringify@^2.0.0:
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
   integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
 
-fast-levenshtein@~2.0.4:
+fast-levenshtein@~2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
@@ -5977,9 +6286,9 @@ figures@^2.0.0:
     escape-string-regexp "^1.0.5"
 
 figures@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9"
-  integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec"
+  integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==
   dependencies:
     escape-string-regexp "^1.0.5"
 
@@ -6091,7 +6400,7 @@ find-up@^2.0.0, find-up@^2.1.0:
   dependencies:
     locate-path "^2.0.0"
 
-find-up@^4.0.0:
+find-up@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
   integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
@@ -6132,9 +6441,9 @@ flatted@^2.0.0:
   integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
 
 flatten@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
-  integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b"
+  integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==
 
 flush-write-stream@^1.0.0:
   version "1.1.1"
@@ -6397,9 +6706,14 @@ get-caller-file@^2.0.1:
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 
 get-own-enumerable-property-symbols@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203"
-  integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz#6f7764f88ea11e0b514bd9bd860a132259992ca4"
+  integrity sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA==
+
+get-stdin@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
+  integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=
 
 get-stream@^3.0.0:
   version "3.0.0"
@@ -6452,7 +6766,7 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob-parent@^5.0.0:
+glob-parent@^5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2"
   integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==
@@ -6464,7 +6778,7 @@ glob-to-regexp@^0.3.0:
   resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
   integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
 
-glob@7.1.4, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
+glob@7.1.4:
   version "7.1.4"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
   integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
@@ -6476,6 +6790,18 @@ glob@7.1.4, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glo
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
 global-dirs@^0.1.0, global-dirs@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
@@ -6589,10 +6915,10 @@ got@^6.7.1:
     unzip-response "^2.0.1"
     url-parse-lax "^1.0.0"
 
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
-  version "4.2.2"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
-  integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
+  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
 
 growly@^1.3.0:
   version "1.3.0"
@@ -6617,10 +6943,10 @@ handle-thing@^2.0.0:
   resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
   integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==
 
-handlebars@^4.1.2:
-  version "4.4.2"
-  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.2.tgz#8810a9821a9d6d52cb2f57d326d6ce7c3dfe741d"
-  integrity sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg==
+handlebars@^4.1.2, handlebars@^4.4.0:
+  version "4.5.1"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.1.tgz#8a01c382c180272260d07f2d1aa3ae745715c7ba"
+  integrity sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==
   dependencies:
     neo-async "^2.6.0"
     optimist "^0.6.1"
@@ -6790,15 +7116,15 @@ hook-std@^2.0.0:
   resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c"
   integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==
 
-hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.2:
-  version "2.8.4"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546"
-  integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==
+hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.5:
+  version "2.8.5"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c"
+  integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==
 
 hosted-git-info@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.0.tgz#dd8af49cd01e73cc8e61ba13e217a772fd4ecd2d"
-  integrity sha512-zYSx1cP4MLsvKtTg8DF/PI6e6FHZ3wcawcTGsrLU2TM+UfD4jmSrn2wdQT16TFbH3lO4PIdjLG0E+cuYDgFD9g==
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.2.tgz#8b7e3bd114b59b51786f8bade0f39ddc80275a97"
+  integrity sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw==
   dependencies:
     lru-cache "^5.1.1"
 
@@ -6975,14 +7301,27 @@ https-browserify@^1.0.0:
   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
   integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
 
-https-proxy-agent@^2.2.1:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793"
-  integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==
+https-proxy-agent@^2.2.3:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
+  integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
   dependencies:
     agent-base "^4.3.0"
     debug "^3.1.0"
 
+https-proxy-agent@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81"
+  integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==
+  dependencies:
+    agent-base "^4.3.0"
+    debug "^3.1.0"
+
+human-signals@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+  integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
 humanize-ms@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
@@ -7032,13 +7371,13 @@ iferr@^1.0.2:
   integrity sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg==
 
 ignore-walk@^3.0.1:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b"
-  integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
+  integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
   dependencies:
     minimatch "^3.0.4"
 
-ignore@^3.3.5:
+ignore@^3.3.5, ignore@^3.3.6:
   version "3.3.10"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
   integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
@@ -7073,10 +7412,10 @@ import-fresh@^2.0.0:
     caller-path "^2.0.0"
     resolve-from "^3.0.0"
 
-import-fresh@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118"
-  integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==
+import-fresh@^3.0.0, import-fresh@^3.1.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
+  integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
   dependencies:
     parent-module "^1.0.0"
     resolve-from "^4.0.0"
@@ -7108,16 +7447,21 @@ import-local@^2.0.0:
     pkg-dir "^3.0.0"
     resolve-cwd "^2.0.0"
 
-imurmurhash@^0.1.4:
+imurmurhash@*, imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
   integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
 
-indent-string@^3.0.0, indent-string@^3.2.0:
+indent-string@^3.0.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
   integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=
 
+indent-string@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
 indexes-of@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
@@ -7222,12 +7566,12 @@ interpret@^1.0.0:
   integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
 
 into-stream@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.0.tgz#b05f37d8fed05c06a0b43b556d74e53e5af23878"
-  integrity sha512-cbDhb8qlxKMxPBk/QxTtYg1DQ4CwXmadu7quG3B7nrJsgSncEreF2kwWKZFdnjc/lSNNIkFPsjI7SM0Cx/QXPw==
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.1.tgz#f9a20a348a11f3c13face22763f2d02e127f4db8"
+  integrity sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==
   dependencies:
     from2 "^2.3.0"
-    p-is-promise "^2.0.0"
+    p-is-promise "^3.0.0"
 
 invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
   version "2.2.4"
@@ -7236,11 +7580,6 @@ invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
   dependencies:
     loose-envify "^1.0.0"
 
-invert-kv@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
-  integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
-
 invert-kv@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
@@ -7251,7 +7590,7 @@ ip-regex@^2.1.0:
   resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
   integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
 
-ip@^1.1.0, ip@^1.1.5:
+ip@1.1.5, ip@^1.1.0, ip@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
   integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
@@ -7562,11 +7901,6 @@ is-stream@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
   integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
 
-is-subset@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
-  integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=
-
 is-svg@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
@@ -7581,7 +7915,7 @@ is-symbol@^1.0.2:
   dependencies:
     has-symbols "^1.0.0"
 
-is-text-path@^1.0.0:
+is-text-path@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
   integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=
@@ -7653,10 +7987,10 @@ isstream@~0.1.2:
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
 
-issue-parser@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-4.0.0.tgz#397817323abbb70c7c29cea2ff62448cf83b686c"
-  integrity sha512-1RmmAXHl5+cqTZ9dRr861xWy0Gkc9TWTEklgjKv+nhlB1dY1NmGBV8b20jTWRL5cPGpOIXkz84kEcDBM8Nc0cw==
+issue-parser@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-5.0.0.tgz#0e22a40bc275b6c7da6ddf4a9b979e8ca9faf0d4"
+  integrity sha512-q/16W7EPHRL0FKVz9NU++TUsoygXGj6JOi88oulyAcQG+IEZ0T6teVdE+VLbe19OfL/tbV8Wi3Dfo0HedeHW0Q==
   dependencies:
     lodash.capitalize "^4.2.1"
     lodash.escaperegexp "^4.1.2"
@@ -7765,7 +8099,7 @@ jest-config@^24.9.0:
     pretty-format "^24.9.0"
     realpath-native "^1.1.0"
 
-jest-diff@^24.9.0:
+jest-diff@^24.0.0, jest-diff@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da"
   integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==
@@ -7775,6 +8109,11 @@ jest-diff@^24.9.0:
     jest-get-type "^24.9.0"
     pretty-format "^24.9.0"
 
+jest-docblock@^21.0.0:
+  version "21.2.0"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414"
+  integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==
+
 jest-docblock@^24.3.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2"
@@ -7879,7 +8218,7 @@ jest-leak-detector@^24.9.0:
     jest-get-type "^24.9.0"
     pretty-format "^24.9.0"
 
-jest-matcher-utils@^24.9.0:
+jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073"
   integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==
@@ -8203,21 +8542,21 @@ jsdom@^14.0.0:
     xml-name-validator "^3.0.0"
 
 jsdom@^15.1.0:
-  version "15.1.1"
-  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.1.1.tgz#21ed01f81d95ef4327f3e564662aef5e65881252"
-  integrity sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==
+  version "15.2.1"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5"
+  integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==
   dependencies:
     abab "^2.0.0"
-    acorn "^6.1.1"
+    acorn "^7.1.0"
     acorn-globals "^4.3.2"
     array-equal "^1.0.0"
-    cssom "^0.3.6"
-    cssstyle "^1.2.2"
+    cssom "^0.4.1"
+    cssstyle "^2.0.0"
     data-urls "^1.1.0"
     domexception "^1.0.1"
     escodegen "^1.11.1"
     html-encoding-sniffer "^1.0.2"
-    nwsapi "^2.1.4"
+    nwsapi "^2.2.0"
     parse5 "5.1.0"
     pn "^1.1.0"
     request "^2.88.0"
@@ -8332,10 +8671,10 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
-jsx-ast-utils@^2.0.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb"
-  integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==
+jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f"
+  integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==
   dependencies:
     array-includes "^3.0.3"
     object.assign "^4.1.0"
@@ -8421,13 +8760,6 @@ lazy-property@~1.0.0:
   resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
   integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
 
-lcid@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
-  integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
-  dependencies:
-    invert-kv "^1.0.0"
-
 lcid@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
@@ -8453,10 +8785,10 @@ levn@^0.3.0, levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
-libcipm@^4.0.3:
-  version "4.0.4"
-  resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.4.tgz#6d28fd0f31e61963f8ec7125e9247349181f6cf4"
-  integrity sha512-S2hmT4tYXTpq1H98K+gm/fujDcgQKqPz0QwkmtKrGklAo7U0DI9ZYmQq/EahF3sqw33Quv9gMHJGeodqyX23kg==
+libcipm@^4.0.7:
+  version "4.0.7"
+  resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.7.tgz#76cd675c98bdaae64db88b782b01b804b6d02c8a"
+  integrity sha512-fTq33otU3PNXxxCTCYCYe7V96o59v/o7bvtspmbORXpgFk+wcWrGf5x6tBgui5gCed/45/wtPomBsZBYm5KbIw==
   dependencies:
     bin-links "^1.1.2"
     bluebird "^3.5.1"
@@ -8677,6 +9009,11 @@ lodash-es@^4.17.11:
   resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
   integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
 
+lodash._baseindexof@*:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c"
+  integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=
+
 lodash._baseuniq@~4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
@@ -8685,11 +9022,33 @@ lodash._baseuniq@~4.6.0:
     lodash._createset "~4.0.0"
     lodash._root "~3.0.0"
 
+lodash._bindcallback@*:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
+  integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4=
+
+lodash._cacheindexof@*:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92"
+  integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=
+
+lodash._createcache@*:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093"
+  integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=
+  dependencies:
+    lodash._getnative "^3.0.0"
+
 lodash._createset@~4.0.0:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
   integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=
 
+lodash._getnative@*, lodash._getnative@^3.0.0:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+  integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
+
 lodash._reinterpolate@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -8750,6 +9109,11 @@ lodash.memoize@^4.1.2:
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
   integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
 
+lodash.restparam@*:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+  integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
+
 lodash.set@^4.3.2:
   version "4.3.2"
   resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
@@ -8815,15 +9179,15 @@ lodash@4.17.14:
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba"
   integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==
 
-lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1:
+lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
 
 loglevel@^1.4.1:
-  version "1.6.4"
-  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56"
-  integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==
+  version "1.6.6"
+  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312"
+  integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==
 
 longest@^2.0.1:
   version "2.0.1"
@@ -8891,15 +9255,15 @@ make-dir@^2.0.0, make-dir@^2.1.0:
     semver "^5.6.0"
 
 make-fetch-happen@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz#a8e3fe41d3415dd656fe7b8e8172e1fb4458b38d"
-  integrity sha512-nFr/vpL1Jc60etMVKeaLOqfGjMMb3tAHFVJWxHOFCFS04Zmd7kGlMxo0l1tzfhoQje0/UPnd0X8OeGUiXXnfPA==
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.1.tgz#fac65400ab5f7a9c001862a3e9b0f417f0840175"
+  integrity sha512-b4dfaMvUDR67zxUq1+GN7Ke9rH5WvGRmoHuMH7l+gmUCR2tCXFP6mpeJ9Dp+jB6z8mShRopSf1vLRBhRs8Cu5w==
   dependencies:
     agentkeepalive "^3.4.1"
     cacache "^12.0.0"
     http-cache-semantics "^3.8.1"
     http-proxy-agent "^2.1.0"
-    https-proxy-agent "^2.2.1"
+    https-proxy-agent "^2.2.3"
     lru-cache "^5.1.1"
     mississippi "^3.0.0"
     node-fetch-npm "^2.0.2"
@@ -8979,11 +9343,6 @@ mdn-data@2.0.4:
   resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
   integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
 
-mdn-data@~1.1.0:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
-  integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==
-
 meant@~1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d"
@@ -8994,13 +9353,6 @@ media-typer@0.3.0:
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
   integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
 
-mem@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
-  integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
-  dependencies:
-    mimic-fn "^1.0.0"
-
 mem@^4.0.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
@@ -9010,7 +9362,7 @@ mem@^4.0.0:
     mimic-fn "^2.0.0"
     p-is-promise "^2.0.0"
 
-memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
+memory-fs@^0.4.1, memory-fs@~0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
   integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
@@ -9018,6 +9370,14 @@ memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
     errno "^0.1.3"
     readable-stream "^2.0.1"
 
+memory-fs@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+  integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
 meow@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975"
@@ -9052,7 +9412,7 @@ merge-stream@^2.0.0:
   resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
   integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
 
-merge2@^1.2.3:
+merge2@^1.2.3, merge2@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
   integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
@@ -9107,22 +9467,17 @@ miller-rabin@^4.0.0:
     bn.js "^4.0.0"
     brorand "^1.0.1"
 
-mime-db@1.40.0:
-  version "1.40.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
-  integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
-
-"mime-db@>= 1.40.0 < 2":
+mime-db@1.42.0, "mime-db@>= 1.40.0 < 2":
   version "1.42.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac"
   integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==
 
 mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
-  version "2.1.24"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
-  integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
+  version "2.1.25"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437"
+  integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==
   dependencies:
-    mime-db "1.40.0"
+    mime-db "1.42.0"
 
 mime@1.6.0:
   version "1.6.0"
@@ -9144,6 +9499,11 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
+min-indent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256"
+  integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=
+
 mini-create-react-context@^0.3.0:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189"
@@ -9249,7 +9609,7 @@ mixin-object@^2.0.1:
     for-in "^0.1.3"
     is-extendable "^0.1.1"
 
-mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
@@ -9428,10 +9788,10 @@ node-forge@0.9.0:
   resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
   integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
 
-node-gyp@^5.0.2, node-gyp@^5.0.3:
-  version "5.0.4"
-  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.4.tgz#1de243f17b081a6e89f4330967900c816114f8fb"
-  integrity sha512-PMYap4ekQckQDZ2lxoORUF/nX13haU1JdCAlmLgvrykLyN0LFkhfwPbWhYjTxwTruCWbTkeOxFo043kjhmKHZA==
+node-gyp@^5.0.2, node-gyp@^5.0.5:
+  version "5.0.5"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.5.tgz#f6cf1da246eb8c42b097d7cd4d6c3ce23a4163af"
+  integrity sha512-WABl9s4/mqQdZneZHVWVG4TVr6QQJZUC6PAx47ITSk9lreZ1n+7Z9mMAIbA3vnO4J9W20P7LhCxtzfWsAD/KDw==
   dependencies:
     env-paths "^1.0.0"
     glob "^7.0.3"
@@ -9511,12 +9871,12 @@ node-pre-gyp@^0.12.0:
     semver "^5.3.0"
     tar "^4"
 
-node-releases@^1.1.29:
-  version "1.1.33"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.33.tgz#349f10291234624574f44cf32b7de259bf028303"
-  integrity sha512-I0V30bWQEoHb+10W8oedVoUrdjW5wIkYm0w7vvcrPO95pZY738m1k77GF5sO0vKg5eXYg9oGtrMAETbgZGm11A==
+node-releases@^1.1.29, node-releases@^1.1.38:
+  version "1.1.40"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.40.tgz#a94facfa8e2d612302601ca1361741d529c4515a"
+  integrity sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ==
   dependencies:
-    semver "^5.3.0"
+    semver "^6.3.0"
 
 "nopt@2 || 3":
   version "3.0.6"
@@ -9595,14 +9955,14 @@ npm-cache-filename@~1.0.2:
   resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11"
   integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=
 
-npm-install-checks@~3.0.0:
+npm-install-checks@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.2.tgz#ab2e32ad27baa46720706908e5b14c1852de44d9"
   integrity sha512-E4kzkyZDIWoin6uT5howP8VDvkM+E8IQDcHAycaAxMbwkqhIg5eEYALnXOl3Hq9MrkdQB/2/g1xwBINXdKSRkg==
   dependencies:
     semver "^2.3.0 || 3.x || 4 || 5"
 
-npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.3:
+npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.4:
   version "3.1.4"
   resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.4.tgz#de6975c7d8df65f5150db110b57cce498b0b604c"
   integrity sha512-tgs1PaucZwkxECGKhC/stbEgFyc3TGh2TJcg2CDr6jbvQRdteHNhmMeljRzpe4wgFAXQADoy1cSqqi7mtiAa5A==
@@ -9631,10 +9991,10 @@ npm-logical-tree@^1.2.1:
     semver "^5.6.0"
     validate-npm-package-name "^3.0.0"
 
-npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.4:
-  version "1.4.4"
-  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44"
-  integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==
+npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.6:
+  version "1.4.6"
+  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4"
+  integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==
   dependencies:
     ignore-walk "^3.0.1"
     npm-bundled "^1.0.1"
@@ -9657,10 +10017,10 @@ npm-profile@^4.0.2:
     figgy-pudding "^3.4.1"
     npm-registry-fetch "^4.0.0"
 
-npm-registry-fetch@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.1.tgz#4ec0964dce6f29d253801a47cd381a7d6ad13a5e"
-  integrity sha512-1ZQ+yjnxc698R5h9Yje9CASapzAZr7aYDkJDdERg9xg2hOEY0vRJwskOaJAXq8N/eLavzvW4g564YAfq6zMn/A==
+npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.2.tgz#2b1434f93ccbe6b6385f8e45f45db93e16921d7a"
+  integrity sha512-Z0IFtPEozNdeZRPh3aHHxdG+ZRpzcbQaJLthsm3VhNf6DScicTFRHZzK82u8RsJUsUHkX+QH/zcB/5pmd20H4A==
   dependencies:
     JSONStream "^1.3.4"
     bluebird "^3.5.1"
@@ -9677,10 +10037,10 @@ npm-run-path@^2.0.0:
   dependencies:
     path-key "^2.0.0"
 
-npm-run-path@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5"
-  integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==
+npm-run-path@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438"
+  integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ==
   dependencies:
     path-key "^3.0.0"
 
@@ -9690,9 +10050,9 @@ npm-user-validate@~1.0.0:
   integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE=
 
 npm@^6.10.3:
-  version "6.11.3"
-  resolved "https://registry.yarnpkg.com/npm/-/npm-6.11.3.tgz#730f46b7cc5bbc6f04dd57b5699be0c9f2359dda"
-  integrity sha512-K2h+MPzZiY39Xf6eHEdECe/LKoJXam4UCflz5kIxoskN3LQFeYs5fqBGT5i4TtM/aBk+86Mcf+jgXs/WuWAutQ==
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/npm/-/npm-6.13.0.tgz#2e90fa5b2f759017d906aa7583f0e9ed6e80e2e2"
+  integrity sha512-zjSJ8zjk0cDBZXqTWbQ6+qOdm1m2k489YDFP60RQRUhOxT5LOBhl+cDtFlEXEIblcNjofmsZ/qQ/wzmn5frimQ==
   dependencies:
     JSONStream "^1.3.5"
     abbrev "~1.1.1"
@@ -9705,7 +10065,7 @@ npm@^6.10.3:
     byte-size "^5.0.1"
     cacache "^12.0.3"
     call-limit "^1.1.1"
-    chownr "^1.1.2"
+    chownr "^1.1.3"
     ci-info "^2.0.0"
     cli-columns "^3.1.2"
     cli-table3 "^0.5.1"
@@ -9722,9 +10082,9 @@ npm@^6.10.3:
     fs-write-stream-atomic "~1.0.10"
     gentle-fs "^2.2.1"
     glob "^7.1.4"
-    graceful-fs "^4.2.2"
+    graceful-fs "^4.2.3"
     has-unicode "~2.0.1"
-    hosted-git-info "^2.8.2"
+    hosted-git-info "^2.8.5"
     iferr "^1.0.2"
     infer-owner "^1.0.4"
     inflight "~1.0.6"
@@ -9734,7 +10094,7 @@ npm@^6.10.3:
     is-cidr "^3.0.0"
     json-parse-better-errors "^1.0.2"
     lazy-property "~1.0.0"
-    libcipm "^4.0.3"
+    libcipm "^4.0.7"
     libnpm "^3.0.1"
     libnpmaccess "^3.0.2"
     libnpmhook "^5.0.3"
@@ -9754,31 +10114,31 @@ npm@^6.10.3:
     mississippi "^3.0.0"
     mkdirp "~0.5.1"
     move-concurrently "^1.0.1"
-    node-gyp "^5.0.3"
+    node-gyp "^5.0.5"
     nopt "~4.0.1"
     normalize-package-data "^2.5.0"
     npm-audit-report "^1.3.2"
     npm-cache-filename "~1.0.2"
-    npm-install-checks "~3.0.0"
-    npm-lifecycle "^3.1.3"
+    npm-install-checks "^3.0.2"
+    npm-lifecycle "^3.1.4"
     npm-package-arg "^6.1.1"
-    npm-packlist "^1.4.4"
+    npm-packlist "^1.4.6"
     npm-pick-manifest "^3.0.2"
     npm-profile "^4.0.2"
-    npm-registry-fetch "^4.0.0"
+    npm-registry-fetch "^4.0.2"
     npm-user-validate "~1.0.0"
     npmlog "~4.1.2"
     once "~1.4.0"
     opener "^1.5.1"
     osenv "^0.1.5"
-    pacote "^9.5.8"
+    pacote "^9.5.9"
     path-is-inside "~1.0.2"
     promise-inflight "~1.0.1"
     qrcode-terminal "^0.12.0"
     query-string "^6.8.2"
     qw "~1.0.1"
     read "~1.0.7"
-    read-cmd-shim "^1.0.4"
+    read-cmd-shim "^1.0.5"
     read-installed "~4.0.3"
     read-package-json "^2.1.0"
     read-package-tree "^5.3.1"
@@ -9794,8 +10154,8 @@ npm@^6.10.3:
     sorted-object "~2.0.1"
     sorted-union-stream "~2.1.3"
     ssri "^6.0.1"
-    stringify-package "^1.0.0"
-    tar "^4.4.10"
+    stringify-package "^1.0.1"
+    tar "^4.4.13"
     text-table "~0.2.0"
     tiny-relative-date "^1.3.0"
     uid-number "0.0.6"
@@ -9803,7 +10163,7 @@ npm@^6.10.3:
     unique-filename "^1.1.1"
     unpipe "~1.0.0"
     update-notifier "^2.5.0"
-    uuid "^3.3.2"
+    uuid "^3.3.3"
     validate-npm-package-license "^3.0.4"
     validate-npm-package-name "~3.0.0"
     which "^1.3.1"
@@ -9837,10 +10197,10 @@ number-is-nan@^1.0.0:
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
   integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
 
-nwsapi@^2.0.7, nwsapi@^2.1.3, nwsapi@^2.1.4:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f"
-  integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==
+nwsapi@^2.0.7, nwsapi@^2.1.3, nwsapi@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+  integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
 
 oauth-sign@~0.9.0:
   version "0.9.0"
@@ -9867,9 +10227,9 @@ object-hash@^1.1.4:
   integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
 
 object-inspect@^1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
-  integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
+  integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
 
 object-is@^1.0.1:
   version "1.0.1"
@@ -9903,15 +10263,25 @@ object.assign@^4.1.0:
     has-symbols "^1.0.0"
     object-keys "^1.0.11"
 
+object.entries@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519"
+  integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.12.0"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+
 object.fromentries@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab"
-  integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.1.tgz#050f077855c7af8ae6649f45c80b16ee2d31e704"
+  integrity sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==
   dependencies:
-    define-properties "^1.1.2"
-    es-abstract "^1.11.0"
+    define-properties "^1.1.3"
+    es-abstract "^1.15.0"
     function-bind "^1.1.1"
-    has "^1.0.1"
+    has "^1.0.3"
 
 object.getownpropertydescriptors@^2.0.3:
   version "2.0.3"
@@ -10017,16 +10387,16 @@ optimize-css-assets-webpack-plugin@5.0.1:
     last-call-webpack-plugin "^3.0.0"
 
 optionator@^0.8.1, optionator@^0.8.2:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
-  integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
+  version "0.8.3"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+  integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
   dependencies:
     deep-is "~0.1.3"
-    fast-levenshtein "~2.0.4"
+    fast-levenshtein "~2.0.6"
     levn "~0.3.0"
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
-    wordwrap "~1.0.0"
+    word-wrap "~1.2.3"
 
 original@^1.0.0:
   version "1.0.2"
@@ -10045,16 +10415,7 @@ os-homedir@^1.0.0:
   resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
   integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
 
-os-locale@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
-  integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
-  dependencies:
-    execa "^0.7.0"
-    lcid "^1.0.0"
-    mem "^1.1.0"
-
-os-locale@^3.0.0:
+os-locale@^3.0.0, os-locale@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
   integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
@@ -10118,6 +10479,11 @@ p-is-promise@^2.0.0:
   resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
   integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
 
+p-is-promise@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971"
+  integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==
+
 p-limit@^1.1.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@@ -10174,9 +10540,9 @@ p-reduce@^2.0.0:
   integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==
 
 p-retry@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.1.0.tgz#9ce7cef2069e84bf590df3b8ec18d740109338d6"
-  integrity sha512-oepllyG9gX1qH4Sm20YAKxg1GA7L7puhvGnTfimi31P07zSIj7SDV6YtuAx9nbJF51DES+2CIIRkXs8GKqWJxA==
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.2.0.tgz#ea9066c6b44f23cab4cd42f6147cdbbc6604da5d"
+  integrity sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==
   dependencies:
     "@types/retry" "^0.12.0"
     retry "^0.12.0"
@@ -10201,10 +10567,10 @@ package-json@^4.0.0:
     registry-url "^3.0.3"
     semver "^5.1.0"
 
-pacote@^9.1.0, pacote@^9.5.3, pacote@^9.5.8:
-  version "9.5.8"
-  resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.8.tgz#23480efdc4fa74515855c9ecf39cf64078f99786"
-  integrity sha512-0Tl8Oi/K0Lo4MZmH0/6IsT3gpGf9eEAznLXEQPKgPq7FscnbUOyopnVpwXlnQdIbCUaojWy1Wd7VMyqfVsRrIw==
+pacote@^9.1.0, pacote@^9.5.3, pacote@^9.5.9:
+  version "9.5.9"
+  resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.9.tgz#fa3a08629c9390b2b99769c55b2cc137e1a24df3"
+  integrity sha512-S1nYW9ly+3btn3VmwRAk2LG3TEh8mkrFdY+psbnHSk8oPODbZ28uG0Z0d3yI0EpqcpLR6BukoVRf3H4IbGCkPQ==
   dependencies:
     bluebird "^3.5.3"
     cacache "^12.0.2"
@@ -10276,11 +10642,6 @@ parse-asn1@^5.0.0:
     pbkdf2 "^3.0.3"
     safe-buffer "^5.1.1"
 
-parse-github-url@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395"
-  integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==
-
 parse-json@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@@ -10378,7 +10739,7 @@ path-key@^2.0.0, path-key@^2.0.1:
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
   integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
 
-path-key@^3.0.0:
+path-key@^3.0.0, path-key@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3"
   integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==
@@ -10394,9 +10755,9 @@ path-to-regexp@0.1.7:
   integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
 
 path-to-regexp@^1.7.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
-  integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
+  integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
   dependencies:
     isarray "0.0.1"
 
@@ -10433,9 +10794,9 @@ patternfly-bootstrap-treeview@~2.1.10:
     jquery "^3.4.1"
 
 patternfly-react@^2.36.1:
-  version "2.39.4"
-  resolved "https://registry.yarnpkg.com/patternfly-react/-/patternfly-react-2.39.4.tgz#591d42e7ab3a7342bf9c27b264e75829c07f59d6"
-  integrity sha512-VQkOLElsQGkTfS6NPVFDQx+qi2AEZ/4bNNTzbMOGkq3Qn6VnxjM/dNPhgI1xCk1sWPMSHnlyD1zUI2wVYbErbg==
+  version "2.39.7"
+  resolved "https://registry.yarnpkg.com/patternfly-react/-/patternfly-react-2.39.7.tgz#f686d760317f020b32ddbd02ac4a05560fafe9f7"
+  integrity sha512-ChIqDX00ZGvuPx3Xyb1XQSDZlR9DT8jW5N3SdddQtaj7JKyQsIYfUUs+zmlmOhgHVUIPum2CDDZzLE7Nf+TTIA==
   dependencies:
     bootstrap-slider-without-jquery "^10.0.0"
     breakjs "^1.0.0"
@@ -10443,7 +10804,7 @@ patternfly-react@^2.36.1:
     css-element-queries "^1.0.1"
     lodash "^4.17.15"
     patternfly "^3.59.4"
-    react-bootstrap "^0.32.1"
+    react-bootstrap "^0.33.0"
     react-bootstrap-switch "^15.5.3"
     react-bootstrap-typeahead "^3.4.1"
     react-c3js "^0.1.20"
@@ -10514,9 +10875,9 @@ performance-now@^2.1.0:
   integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
 
 picomatch@^2.0.5:
-  version "2.0.7"
-  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6"
-  integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5"
+  integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==
 
 pify@^2.0.0:
   version "2.3.0"
@@ -10612,18 +10973,18 @@ pnp-webpack-plugin@1.2.1:
     ts-pnp "^1.0.0"
 
 popper.js@^1.14.4, popper.js@^1.14.6:
-  version "1.15.0"
-  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2"
-  integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==
+  version "1.16.0"
+  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.0.tgz#2e1816bcbbaa518ea6c2e15a466f4cb9c6e2fbb3"
+  integrity sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==
 
 portfinder@^1.0.9:
-  version "1.0.24"
-  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.24.tgz#11efbc6865f12f37624b6531ead1d809ed965cfa"
-  integrity sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==
+  version "1.0.25"
+  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca"
+  integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==
   dependencies:
-    async "^1.5.2"
-    debug "^2.2.0"
-    mkdirp "0.5.x"
+    async "^2.6.2"
+    debug "^3.1.1"
+    mkdirp "^0.5.1"
 
 posix-character-classes@^0.1.0:
   version "0.1.1"
@@ -10835,9 +11196,9 @@ postcss-image-set-function@^3.0.1:
     postcss-values-parser "^2.0.0"
 
 postcss-initial@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.1.tgz#99d319669a13d6c06ef8e70d852f68cb1b399b61"
-  integrity sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d"
+  integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==
   dependencies:
     lodash.template "^4.5.0"
     postcss "^7.0.2"
@@ -11258,7 +11619,7 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
   integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
 
-postcss-value-parser@^4.0.0:
+postcss-value-parser@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9"
   integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==
@@ -11272,10 +11633,10 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6:
-  version "7.0.18"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233"
-  integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.5, postcss@^7.0.6:
+  version "7.0.21"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17"
+  integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==
   dependencies:
     chalk "^2.4.2"
     source-map "^0.6.1"
@@ -11292,9 +11653,9 @@ prepend-http@^1.0.1:
   integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
 
 prettier@^1.18.2:
-  version "1.18.2"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
-  integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
+  version "1.19.1"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
+  integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
 
 pretty-bytes@^5.1.0:
   version "5.3.0"
@@ -11309,7 +11670,7 @@ pretty-error@^2.1.1:
     renderkid "^2.0.1"
     utila "~0.4"
 
-pretty-format@^24.9.0:
+pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9"
   integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==
@@ -11367,9 +11728,9 @@ promise@^7.1.1:
     asap "~2.0.3"
 
 prompts@^2.0.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35"
-  integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4"
+  integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==
   dependencies:
     kleur "^3.0.3"
     sisteransi "^1.0.3"
@@ -11389,7 +11750,7 @@ prop-types-extra@^1.0.1:
     react-is "^16.3.2"
     warning "^3.0.0"
 
-prop-types@^15, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
   version "15.7.2"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
   integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -11506,9 +11867,9 @@ qs@~6.5.2:
   integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
 
 query-string@^6.8.2:
-  version "6.8.3"
-  resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b"
-  integrity sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ==
+  version "6.9.0"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.9.0.tgz#1c3b727c370cf00f177c99f328fda2108f8fa3dd"
+  integrity sha512-KG4bhCFYapExLsUHrFt+kQVEegF2agm4cpF/VNc6pZVthIfCc/GK8t8VyNIE3nyXG9DK3Tf2EGkxjR6/uRdYsA==
   dependencies:
     decode-uri-component "^0.2.0"
     split-on-first "^1.0.0"
@@ -11587,9 +11948,9 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8:
     strip-json-comments "~2.0.1"
 
 react-app-polyfill@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.3.tgz#bd7030ebf66569f3aece03e39ab85ca700d8d0f6"
-  integrity sha512-ICvAU2vtO0k+kU0oCS7L7btUcAReTddvEiRiJDmAKc+d98Fy9Z1g6cjkdcKyfLWwopzBsUMcDwxoiNtrtLMs0Q==
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.4.tgz#4dd2636846b585c2d842b1e44e1bc29044345874"
+  integrity sha512-5Vte6ki7jpNsNCUKaboyofAhmURmCn2Y6Hu7ydJ6Iu4dct1CIGoh/1FT7gUZKAbowVX2lxVPlijvp1nKxfAl4w==
   dependencies:
     core-js "3.2.1"
     object-assign "4.1.1"
@@ -11619,10 +11980,10 @@ react-bootstrap-typeahead@^3.4.1:
     react-popper "^1.0.0"
     warning "^4.0.1"
 
-react-bootstrap@^0.32.1:
-  version "0.32.4"
-  resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.32.4.tgz#8efc4cbfc4807215d75b7639bee0d324c8d740d1"
-  integrity sha512-xj+JfaPOvnvr3ow0aHC7Y3HaBKZNR1mm361hVxVzVX3fcdJNIrfiodbQ0m9nLBpNxiKG6FTU2lq/SbTDYT2vew==
+react-bootstrap@^0.33.0:
+  version "0.33.0"
+  resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.33.0.tgz#db0004ae6c5b4822921c23448ff214de0e300d2e"
+  integrity sha512-UcxxaczDIPEsY+O4EqCIIEPDjxvLqqfUfXhQO+yzhk0yXzR0Y7+6xqBW01sy3gN717GUXhrkpwZiyn9uFX1s0A==
   dependencies:
     "@babel/runtime-corejs2" "^7.0.0"
     classnames "^2.2.5"
@@ -11631,10 +11992,10 @@ react-bootstrap@^0.32.1:
     keycode "^2.2.0"
     prop-types "^15.6.1"
     prop-types-extra "^1.0.1"
-    react-overlays "^0.8.0"
+    react-overlays "^0.9.0"
     react-prop-types "^0.4.0"
     react-transition-group "^2.0.0"
-    uncontrollable "^5.0.0"
+    uncontrollable "^7.0.2"
     warning "^3.0.0"
 
 react-c3js@^0.1.20:
@@ -11659,17 +12020,17 @@ react-collapse@^4.0.3:
     prop-types "^15.5.8"
 
 react-debounce-input@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/react-debounce-input/-/react-debounce-input-3.2.0.tgz#6978c6061d898f549f40417fb0d2ebbecf50aaaa"
-  integrity sha1-aXjGBh2Jj1SfQEF/sNLrvs9Qqqo=
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/react-debounce-input/-/react-debounce-input-3.2.2.tgz#d2cc99c1ce47fae89037965f5699edc1b0317197"
+  integrity sha512-RIBu68Cq/gImKz/2h1cE042REDqyqj3D+7SJ3lnnIpJX0ht9D9PfH7KAnL+SgDz6hvKa9pZS2CnAxlkrLmnQlg==
   dependencies:
     lodash.debounce "^4"
-    prop-types "^15"
+    prop-types "^15.7.2"
 
 react-dev-utils@^9.0.1:
-  version "9.0.4"
-  resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-9.0.4.tgz#5c71a8e8afdec0232c44d4e049d21baa437a92af"
-  integrity sha512-VwR+mBUXPLdYk/rOz6s6qpasIFGd7GW0KXd/3bih+/qGcMQvPG19XxtjDMtiAg0zWiFwp1ugCzAjLThbzFjVqw==
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-9.1.0.tgz#3ad2bb8848a32319d760d0a84c56c14bdaae5e81"
+  integrity sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg==
   dependencies:
     "@babel/code-frame" "7.5.5"
     address "1.1.2"
@@ -11690,7 +12051,7 @@ react-dev-utils@^9.0.1:
     loader-utils "1.2.3"
     open "^6.3.0"
     pkg-up "2.0.0"
-    react-error-overlay "^6.0.2"
+    react-error-overlay "^6.0.3"
     recursive-readdir "2.2.2"
     shell-quote "1.7.2"
     sockjs-client "1.4.0"
@@ -11698,14 +12059,14 @@ react-dev-utils@^9.0.1:
     text-table "0.2.0"
 
 react-dom@^16.8.6:
-  version "16.10.1"
-  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.10.1.tgz#479a6511ba34a429273c213cbc2a9ac4d296dac1"
-  integrity sha512-SmM4ZW0uug0rn95U8uqr52I7UdNf6wdGLeXDmNLfg3y5q5H9eAbdjF5ubQc3bjDyRrvdAB2IKG7X0GzSpnn5Mg==
+  version "16.11.0"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.11.0.tgz#7e7c4a5a85a569d565c2462f5d345da2dd849af5"
+  integrity sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
     prop-types "^15.6.2"
-    scheduler "^0.16.1"
+    scheduler "^0.17.0"
 
 react-ellipsis-with-tooltip@^1.0.8:
   version "1.1.1"
@@ -11717,10 +12078,10 @@ react-ellipsis-with-tooltip@^1.0.8:
     cz-conventional-changelog "^3.0.2"
     semantic-release "^15.13.1"
 
-react-error-overlay@^6.0.2:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.2.tgz#642bd6157c6a4b6e9ca4a816f7ed30b868c47f81"
-  integrity sha512-DHRuRk3K4Lg9obI6J4Y+nKvtwjasYRU9CFL3ud42x9YJG1HbQjSNublapC/WBJOA726gNUbqbj0U2df9+uzspQ==
+react-error-overlay@^6.0.3:
+  version "6.0.3"
+  resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.3.tgz#c378c4b0a21e88b2e159a3e62b2f531fd63bf60d"
+  integrity sha512-bOUvMWFQVk5oz8Ded9Xb7WVdEi3QGLC8tH7HmYP0Fdp4Bn3qw0tRFmr5TW6mvahzvmrK4a6bqWGfCevBflP+Xw==
 
 react-fast-compare@^2.0.0:
   version "2.0.4"
@@ -11728,16 +12089,16 @@ react-fast-compare@^2.0.0:
   integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
 
 react-fontawesome@^1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/react-fontawesome/-/react-fontawesome-1.6.1.tgz#eddce17e7dc731aa09fd4a186688a61793a16c5c"
-  integrity sha1-7dzhfn3HMaoJ/UoYZoimF5OhbFw=
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/react-fontawesome/-/react-fontawesome-1.7.1.tgz#f74f5a338fef3ee3b379820109c1cba47290f035"
+  integrity sha512-kottReWW1I9Uupub6A5YX4VK7qfpFnEjAcm5zB4Aepst7iofONT27GJYdTcRsj7q5uQu9PXBL7GsxAFKANNUVg==
   dependencies:
     prop-types "^15.5.6"
 
 react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4:
-  version "16.10.1"
-  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.1.tgz#0612786bf19df406502d935494f0450b40b8294f"
-  integrity sha512-BXUMf9sIOPXXZWqr7+c5SeOKJykyVr2u0UDzEf4LNGc6taGkQe1A9DFD07umCIXz45RLr9oAAwZbAJ0Pkknfaw==
+  version "16.11.0"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa"
+  integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==
 
 react-lifecycles-compat@^3.0.4:
   version "3.0.4"
@@ -11753,7 +12114,7 @@ react-motion@^0.5.2:
     prop-types "^15.5.8"
     raf "^3.1.0"
 
-react-overlays@^0.8.0, react-overlays@^0.8.1:
+react-overlays@^0.8.1:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.8.3.tgz#fad65eea5b24301cca192a169f5dddb0b20d3ac5"
   integrity sha512-h6GT3jgy90PgctleP39Yu3eK1v9vaJAW73GOA/UbN9dJ7aAN4BTZD6793eI1D5U+ukMk17qiqN/wl3diK1Z5LA==
@@ -11765,10 +12126,22 @@ react-overlays@^0.8.0, react-overlays@^0.8.1:
     react-transition-group "^2.2.0"
     warning "^3.0.0"
 
+react-overlays@^0.9.0:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.9.1.tgz#d4702bfe5b5e9335b676ff5a940253771fdeed12"
+  integrity sha512-b0asy/zHtRd0i2+2/uNxe3YVprF3bRT1guyr791DORjCzE/HSBMog+ul83CdtKQ1kZ+pLnxWCu5W3BMysFhHdQ==
+  dependencies:
+    classnames "^2.2.5"
+    dom-helpers "^3.2.1"
+    prop-types "^15.5.10"
+    prop-types-extra "^1.0.1"
+    react-transition-group "^2.2.1"
+    warning "^3.0.0"
+
 react-popper@^1.0.0:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.4.tgz#f0cd3b0d30378e1f663b0d79bcc8614221652ced"
-  integrity sha512-9AcQB29V+WrBKk6X7p0eojd1f25/oJajVdMZkywIoAV6Ag7hzE1Mhyeup2Q1QnvFRtGQFQvtqfhlEoDAPfKAVA==
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.6.tgz#32122f83af8fda01bdd4f86625ddacaf64fdd06d"
+  integrity sha512-kLTfa9z8n+0jJvRVal9+vIuirg41rObg4Bbrvv/ZfsGPQDN9reyVVSxqnHF1ZNgXgV7x11PeUfd5ItF8DZnqhg==
   dependencies:
     "@babel/runtime" "^7.1.2"
     create-react-context "^0.3.0"
@@ -11873,7 +12246,7 @@ react-scripts@3.0.1:
   optionalDependencies:
     fsevents "2.0.6"
 
-react-transition-group@^2.0.0, react-transition-group@^2.2.0:
+react-transition-group@^2.0.0, react-transition-group@^2.2.0, react-transition-group@^2.2.1:
   version "2.9.0"
   resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
   integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
@@ -11884,9 +12257,9 @@ react-transition-group@^2.0.0, react-transition-group@^2.2.0:
     react-lifecycles-compat "^3.0.4"
 
 react@^16.8.6:
-  version "16.10.1"
-  resolved "https://registry.yarnpkg.com/react/-/react-16.10.1.tgz#967c1e71a2767dfa699e6ba702a00483e3b0573f"
-  integrity sha512-2bisHwMhxQ3XQz4LiJJwG3360pY965pTl/MRrZYxIBKVj4fOHoDs5aZAkYXGxDRO1Li+SyjTAilQEbOmtQJHzA==
+  version "16.11.0"
+  resolved "https://registry.yarnpkg.com/react/-/react-16.11.0.tgz#d294545fe62299ccee83363599bf904e4a07fdbb"
+  integrity sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
@@ -11899,10 +12272,10 @@ reactabular-table@^8.14.0:
   dependencies:
     classnames "^2.2.5"
 
-read-cmd-shim@^1.0.1, read-cmd-shim@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.4.tgz#b4a53d43376211b45243f0072b6e603a8e37640d"
-  integrity sha512-Pqpl3qJ/QdOIjRYA0q5DND/gLvGOfpIz/fYVDGYpOXfW/lFrIttmLsBnd6IkyK10+JHU9zhsaudfvrQTBB9YFQ==
+read-cmd-shim@^1.0.1, read-cmd-shim@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16"
+  integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==
   dependencies:
     graceful-fs "^4.1.2"
 
@@ -11965,14 +12338,14 @@ read-pkg-up@^4.0.0:
     find-up "^3.0.0"
     read-pkg "^3.0.0"
 
-read-pkg-up@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3"
-  integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==
+read-pkg-up@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.0.tgz#3f3e53858ec5ae5e6fe14bc479da0a7c98f85ff3"
+  integrity sha512-t2ODkS/vTTcRlKwZiZsaLGb5iwfx9Urp924aGzVyboU6+7Z2i6eGr/G1Z4mjvwLLQV3uFOBKobNRGM3ux2PD/w==
   dependencies:
-    find-up "^4.0.0"
-    read-pkg "^5.1.1"
-    type-fest "^0.5.0"
+    find-up "^4.1.0"
+    read-pkg "^5.2.0"
+    type-fest "^0.8.1"
 
 read-pkg@^2.0.0:
   version "2.0.0"
@@ -11992,7 +12365,7 @@ read-pkg@^3.0.0:
     normalize-package-data "^2.3.2"
     path-type "^3.0.0"
 
-read-pkg@^5.0.0, read-pkg@^5.1.1:
+read-pkg@^5.0.0, read-pkg@^5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
   integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
@@ -12109,6 +12482,14 @@ redent@^2.0.0:
     indent-string "^3.0.0"
     strip-indent "^2.0.0"
 
+redent@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+  integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+  dependencies:
+    indent-string "^4.0.0"
+    strip-indent "^3.0.0"
+
 redeyed@~2.1.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b"
@@ -12209,9 +12590,9 @@ registry-url@^3.0.3:
     rc "^1.0.1"
 
 regjsgen@^0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd"
-  integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c"
+  integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==
 
 regjsparser@^0.6.0:
   version "0.6.0"
@@ -12265,19 +12646,19 @@ repeating@^2.0.0:
   dependencies:
     is-finite "^1.0.0"
 
-request-promise-core@1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
-  integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
+request-promise-core@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9"
+  integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==
   dependencies:
-    lodash "^4.17.11"
+    lodash "^4.17.15"
 
 request-promise-native@^1.0.5, request-promise-native@^1.0.7:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59"
-  integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36"
+  integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==
   dependencies:
-    request-promise-core "1.1.2"
+    request-promise-core "1.1.3"
     stealthy-require "^1.1.1"
     tough-cookie "^2.3.3"
 
@@ -12391,7 +12772,7 @@ resolve@1.10.0:
   dependencies:
     path-parse "^1.0.6"
 
-resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0:
+resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0:
   version "1.12.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
   integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
@@ -12437,9 +12818,9 @@ rgba-regex@^1.0.0:
   integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
 
 rhea@^1.0.8:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/rhea/-/rhea-1.0.10.tgz#1f6d5501505551dd9cdc1cf96b0f647487e9d08e"
-  integrity sha512-YmPaJ87uGR1CE8CYtRr5VYqfPtg3rTuof0OKCqn/lgYrJXYgmLUmDLPyZaTfXg1b1NAEz34M5JjuW/o5T/xjxg==
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/rhea/-/rhea-1.0.12.tgz#9190f00b5be4c823959557a9d7066b92147d393b"
+  integrity sha512-YI9OLjJnw9/lHQp7KmzNhfnijh5gE+fd/fv4i8uEicURMLg3Dbxyh2soqqIk6Z7nGx6KEVXb7/nr2DTiJSEDcw==
   dependencies:
     debug "0.8.0 - 3.5.0"
 
@@ -12562,10 +12943,10 @@ saxes@^3.1.9:
   dependencies:
     xmlchars "^2.1.1"
 
-scheduler@^0.16.1:
-  version "0.16.1"
-  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.16.1.tgz#a6fb6ddec12dc2119176e6eb54ecfe69a9eba8df"
-  integrity sha512-MIuie7SgsqMYOdCXVFZa8SKoNorJZUWHW8dPgto7uEHn1lX3fg2Gu0TzgK8USj76uxV7vB5eRMnZs/cdEHg+cg==
+scheduler@^0.17.0:
+  version "0.17.0"
+  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe"
+  integrity sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
@@ -12592,9 +12973,9 @@ selfsigned@^1.9.1:
     node-forge "0.9.0"
 
 semantic-release@^15.13.1:
-  version "15.13.24"
-  resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-15.13.24.tgz#f0b9544427d059ba5e3c89ac1545234130796be7"
-  integrity sha512-OPshm6HSp+KmZP9dUv1o3MRILDgOeHYWPI+XSpQRERMri7QkaEiIPkZzoNm2d6KDeFDnp03GphQQS4+Zfo+x/Q==
+  version "15.13.30"
+  resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-15.13.30.tgz#89a67d1c53fb1f3caee3ce9958a9017333747119"
+  integrity sha512-QetSFNr2hO6dZ/NDBh49neESF6OGinJfh4NcVhzMRg+rZpeqXq9sCbpZr0uDu+5HSkJYnX25MpMTF0QyyFhpxg==
   dependencies:
     "@semantic-release/commit-analyzer" "^6.1.0"
     "@semantic-release/error" "^2.2.0"
@@ -12602,10 +12983,10 @@ semantic-release@^15.13.1:
     "@semantic-release/npm" "^5.0.5"
     "@semantic-release/release-notes-generator" "^7.1.2"
     aggregate-error "^3.0.0"
-    cosmiconfig "^5.0.1"
+    cosmiconfig "^6.0.0"
     debug "^4.0.0"
     env-ci "^4.0.0"
-    execa "^1.0.0"
+    execa "^3.2.0"
     figures "^3.0.0"
     find-versions "^3.0.0"
     get-stream "^5.0.0"
@@ -12617,7 +12998,7 @@ semantic-release@^15.13.1:
     marked-terminal "^3.2.0"
     p-locate "^4.0.0"
     p-reduce "^2.0.0"
-    read-pkg-up "^6.0.0"
+    read-pkg-up "^7.0.0"
     resolve-from "^5.0.0"
     semver "^6.0.0"
     signale "^1.2.1"
@@ -12778,11 +13159,23 @@ shebang-command@^1.2.0:
   dependencies:
     shebang-regex "^1.0.0"
 
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
 shebang-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
   integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
 
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
 shell-quote@1.7.2:
   version "1.7.2"
   resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
@@ -12824,9 +13217,9 @@ simple-swizzle@^0.2.2:
     is-arrayish "^0.3.1"
 
 sisteransi@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb"
-  integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3"
+  integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==
 
 slash@^1.0.0:
   version "1.0.0"
@@ -12857,10 +13250,10 @@ slide@^1.1.6, slide@~1.1.3, slide@~1.1.6:
   resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
   integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=
 
-smart-buffer@4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d"
-  integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==
+smart-buffer@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba"
+  integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==
 
 snapdragon-node@^2.0.1:
   version "2.1.1"
@@ -12933,12 +13326,12 @@ socks-proxy-agent@^4.0.0:
     socks "~2.3.2"
 
 socks@~2.3.2:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e"
-  integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3"
+  integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==
   dependencies:
-    ip "^1.1.5"
-    smart-buffer "4.0.2"
+    ip "1.1.5"
+    smart-buffer "^4.1.0"
 
 sortabular@^1.5.1:
   version "1.6.0"
@@ -12982,9 +13375,9 @@ source-map-support@^0.4.15:
     source-map "^0.5.6"
 
 source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12:
-  version "0.5.13"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
-  integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
+  version "0.5.16"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
+  integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==
   dependencies:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
@@ -12994,7 +13387,7 @@ source-map-url@^0.4.0:
   resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
   integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
 
-source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
+source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -13282,7 +13675,7 @@ stringify-object@^3.3.0:
     is-obj "^1.0.1"
     is-regexp "^1.0.0"
 
-stringify-package@^1.0.0:
+stringify-package@^1.0.0, stringify-package@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
   integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
@@ -13341,6 +13734,13 @@ strip-indent@^2.0.0:
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
   integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
 
+strip-indent@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+  integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+  dependencies:
+    min-indent "^1.0.0"
+
 strip-json-comments@3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
@@ -13411,16 +13811,16 @@ svg-parser@^2.0.0:
   integrity sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg==
 
 svgo@^1.0.0, svgo@^1.2.2:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313"
-  integrity sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
+  integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
   dependencies:
     chalk "^2.4.1"
     coa "^2.0.2"
     css-select "^2.0.0"
     css-select-base-adapter "^0.1.1"
-    css-tree "1.0.0-alpha.33"
-    csso "^3.5.1"
+    css-tree "1.0.0-alpha.37"
+    csso "^4.0.2"
     js-yaml "^3.13.1"
     mkdirp "~0.5.1"
     object.values "^1.1.0"
@@ -13464,7 +13864,7 @@ tapable@^1.0.0, tapable@^1.1.0:
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
 
-tar@^4, tar@^4.4.10, tar@^4.4.12:
+tar@^4, tar@^4.4.10, tar@^4.4.12, tar@^4.4.13:
   version "4.4.13"
   resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
   integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
@@ -13477,6 +13877,20 @@ tar@^4, tar@^4.4.10, tar@^4.4.12:
     safe-buffer "^5.1.2"
     yallist "^3.0.3"
 
+temp-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+  integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
+
+tempy@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8"
+  integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==
+  dependencies:
+    temp-dir "^1.0.0"
+    type-fest "^0.3.1"
+    unique-string "^1.0.0"
+
 term-size@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
@@ -13523,9 +13937,9 @@ terser@^3.16.1:
     source-map-support "~0.5.10"
 
 terser@^4.1.2:
-  version "4.3.4"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.4.tgz#ad91bade95619e3434685d69efa621a5af5f877d"
-  integrity sha512-Kcrn3RiW8NtHBP0ssOAzwa2MsIRQ8lJWiBG/K7JgqPlomA3mtb2DEmp4/hrUA+Jujx+WZ02zqd7GYD+QRBB/2Q==
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.0.tgz#22c46b4817cf4c9565434bfe6ad47336af259ac3"
+  integrity sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==
   dependencies:
     commander "^2.20.0"
     source-map "~0.6.1"
@@ -13585,9 +13999,9 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8:
   integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 
 thunky@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826"
-  integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
+  integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
 
 time-stamp@^1.0.0:
   version "1.1.0"
@@ -13698,9 +14112,9 @@ toidentifier@1.0.0:
   integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
 
 topojson-client@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.0.1.tgz#774c0343b44fc4ec29c3a2274d7a1a9c3b213cd9"
-  integrity sha512-rfGGzyqefpxOaxvV9OTF9t+1g+WhjGEbAIuCcmKYrQkxr0nttjMMyzZsK+NhLW4cTl2g1bz2jQczPUtEshpbVQ==
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99"
+  integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==
   dependencies:
     commander "2"
 
@@ -13769,9 +14183,9 @@ ts-pnp@1.1.2:
   integrity sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA==
 
 ts-pnp@^1.0.0:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.4.tgz#ae27126960ebaefb874c6d7fa4729729ab200d90"
-  integrity sha512-1J/vefLC+BWSo+qe8OnJQfWTYRS6ingxjwqmHMqaMxXMj7kFtKLgAaYW3JeX3mktjgUL+etlU8/B4VUAUI9QGw==
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.5.tgz#840e0739c89fce5f3abd9037bb091dbff16d9dec"
+  integrity sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==
 
 tslib@^1.8.1, tslib@^1.9.0:
   version "1.10.0"
@@ -13809,16 +14223,21 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
-type-fest@^0.5.0:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2"
-  integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==
+type-fest@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
+  integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==
 
 type-fest@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
   integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
 
+type-fest@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+  integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
 type-is@~1.6.17, type-is@~1.6.18:
   version "1.6.18"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@@ -13843,9 +14262,9 @@ typescript@3.4.5:
   integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==
 
 typescript@^3.5.2:
-  version "3.6.3"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da"
-  integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==
+  version "3.7.2"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb"
+  integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==
 
 ua-parser-js@^0.7.18:
   version "0.7.20"
@@ -13861,11 +14280,11 @@ uglify-js@3.4.x:
     source-map "~0.6.1"
 
 uglify-js@^3.1.4:
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5"
-  integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==
+  version "3.6.9"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.9.tgz#85d353edb6ddfb62a9d798f36e91792249320611"
+  integrity sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==
   dependencies:
-    commander "~2.20.0"
+    commander "~2.20.3"
     source-map "~0.6.1"
 
 uid-number@0.0.6:
@@ -13878,12 +14297,15 @@ umask@^1.1.0, umask@~1.1.0:
   resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
   integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=
 
-uncontrollable@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-5.1.0.tgz#7e9a1c50ea24e3c78b625e52d21ff3f758c7bd59"
-  integrity sha512-5FXYaFANKaafg4IVZXUNtGyzsnYEvqlr9wQ3WpZxFpEUxl29A3H6Q4G1Dnnorvq9TGOGATBApWR4YpLAh+F5hw==
+uncontrollable@^7.0.2:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556"
+  integrity sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==
   dependencies:
+    "@babel/runtime" "^7.6.3"
+    "@types/react" "^16.9.11"
     invariant "^2.2.4"
+    react-lifecycles-compat "^3.0.4"
 
 unicode-canonical-property-names-ecmascript@^1.0.4:
   version "1.0.4"
@@ -14113,7 +14535,7 @@ utils-merge@1.0.1:
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
   integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
 
-uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2:
+uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3:
   version "3.3.3"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
   integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
@@ -14438,9 +14860,9 @@ victory@^32.2.3:
     victory-zoom-container "^32.3.7"
 
 vm-browserify@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
-  integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+  integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
 
 w3c-hr-time@^1.0.1:
   version "1.0.1"
@@ -14458,6 +14880,11 @@ w3c-xmlserializer@^1.1.2:
     webidl-conversions "^4.0.2"
     xml-name-validator "^3.0.0"
 
+wait-for-expect@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.1.tgz#ec204a76b0038f17711e575720aaf28505ac7185"
+  integrity sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==
+
 walker@^1.0.7, walker@~1.0.5:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
@@ -14650,9 +15077,9 @@ whatwg-url@^6.4.1:
     webidl-conversions "^4.0.2"
 
 whatwg-url@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd"
-  integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
+  integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
   dependencies:
     lodash.sortby "^4.7.0"
     tr46 "^1.0.1"
@@ -14670,6 +15097,13 @@ which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
   dependencies:
     isexe "^2.0.0"
 
+which@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4"
+  integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==
+  dependencies:
+    isexe "^2.0.0"
+
 wide-align@^1.1.0:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
@@ -14691,7 +15125,7 @@ windows-release@^3.1.0:
   dependencies:
     execa "^1.0.0"
 
-word-wrap@^1.0.3:
+word-wrap@^1.0.3, word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
   integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
@@ -14701,11 +15135,6 @@ wordwrap@~0.0.2:
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
   integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
 
-wordwrap@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
-  integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
-
 workbox-background-sync@^4.3.1:
   version "4.3.1"
   resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950"
@@ -14917,9 +15346,9 @@ ws@^6.1.2:
     async-limiter "~1.0.0"
 
 ws@^7.0.0:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-7.1.2.tgz#c672d1629de8bb27a9699eb599be47aeeedd8f73"
-  integrity sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.0.tgz#422eda8c02a4b5dba7744ba66eebbd84bcef0ec7"
+  integrity sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==
   dependencies:
     async-limiter "^1.0.0"
 
@@ -14975,6 +15404,13 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
 
+yaml@^1.7.2:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2"
+  integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==
+  dependencies:
+    "@babel/runtime" "^7.6.3"
+
 yargs-parser@^10.1.0:
   version "10.1.0"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
@@ -14990,6 +15426,14 @@ yargs-parser@^13.1.1:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
+yargs-parser@^15.0.0:
+  version "15.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08"
+  integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
 yargs-parser@^9.0.2:
   version "9.0.2"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
@@ -15016,15 +15460,15 @@ yargs@12.0.2:
     yargs-parser "^10.1.0"
 
 yargs@^11.0.0:
-  version "11.1.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
-  integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==
+  version "11.1.1"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766"
+  integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==
   dependencies:
     cliui "^4.0.0"
     decamelize "^1.1.1"
     find-up "^2.1.0"
     get-caller-file "^1.0.1"
-    os-locale "^2.0.0"
+    os-locale "^3.1.0"
     require-directory "^2.1.1"
     require-main-filename "^1.0.1"
     set-blocking "^2.0.0"
@@ -15050,9 +15494,9 @@ yargs@^13.3.0:
     yargs-parser "^13.1.1"
 
 yargs@^14.0.0:
-  version "14.0.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.0.0.tgz#ba4cacc802b3c0b3e36a9e791723763d57a85066"
-  integrity sha512-ssa5JuRjMeZEUjg7bEL99AwpitxU/zWGAGpdj0di41pOEmJti8NR6kyUIJBkR78DTYNPZOU08luUo0GTHuB+ow==
+  version "14.2.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3"
+  integrity sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==
   dependencies:
     cliui "^5.0.0"
     decamelize "^1.2.0"
@@ -15064,4 +15508,4 @@ yargs@^14.0.0:
     string-width "^3.0.0"
     which-module "^2.0.0"
     y18n "^4.0.0"
-    yargs-parser "^13.1.1"
+    yargs-parser "^15.0.0"


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org