diff --git a/app/Root.jsx b/app/Root.jsx
index a5d986e00184a2ea4f36252602fab6ef270e5914..a9129436c9989311c4458aa6cb64dbf087af9709 100644
--- a/app/Root.jsx
+++ b/app/Root.jsx
@@ -1,26 +1,43 @@
 /* eslint-disable no-param-reassign */
 import React from 'react'
+// import { BrowserRouter } from 'react-router-dom'
+// import PropTypes from 'prop-types'
+// import { ThemeProvider } from 'styled-components'
+// import { ApolloProvider } from '@apollo/react-components'
+// import { ApolloClient } from 'apollo-client'
+// import { WebSocketLink } from 'apollo-link-ws'
+// import { split, ApolloLink } from 'apollo-link'
+// import { getMainDefinition } from 'apollo-utilities'
+// import { setContext } from 'apollo-link-context'
+// import {
+//   InMemoryCache,
+//   IntrospectionFragmentMatcher,
+// } from 'apollo-cache-inmemory'
+// import { createUploadLink } from 'apollo-upload-client'
+import GlobalStyle from './theme/elements/GlobalStyle'
+
+// import introspectionQueryResultData from './fragmentTypes.json'
+
 import { BrowserRouter } from 'react-router-dom'
 import PropTypes from 'prop-types'
 import { ThemeProvider } from 'styled-components'
-import { ApolloProvider } from '@apollo/react-components'
-import { ApolloClient } from 'apollo-client'
-import { WebSocketLink } from 'apollo-link-ws'
-import { split, ApolloLink } from 'apollo-link'
-import { getMainDefinition } from 'apollo-utilities'
-import { setContext } from 'apollo-link-context'
 import {
-  InMemoryCache,
-  IntrospectionFragmentMatcher,
-} from 'apollo-cache-inmemory'
+  ApolloProvider,
+  ApolloClient,
+  ApolloLink,
+  split,
+  gql,
+} from '@apollo/client'
+// import { ApolloClient } from 'apollo-client'
+import { WebSocketLink } from '@apollo/client/link/ws'
+// import { split, ApolloLink } from 'apollo-link'
+import { getMainDefinition } from '@apollo/client/utilities'
+import { setContext } from '@apollo/client/link/context'
+import { InMemoryCache } from '@apollo/client/cache'
 import { createUploadLink } from 'apollo-upload-client'
-import GlobalStyle from './theme/elements/GlobalStyle'
 
-import introspectionQueryResultData from './fragmentTypes.json'
-
-const fragmentMatcher = new IntrospectionFragmentMatcher({
-  introspectionQueryResultData,
-})
+import { GET_CURRENT_USER } from './queries'
+import currentRolesVar from './shared/currentRolesVar'
 
 // See https://github.com/apollographql/apollo-feature-requests/issues/6#issuecomment-465305186
 export function stripTypenames(obj) {
@@ -83,7 +100,25 @@ const makeApolloClient = (makeConfig, connectToWebSocket) => {
   }
   const config = {
     link,
-    cache: new InMemoryCache({ fragmentMatcher }),
+    cache: new InMemoryCache({
+      possibleTypes: {
+        Identity: ['LocalIdentity', 'ExternalIdentity'],
+      },
+      typePolicies: {
+        Manuscript: {
+          fields: {
+            _currentRoles: {
+              read(existing, { cache, args, readField }) {
+                const currentRoles = currentRolesVar()
+                const currentId = readField('id')
+                const r = currentRoles.find(r => r.id === currentId)
+                return (r && r.roles) || []
+              },
+            },
+          },
+        },
+      },
+    }),
   }
   return new ApolloClient(makeConfig ? makeConfig(config) : config)
 }
diff --git a/app/app.js b/app/app.js
index a2b58f454fc55c7c4f7b8ed7f3bd3eba4fb2dd6f..03597a268478f7cacbb2bf01c2cf25f89823327e 100644
--- a/app/app.js
+++ b/app/app.js
@@ -9,7 +9,7 @@ import theme from './theme'
 import { JournalProvider } from './components/xpub-journal'
 import { XpubProvider } from './components/xpub-with-context'
 
-import * as journal from './config/journal'
+import * as journal from '../config/journal'
 import routes from './routes'
 
 const history = createBrowserHistory()
diff --git a/app/components/AdminPage.js b/app/components/AdminPage.js
index fef8ac26882c663b4deba29a80dc9fa7dc2f4dae..114eee5766afe34b8d420fe83fb91e5dca6f6b41 100644
--- a/app/components/AdminPage.js
+++ b/app/components/AdminPage.js
@@ -1,11 +1,10 @@
-import React, { useContext } from 'react'
+import React, { useContext, useCallback, useRef } from 'react'
 import styled from 'styled-components'
 import { compose } from 'recompose'
-import { useQuery, useApolloClient } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 import {
   withRouter,
   matchPath,
-  Router,
   Route,
   Switch,
   Redirect,
@@ -27,9 +26,12 @@ import FormBuilderPage from '../components/component-formbuilder/src/components/
 import NewSubmissionPage from '../components/component-submit/src/components/NewSubmissionPage'
 import { Profile } from '../components/component-profile/src'
 
-import queries from '../graphql'
+import { GET_CURRENT_USER } from '../queries'
 
 import Menu from './Menu'
+import { Spinner } from './shared'
+
+import currentRolesVar from '../shared/currentRolesVar'
 
 const getParams = routerPath => {
   const path = '/journal/versions/:version'
@@ -67,20 +69,47 @@ const PrivateRoute = ({ component: Component, ...rest }) => (
   />
 )
 
-const AdminPage = ({ children, history, match }) => {
-  const client = useApolloClient()
+const updateStuff = data => {
+  currentRolesVar(data.currentUser._currentRoles)
+}
 
+const AdminPage = ({ children, history, match }) => {
   const journal = useContext(JournalContext)
   const [conversion] = useContext(XpubContext)
 
-  const { data } = useQuery(queries.currentUser)
+  // Get the current user every 5 seconds (this includes authorization info)
+  const { loading, error, data } = useQuery(GET_CURRENT_USER, {
+    pollInterval: 5000,
+    notifyOnNetworkStatusChange: true,
+    fetchPolicy: 'network-only',
+    // TODO: useCallback used because of bug: https://github.com/apollographql/apollo-client/issues/6301
+    onCompleted: useCallback(data => updateStuff(data), []),
+  })
+
+  const previousDataRef = useRef(null)
+
+  // Do this to prevent polling-related flicker
+  if (loading && !previousDataRef.current) {
+    return <Spinner />
+  }
+
+  let notice = ''
+  if (error) {
+    if (error.networkError) {
+      notice = 'You are offline.'
+    } else {
+      return <Redirect to="/login" />
+    }
+  }
+
   const currentUser = data && data.currentUser
 
+  previousDataRef.current = data
+
   const { pathname } = history.location
   const showLinks = pathname.match(/^\/(submit|manuscript)/g)
   let links = []
   const formBuilderLink = `/journal/admin/form-builder`
-  const profileLink = `/journal/profile`
   const homeLink = '/journal/dashboard'
 
   if (showLinks) {
@@ -119,6 +148,7 @@ const AdminPage = ({ children, history, match }) => {
         brandLink="/journal/dashboard"
         loginLink="/login?next=/journal/dashboard"
         navLinkComponents={links}
+        notice={notice}
         user={currentUser}
       />
       <Switch>
diff --git a/app/components/Menu.js b/app/components/Menu.js
index ffb5e2e8fca6f51c210e3b4fd44b3889f5038b92..f995464a9bd90b4383d914af87f8718f326ae3a9 100644
--- a/app/components/Menu.js
+++ b/app/components/Menu.js
@@ -1,11 +1,10 @@
 import React from 'react'
 import styled, { css } from 'styled-components'
-import PropTypes from 'prop-types'
-import { override, th, grid, darken, lighten } from '@pubsweet/ui-toolkit'
-
-import { Icon, Action } from '@pubsweet/ui'
+// import PropTypes from 'prop-types'
+import { th, grid, lighten } from '@pubsweet/ui-toolkit'
+import { Link } from 'react-router-dom'
+import { Icon } from '@pubsweet/ui'
 import { UserAvatar } from '../components/component-avatar/src'
-import { Link, useHistory } from 'react-router-dom'
 
 const Root = styled.nav`
   grid-area: menu;
@@ -28,19 +27,19 @@ const Section = styled.div`
   // align-items: center;
 `
 
-const Logo = styled.span`
-  // margin: ${grid(2)} 1rem ${grid(2)} 1rem;
+// const Logo = styled.span`
+//   // margin: ${grid(2)} 1rem ${grid(2)} 1rem;
 
-  ${override('ui.AppBar.Logo')};
-`
+//   ${override('ui.AppBar.Logo')};
+// `
 
-const LogoLink = styled(Action)`
-  & > * {
-    height: calc(${th('gridUnit')} * 6);
-  }
+// const LogoLink = styled(Action)`
+//   & > * {
+//     height: calc(${th('gridUnit')} * 6);
+//   }
 
-  ${override('ui.AppBar.LogoLink')};
-`
+//   ${override('ui.AppBar.LogoLink')};
+// `
 
 const NavItem = ({ className, link, name, icon }) => (
   <Link className={className} to={link}>
@@ -108,11 +107,18 @@ const UserInfo = styled.div`
   margin-left: ${grid(1)};
 `
 
-const Menu = ({ className, loginLink = '/login', navLinkComponents, user }) => (
+const Menu = ({
+  className,
+  loginLink = '/login',
+  navLinkComponents,
+  user,
+  notice,
+}) => (
   <Root className={className}>
     <Section>
+      {/* TODO: Place this notice (used for offline notification) better */}
+      {notice}
       <UserComponent loginLink={loginLink} user={user} />
-
       {navLinkComponents &&
         navLinkComponents.map((navInfo, idx) => (
           <Item
@@ -129,7 +135,7 @@ const UserComponent = ({ user, loginLink }) => (
   <Section>
     {user && (
       <UserItem to="/journal/profile">
-        <UserAvatar user={user} size={64} />
+        <UserAvatar size={64} user={user} />
         <UserInfo>
           {user.defaultIdentity.name || user.username}
           {/* ({user.username}) */}
@@ -137,17 +143,17 @@ const UserComponent = ({ user, loginLink }) => (
         </UserInfo>
       </UserItem>
     )}
-    {!user && <Item name="Login" link={loginLink} />}
+    {!user && <Item link={loginLink} name="Login" />}
   </Section>
 )
 
-Menu.propTypes = {
-  brandLink: PropTypes.string,
-  brand: PropTypes.node,
-  loginLink: PropTypes.string,
-  onLogoutClick: PropTypes.func,
-  user: PropTypes.object,
-  navLinkComponents: PropTypes.arrayOf(PropTypes.element),
-}
+// Menu.propTypes = {
+//   brandLink: PropTypes.string,
+//   brand: PropTypes.node,
+//   loginLink: PropTypes.string,
+//   onLogoutClick: PropTypes.func,
+//   user: PropTypes.object,
+//   navLinkComponents: PropTypes.arrayOf(PropTypes.element),
+// }
 
 export default Menu
diff --git a/app/components/NextPageButton/index.js b/app/components/NextPageButton/index.js
index 178c3d006f7ff773d750efc9b28fab8f24d422ec..ae43bf089a3f1c61d404c1ba50a470d03bcf002e 100644
--- a/app/components/NextPageButton/index.js
+++ b/app/components/NextPageButton/index.js
@@ -1,7 +1,7 @@
 import VisibilitySensor from 'react-visibility-sensor'
 import { Link } from 'react-router-dom'
 import React from 'react'
-import PropTypes from 'prop-types'
+// import PropTypes from 'prop-types'
 import { Spinner } from '../shared'
 import { HasNextPage, NextPageButton } from './style'
 
@@ -53,14 +53,15 @@ const NextPageButtonWrapper = props => {
   )
 }
 
-NextPageButtonWrapper.propTypes = {
-  isFetchingMore: PropTypes.bool,
-  href: PropTypes.object,
-  fetchMore: PropTypes.func.isRequired,
-  children: PropTypes.string,
-  automatic: PropTypes.bool,
-  topOffset: PropTypes.number,
-  bottomOffset: PropTypes.number,
-}
+// TODO: Set default props
+// NextPageButtonWrapper.propTypes = {
+//   isFetchingMore: PropTypes.bool,
+//   href: PropTypes.object,
+//   fetchMore: PropTypes.func.isRequired,
+//   children: PropTypes.string,
+//   automatic: PropTypes.bool,
+//   topOffset: PropTypes.number,
+//   bottomOffset: PropTypes.number,
+// }
 
 export default NextPageButtonWrapper
diff --git a/app/components/component-avatar/src/UserAvatar.js b/app/components/component-avatar/src/UserAvatar.js
index 55f93f0e121c12507954bd131d6bd4a06cd6283c..d5df7987c10a37d19b0276b470cea53f06497de6 100644
--- a/app/components/component-avatar/src/UserAvatar.js
+++ b/app/components/component-avatar/src/UserAvatar.js
@@ -1,13 +1,10 @@
-// @flow
 import * as React from 'react'
-import { useQuery } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 import styled from 'styled-components'
-// import { GET_USER } from '../../queries'
-// import { UserHoverProfile } from 'src/components/hoverProfile';
+import gql from 'graphql-tag'
 import AvatarImage from './image'
 import { Container, AvatarLink, OnlineIndicator } from './style'
 import ConditionalWrap from '../../ConditionalWrap'
-import gql from 'graphql-tag'
 
 export const GET_USER = gql`
   query user($id: ID, $username: String) {
diff --git a/app/components/component-chat/src/Action.js b/app/components/component-chat/src/Action.js
index 5e7d6bc45746c9f3bf9292a54be785d2a9b3b64c..36434c7145b2b01df027a8974f0e5ce83451eec9 100644
--- a/app/components/component-chat/src/Action.js
+++ b/app/components/component-chat/src/Action.js
@@ -12,9 +12,7 @@
 
 import React from 'react'
 import styled, { css } from 'styled-components'
-import { th, override } from '@pubsweet/ui-toolkit'
-
-import { Button } from '@pubsweet/ui'
+import { th } from '@pubsweet/ui-toolkit'
 
 const common = css`
   color: ${th('colorPrimary')};
@@ -42,8 +40,6 @@ const ActionButton = styled.button`
   ${common};
 `
 
-const Action = props => {
-  return <ActionButton {...props}>{props.children}</ActionButton>
-}
+const Action = props => <ActionButton {...props}>{props.children}</ActionButton>
 
 export default Action
diff --git a/app/components/component-chat/src/MentionsInput/MentionsInput.jsx b/app/components/component-chat/src/MentionsInput/MentionsInput.jsx
index ac03e902f11096057cdb18454e3c93ffae38dea4..3334f25748058f166fb005bc0fbef852d3b97c53 100644
--- a/app/components/component-chat/src/MentionsInput/MentionsInput.jsx
+++ b/app/components/component-chat/src/MentionsInput/MentionsInput.jsx
@@ -1,7 +1,7 @@
 // @flow
 import React from 'react'
 import { MentionsInput, Mention } from 'react-mentions'
-import { useApolloClient } from '@apollo/react-hooks'
+import { useApolloClient } from '@apollo/client'
 import { MentionsInputStyle } from './style'
 import MentionSuggestion from './mentionSuggestion'
 import { SEARCH_USERS } from '../../../../queries'
diff --git a/app/components/component-chat/src/MentionsInput/style.js b/app/components/component-chat/src/MentionsInput/style.js
index cd277d83d72f913332e897a0e5d4d08ff1c0fcc0..41a8b6357e7e0a1cdb16994a77b89f1cafcff320 100644
--- a/app/components/component-chat/src/MentionsInput/style.js
+++ b/app/components/component-chat/src/MentionsInput/style.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import styled from 'styled-components'
 import { th } from '@pubsweet/ui-toolkit'
 
 // import theme from 'shared/theme';
diff --git a/app/components/component-chat/src/Messages/MessageRenderer.jsx b/app/components/component-chat/src/Messages/MessageRenderer.jsx
index d495fb8cd77206d3e91d18c8826e286c3325bcae..03c2f6624f2abfe5113f60d896a2eae51c499844 100644
--- a/app/components/component-chat/src/Messages/MessageRenderer.jsx
+++ b/app/components/component-chat/src/Messages/MessageRenderer.jsx
@@ -1,7 +1,7 @@
 import React from 'react'
 import ReactMarkdown from 'react-markdown'
 import htmlParser from 'react-markdown/plugins/html-parser'
-import { useQuery } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 import gql from 'graphql-tag'
 import styled from 'styled-components'
 import { th } from '@pubsweet/ui-toolkit'
diff --git a/app/components/component-chat/src/Messages/Messages.jsx b/app/components/component-chat/src/Messages/Messages.jsx
index cc8e3a25b2a4ab8327cda6c51b98dadad1f71800..8ca81aaf86f06c4cd7ae419a9e21f30d83cad1f7 100644
--- a/app/components/component-chat/src/Messages/Messages.jsx
+++ b/app/components/component-chat/src/Messages/Messages.jsx
@@ -1,16 +1,12 @@
 import React, { useEffect } from 'react'
 import gql from 'graphql-tag'
-// import styled from 'styled-components'
-import { useQuery } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 import PropTypes from 'prop-types'
-// import ReactMarkdown from 'react-markdown/with-html'
-// import Icon from './Icon'
 import { UserAvatar } from '../../../component-avatar/src'
 import { sortAndGroupMessages } from '../../../../sortAndGroup'
 import NextPageButton from '../../../NextPageButton'
 import { convertTimestampToDate } from '../../../../shared/time-formatting'
 import MessageRenderer from './MessageRenderer'
-// import { SmallProfileImage } from './ProfileImage'
 
 import {
   Timestamp,
@@ -39,6 +35,15 @@ const GET_MESSAGES = gql`
           profilePicture
           online
           defaultIdentity {
+            ... on ExternalIdentity {
+              identifier
+            }
+            ... on LocalIdentity {
+              email
+            }
+            type
+            aff
+            id
             name
           }
         }
@@ -64,6 +69,15 @@ const MESSAGES_SUBSCRIPTION = gql`
         profilePicture
         online
         defaultIdentity {
+          id
+          ... on ExternalIdentity {
+            identifier
+          }
+          ... on LocalIdentity {
+            email
+          }
+          type
+          aff
           name
         }
       }
@@ -71,59 +85,6 @@ const MESSAGES_SUBSCRIPTION = gql`
   }
 `
 
-// const MESSAGES_ENHANCED_SUBSCRIPTION = gql`
-//   subscription messageEnhanced($channelId: ID) {
-//     messageEnhanced(channelId: $channelId) {
-//       id
-//       created
-//       updated
-//       content
-//       user {
-//         id
-//         username
-//         profilePicture
-//         online
-//       }
-//     }
-//   }
-// `
-
-// const subscribeToEnhancedMessages = (subscribeToMore, channelId) =>
-//   subscribeToMore({
-//     document: MESSAGES_ENHANCED_SUBSCRIPTION,
-//     variables: { channelId },
-//     updateQuery: (prev, { subscriptionData }) => {
-//       if (!subscriptionData.data) return prev
-//       const { messageEnhanced } = subscriptionData.data
-//       const existingMessage = prev.messages.edges.find(
-//         ({ id }) => id === messageEnhanced.id,
-//       )
-//       if (existingMessage) {
-//         return Object.assign({}, prev, {
-//           messages: {
-//             ...prev.messages,
-//             edges: prev.messages.edges.map(edge => {
-//               // Replace the optimstic update with the actual db message
-//               if (edge.id === existingMessage.id)
-//                 return {
-//                   ...edge,
-//                   // cursor: btoa(newMessage.id),
-//                   enhanced: subscriptionData.data.messageEnhanced.enhanced,
-//                 }
-
-//               return edge
-//             }),
-//           },
-//         })
-//       }
-//       return Object.assign({}, prev, {
-//         messages: {
-//           ...prev.messages,
-//           edges: [...prev.messages.edges, messageEnhanced],
-//         },
-//       })
-//     },
-//   })
 
 const subscribeToNewMessages = (subscribeToMore, channelId) =>
   subscribeToMore({
diff --git a/app/components/component-chat/src/Messages/PaperEmbed.jsx b/app/components/component-chat/src/Messages/PaperEmbed.jsx
index 7fe32cc02203bbc18e312e95fadbeb5e9c3dbd1c..e22b8cae6cb2a7f3e8ad3d1d9da59cbde09b1dc2 100644
--- a/app/components/component-chat/src/Messages/PaperEmbed.jsx
+++ b/app/components/component-chat/src/Messages/PaperEmbed.jsx
@@ -1,5 +1,5 @@
 import React, { useState } from 'react'
-import { useQuery } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 import gql from 'graphql-tag'
 import styled from 'styled-components'
 import { th } from '@pubsweet/ui-toolkit'
diff --git a/app/components/component-chat/src/SuperChatInput/SuperChatInput.jsx b/app/components/component-chat/src/SuperChatInput/SuperChatInput.jsx
index 68697f73adb7cbc9ab82b19c0b223adea2cf04ab..eff4db7973a2a3ebc1cba86ba2ba4a15b15a40d3 100644
--- a/app/components/component-chat/src/SuperChatInput/SuperChatInput.jsx
+++ b/app/components/component-chat/src/SuperChatInput/SuperChatInput.jsx
@@ -3,7 +3,7 @@ import * as React from 'react'
 import { Button } from '@pubsweet/ui'
 import { th } from '@pubsweet/ui-toolkit'
 import styled from 'styled-components'
-import { useMutation } from '@apollo/react-hooks'
+import { useMutation } from '@apollo/client'
 
 // import compose from 'recompose/compose';
 // import { connect } from 'react-redux';
diff --git a/app/components/component-chat/src/index.js b/app/components/component-chat/src/index.js
index 4e371a6886f43841d52cc3c4055264311b906877..31a39bf20428c64935d42b64ae11290fb0961c09 100644
--- a/app/components/component-chat/src/index.js
+++ b/app/components/component-chat/src/index.js
@@ -1,9 +1,6 @@
 import React from 'react'
 import styled from 'styled-components'
 import { th } from '@pubsweet/ui-toolkit'
-// import { useQuery } from '@apollo/react-hooks'
-// import gql from 'graphql-tag'
-// import { useParams } from 'react-router-dom'
 import Messages from './Messages/Messages'
 import ChatInput from './SuperChatInput/SuperChatInput'
 
@@ -17,21 +14,11 @@ const MessageContainer = styled.section`
     'write';
 `
 
-// const GET_CHANNEL_BY_DOI = gql`
-//   query findByDOI($doi: String) {
-//     findByDOI(doi: $doi) {
-//       id
-//     }
-//   }
-// `
-
-const Container = ({ channelId }) => {
-  return (
-    <MessageContainer>
-      <Messages channelId={channelId} />
-      <ChatInput channelId={channelId} />
-    </MessageContainer>
-  )
-}
+const Container = ({ channelId }) => (
+  <MessageContainer>
+    <Messages channelId={channelId} />
+    <ChatInput channelId={channelId} />
+  </MessageContainer>
+)
 
 export default Container
diff --git a/app/components/component-dashboard/src/components/Dashboard.js b/app/components/component-dashboard/src/components/Dashboard.js
index 4edda6a4ee0b34c86cb195adb771939be5093c29..221cb872ba1a6a73da87ae3ed866fdd4e5fead50 100644
--- a/app/components/component-dashboard/src/components/Dashboard.js
+++ b/app/components/component-dashboard/src/components/Dashboard.js
@@ -1,17 +1,11 @@
 import React from 'react'
-import { useQuery, useMutation } from '@apollo/react-hooks'
-import { Action, Button, Icon } from '@pubsweet/ui'
+import { useQuery, useMutation } from '@apollo/client'
+import { Button } from '@pubsweet/ui'
 // import Authorize from 'pubsweet-client/src/helpers/Authorize'
 
 import queries from '../graphql/queries/'
 import mutations from '../graphql/mutations/'
-import {
-  Container,
-  Section,
-  Heading,
-  Content,
-  HeadingWithAction,
-} from '../style'
+import { Container, Heading, HeadingWithAction, Placeholder } from '../style'
 import EditorItem from './sections/EditorItem'
 import OwnerItem from './sections/OwnerItem'
 import ReviewerItem from './sections/ReviewerItem'
@@ -23,6 +17,8 @@ import {
   SectionContent,
 } from '../../../shared'
 
+import hasRole from '../../../../shared/hasRole'
+
 const updateReviewer = (proxy, { data: { reviewerResponse } }) => {
   const id = reviewerResponse.object.objectId
   const data = proxy.readQuery({
@@ -45,7 +41,7 @@ const Dashboard = ({ history, ...props }) => {
   // const uploadManuscript = upload()
   // const [conversion] = useContext(XpubContext)
 
-  const { loading, data } = useQuery(queries.dashboard)
+  const { loading, data, error } = useQuery(queries.dashboard)
   const [reviewerRespond] = useMutation(mutations.reviewerResponseMutation, {
     // variables: { currentUserId, action, teamId },
     update: updateReviewer,
@@ -65,27 +61,37 @@ const Dashboard = ({ history, ...props }) => {
   })
 
   if (loading) return <Spinner />
-
+  if (error) return error
   const dashboard = (data && data.manuscripts) || []
   const currentUser = data && data.currentUser
 
+  const mySubmissions = dashboard.filter(submission =>
+    hasRole(submission, 'author'),
+  )
+
+  const toReview = dashboard.filter(submission =>
+    hasRole(submission, 'reviewer'),
+  )
+
+  const manuscriptsImEditorOf = dashboard.filter(submission =>
+    hasRole(submission, ['seniorEditor', 'handlingEditor']),
+  )
+
   return (
     <Container>
       <HeadingWithAction>
         <Heading>Dashboard</Heading>
         <Button onClick={() => history.push('/journal/newSubmission')} primary>
-          {/* <Icon>plus</Icon> */}+ New submission
+          + New submission
         </Button>
       </HeadingWithAction>
 
-      {!dashboard.length && <Section>Nothing to do at the moment.</Section>}
-      {/* <Authorize object={dashboard} operation="can view my submission section"> */}
-      {dashboard.length > 0 ? (
-        <SectionContent>
-          <SectionHeader>
-            <Title>My Submissions</Title>
-          </SectionHeader>
-          {dashboard.map(submission => (
+      <SectionContent>
+        <SectionHeader>
+          <Title>My Submissions</Title>
+        </SectionHeader>
+        {dashboard.length > 0 ? (
+          mySubmissions.map(submission => (
             <SectionRow key={`submission-${submission.id}`}>
               <OwnerItem
                 deleteManuscript={() =>
@@ -97,18 +103,17 @@ const Dashboard = ({ history, ...props }) => {
                 version={submission}
               />
             </SectionRow>
-          ))}
-        </SectionContent>
-      ) : null}
-      {/* </Authorize>
-      <Authorize object={dashboard} operation="can view review section"> */}
-      {dashboard.length > 0 ? (
-        <SectionContent>
-          <SectionHeader>
-            <Title>To Review</Title>
-          </SectionHeader>
-
-          {dashboard.map(review => (
+          ))
+        ) : (
+          <Placeholder>You have not submitted any manuscripts yet</Placeholder>
+        )}
+      </SectionContent>
+      <SectionContent>
+        <SectionHeader>
+          <Title>To Review</Title>
+        </SectionHeader>
+        {toReview.length > 0 ? (
+          toReview.map(review => (
             <SectionRow key={review.id}>
               <ReviewerItem
                 currentUser={currentUser}
@@ -117,25 +122,30 @@ const Dashboard = ({ history, ...props }) => {
                 version={review}
               />
             </SectionRow>
-          ))}
-        </SectionContent>
-      ) : null}
-      {/* </Authorize> */}
+          ))
+        ) : (
+          <Placeholder>You have not been assigned any reviews yet</Placeholder>
+        )}
+      </SectionContent>
 
-      {/* <Authorize object={dashboard} operation="can view my manuscripts section"> */}
-      {dashboard.length > 0 ? (
-        <SectionContent>
-          <SectionHeader>
-            <Title>Manuscripts I'm editor of</Title>
-          </SectionHeader>
-          {dashboard.map(manuscript => (
+      <SectionContent>
+        <SectionHeader>
+          <Title>Manuscripts I&apos;m editor of</Title>
+        </SectionHeader>
+        {manuscriptsImEditorOf.length > 0 ? (
+          manuscriptsImEditorOf.map(manuscript => (
             <SectionRow key={`manuscript-${manuscript.id}`}>
               <EditorItem version={manuscript} />
             </SectionRow>
-          ))}
-        </SectionContent>
-      ) : null}
-      {/* </Authorize> */}
+          ))
+        ) : (
+          <SectionRow>
+            <Placeholder>
+              You are not an editor of any manuscript yet
+            </Placeholder>
+          </SectionRow>
+        )}
+      </SectionContent>
     </Container>
   )
 }
diff --git a/app/components/component-dashboard/src/components/Reviews.js b/app/components/component-dashboard/src/components/Reviews.js
index 5a70702a70d667910401e01fc0fe27555c37d599..ea24946941be15da7ddbe5242bc22baa9bda2be6 100644
--- a/app/components/component-dashboard/src/components/Reviews.js
+++ b/app/components/component-dashboard/src/components/Reviews.js
@@ -1,9 +1,9 @@
 import React from 'react'
 import styled from 'styled-components'
 import { sumBy } from 'lodash'
-import { JournalContext } from '../../../xpub-journal'
 import { Badge } from '@pubsweet/ui'
 import { th } from '@pubsweet/ui-toolkit'
+import { JournalContext } from '../../../xpub-journal'
 
 const Root = styled.div`
   display: inline-flex;
@@ -29,7 +29,7 @@ const getUserFromTeam = (version, role) => {
 }
 
 const countStatus = (version, status) => {
-  const teamMember = getUserFromTeam(version, 'reviewerEditor')
+  const teamMember = getUserFromTeam(version, 'reviewer')
 
   if (status === 'rejected' || status === 'invited') {
     return sumBy(teamMember, member => (member.status === status ? 1 : 0))
diff --git a/app/components/component-dashboard/src/components/sections/EditorItem.js b/app/components/component-dashboard/src/components/sections/EditorItem.js
index a5b965f2c503e6d139c688c380cccb3c790519d2..dcc6d539ea3deaf6f1b557d0fd67f990d67210d4 100644
--- a/app/components/component-dashboard/src/components/sections/EditorItem.js
+++ b/app/components/component-dashboard/src/components/sections/EditorItem.js
@@ -1,9 +1,7 @@
 import React from 'react'
-
 import styled from 'styled-components'
-// import Authorize from 'pubsweet-client/src/helpers/Authorize'
 import { Action, ActionGroup } from '@pubsweet/ui'
-import { Item, Header, Body, StatusBadge } from '../../style'
+import { Item, StatusBadge } from '../../style'
 import Meta from '../metadata/Meta'
 import MetadataSections from '../metadata/MetadataSections'
 import MetadataType from '../metadata/MetadataType'
diff --git a/app/components/component-dashboard/src/components/sections/OwnerItem.js b/app/components/component-dashboard/src/components/sections/OwnerItem.js
index 0fb2012fcb0e85eda8b2a511e89bb6e317ff314b..9fb9fb2c4bdbeb04641f34d3235721cdf8f914b5 100644
--- a/app/components/component-dashboard/src/components/sections/OwnerItem.js
+++ b/app/components/component-dashboard/src/components/sections/OwnerItem.js
@@ -1,10 +1,6 @@
 import React from 'react'
-import { pickBy } from 'lodash'
-
 import { Action, ActionGroup } from '@pubsweet/ui'
-// import Authorize from 'pubsweet-client/src/helpers/Authorize'
-
-import { Item, Header, Body, StatusBadge } from '../../style'
+import { Item, StatusBadge } from '../../style'
 import VersionTitle from './VersionTitle'
 
 const OwnerItem = ({ version, journals, deleteManuscript }) => {
@@ -30,33 +26,18 @@ const OwnerItem = ({ version, journals, deleteManuscript }) => {
     ),
   }
 
-  const unauthorized = (
-    <ActionGroup>
-      {Object.values(pickBy(actionButtons, (value, key) => key !== 'delete'))}
-    </ActionGroup>
-  )
-
-  const actions = (
-    // <Authorize
-    //   object={version}
-    //   operation="can delete manuscript"
-    //   unauthorized={unauthorized}
-    // >
-    <ActionGroup>{Object.values(actionButtons)}</ActionGroup>
-    // </Authorize>
-  )
+  const actions = <ActionGroup>{Object.values(actionButtons)}</ActionGroup>
 
   return (
-    // <Authorize object={[version]} operation="can view my submission section">
     <Item>
       <div>
         {' '}
         <StatusBadge minimal status={version.status} />
+        {JSON.stringify(version._currentRoles)}
         <VersionTitle version={version} />
       </div>
       {actions}
     </Item>
-    // </Authorize>
   )
 }
 
diff --git a/app/components/component-dashboard/src/components/sections/ReviewerItem.js b/app/components/component-dashboard/src/components/sections/ReviewerItem.js
index 344c1bfaae713d10ff07c3c570930f7865096902..d2fa115295cfd673c9e8e01e02f6df329b8cba84 100644
--- a/app/components/component-dashboard/src/components/sections/ReviewerItem.js
+++ b/app/components/component-dashboard/src/components/sections/ReviewerItem.js
@@ -3,7 +3,6 @@ import { Button } from '@pubsweet/ui'
 // import Authorize from 'pubsweet-client/src/helpers/Authorize'
 import {
   Item,
-  Body,
   Divider,
   Links,
   LinkContainer,
@@ -20,7 +19,7 @@ import VersionTitle from './VersionTitle'
 
 const ReviewerItem = ({ version, journals, currentUser, reviewerRespond }) => {
   const team =
-    (version.teams || []).find(team => team.role === 'reviewerEditor') || {}
+    (version.teams || []).find(team => team.role === 'reviewer') || {}
 
   const currentMember =
     team.members &&
@@ -29,25 +28,20 @@ const ReviewerItem = ({ version, journals, currentUser, reviewerRespond }) => {
 
   // Enable that when Team Models is updated
   // const { status } =
-  //   getUserFromTeam(version, 'reviewerEditor').filter(
+  //   getUserFromTeam(version, 'reviewer').filter(
   //     member => member.id === currentUser.id,
   //   )[0] || {}
 
-  const review =
-    (version.reviews || []).find(
-      review =>
-        currentUser &&
-        review.user &&
-        review.user.id === currentUser.id &&
-        !review.isDecision,
-    ) || {}
+  // const review =
+  //   (version.reviews || []).find(
+  //     review =>
+  //       currentUser &&
+  //       review.user &&
+  //       review.user.id === currentUser.id &&
+  //       !review.isDecision,
+  //   ) || {}
 
   return (
-    // <Authorize
-    //   key={`${review.id}`}
-    //   object={[version]}
-    //   operation="can view review section"
-    // >
     <Item>
       <VersionTitle version={version} />
 
@@ -101,7 +95,6 @@ const ReviewerItem = ({ version, journals, currentUser, reviewerRespond }) => {
       )}
       {status === 'rejected' && 'rejected'}
     </Item>
-    // </Authorize>
   )
 }
 
diff --git a/app/components/component-dashboard/src/graphql/queries/index.js b/app/components/component-dashboard/src/graphql/queries/index.js
index 86cf636dfb4e1f90a57a84030dffee966be88164..1b45a6149ad022cf6d15961d793e6e9f506e7d68 100644
--- a/app/components/component-dashboard/src/graphql/queries/index.js
+++ b/app/components/component-dashboard/src/graphql/queries/index.js
@@ -59,6 +59,7 @@ export default {
             date
           }
         }
+        _currentRoles @client
       }
     }
   `,
diff --git a/app/components/component-dashboard/src/style.js b/app/components/component-dashboard/src/style.js
index da125ae71d89f1d274aba4fb617aefc0b5b5cb4e..a26994e622dc676cb09a5e561ae11289cfed7049 100644
--- a/app/components/component-dashboard/src/style.js
+++ b/app/components/component-dashboard/src/style.js
@@ -76,3 +76,11 @@ export const HeadingWithAction = styled.div`
 `
 
 export { StatusBadge } from '../../shared'
+
+export const Placeholder = styled.div`
+  display: grid;
+  place-items: center;
+  color: ${th('colorTextPlaceholder')};
+  height: 100%;
+  padding: 4em;
+`
diff --git a/app/components/component-formbuilder/src/components/FormBuilderPage.js b/app/components/component-formbuilder/src/components/FormBuilderPage.js
index 57c20bb5a80f40658b4f3cb38418e76f26360ea3..9cfb45edbf88a31a577329ef35ea428ac5dfa572 100644
--- a/app/components/component-formbuilder/src/components/FormBuilderPage.js
+++ b/app/components/component-formbuilder/src/components/FormBuilderPage.js
@@ -1,5 +1,5 @@
 import { compose, withState, withHandlers, withProps } from 'recompose'
-import { graphql } from '@apollo/react-hoc'
+import { graphql } from '@apollo/client/react/hoc'
 import gql from 'graphql-tag'
 import { withLoader } from 'pubsweet-client'
 
diff --git a/app/components/component-formbuilder/src/components/builderComponents/Menu.js b/app/components/component-formbuilder/src/components/builderComponents/Menu.js
index f1b66b0c532a4d6c5e90d085daa6b6b4307a7197..f57c02e427b6dea710d464d18388785c606680b6 100644
--- a/app/components/component-formbuilder/src/components/builderComponents/Menu.js
+++ b/app/components/component-formbuilder/src/components/builderComponents/Menu.js
@@ -1,4 +1,4 @@
-import React, { useState } from 'react'
+import React from 'react'
 import { Select, TextField, ValidatedFieldFormik } from '@pubsweet/ui'
 // import { compose, withState, withHandlers } from 'recompose'
 import { Legend, Section } from '../styles'
diff --git a/app/components/component-login/src/Login.jsx b/app/components/component-login/src/Login.jsx
index dab9a14201a4eb806691b39b532ff2d2b730251d..9fd99f091f431bfbd4b8bbba646a120f0c80cc52 100644
--- a/app/components/component-login/src/Login.jsx
+++ b/app/components/component-login/src/Login.jsx
@@ -7,6 +7,7 @@ import { th, grid, lighten } from '@pubsweet/ui-toolkit'
 import { CenteredColumn, H1, Button } from '@pubsweet/ui'
 import styled from 'styled-components'
 import { Section } from '../../shared'
+import { Placeholder } from '../../component-chat/src/Messages/style'
 
 const getNextUrl = () => {
   const url = new URL(window.location.href)
@@ -56,7 +57,11 @@ const LoginButton = styled(Button)`
 
 // TODO: Shared?
 const Container = styled.div`
-  background: linear-gradient(134deg, ${th('colorPrimary')}, ${lighten('colorPrimary', 0.3)});
+  background: linear-gradient(
+    134deg,
+    ${th('colorPrimary')},
+    ${lighten('colorPrimary', 0.3)}
+  );
   height: 100vh;
   display: grid;
   place-items: center;
@@ -66,35 +71,39 @@ const Content = styled.div`
   border-radius: ${th('borderRadius')};
   box-shadow: ${th('boxShadow')};
   padding: ${grid(4)};
-  max-width: 30em;
+  max-width: 40em;
   background: ${th('colorBackground')};
   text-align: center;
 
   h1 {
     margin-bottom: ${grid(2)};
   }
+  margin-bottom: 1rem;
 `
 
+const Centered = styled.div`
+  text-align: center;
+`
 
-const ORCIDIcon = ({className}) => (
+const ORCIDIcon = ({ className }) => (
   <span className={className}>
-  <svg viewBox="0 0 256 256">
-    <path
-      d="M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z"
-      fill="#A6CE39"
-    />
-    <g>
-      <path d="M86.3,186.2H70.9V79.1h15.4v48.4V186.2z" fill="#FFFFFF" />
-      <path
-        d="M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5   c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z"
-        fill="#FFFFFF"
-      />
+    <svg viewBox="0 0 256 256">
       <path
-        d="M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1   C84.2,46.7,88.7,51.3,88.7,56.8z"
-        fill="#FFFFFF"
+        d="M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z"
+        fill="#A6CE39"
       />
-    </g>
-  </svg>
+      <g>
+        <path d="M86.3,186.2H70.9V79.1h15.4v48.4V186.2z" fill="#FFFFFF" />
+        <path
+          d="M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5   c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z"
+          fill="#FFFFFF"
+        />
+        <path
+          d="M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1   C84.2,46.7,88.7,51.3,88.7,56.8z"
+          fill="#FFFFFF"
+        />
+      </g>
+    </svg>
   </span>
 )
 
@@ -123,23 +132,31 @@ const Login = ({ logo = null, ...props }) => {
     return <Redirect to={redirectLink} />
   }
 
+  const journalName = config.journal.metadata.name
   return redirectLink ? (
     <Redirect to={redirectLink} />
   ) : (
     <Container>
-      <Content>
-      <H1>Login to Kotahi</H1>
-
-          Kotahi uses ORCID <StyledORCIDIcon /> to identify authors and staff. Login with your
-          ORCID account below or{' '}
+      <Centered>
+        <Content>
+          {journalName === 'Aperture' && (
+            <img src="/public/logo-aperture.png" />
+          )}
+          <H1>Login to {journalName}</H1>
+          {journalName} uses ORCID <StyledORCIDIcon /> to identify authors and
+          staff. Login with your ORCID account below or{' '}
           <a href="https://orcid.org/signin">register at the ORCID website.</a>
-        <LoginButton onClick={() => window.location = "/auth/orcid"} primary>
-          Login with ORCID
-        </LoginButton>
-      </Content>
-
+          <LoginButton
+            onClick={() => (window.location = '/auth/orcid')}
+            primary
+          >
+            Login with ORCID
+          </LoginButton>
+        </Content>
+        <div>Powered by Kotahi</div>
+      </Centered>
     </Container>
   )
 }
 
-export default Login
\ No newline at end of file
+export default Login
diff --git a/app/components/component-manuscript/src/components/Manuscript.js b/app/components/component-manuscript/src/components/Manuscript.js
index a939e8ae2a7ae8a91ee0402b33862df1c70eace9..1cdbedf59e8dba9586c85f958f1d7b081a6f4102 100644
--- a/app/components/component-manuscript/src/components/Manuscript.js
+++ b/app/components/component-manuscript/src/components/Manuscript.js
@@ -7,9 +7,9 @@ import Wax from '../../../wax-collab/src/Editoria'
 import MessageContainer from '../../../component-chat/src'
 import { Spinner } from '../../../shared'
 
-const options = {
-  //  schema: new CreateSchema(XpubSchema),
-}
+// const options = {
+//   //  schema: new CreateSchema(XpubSchema),
+// }
 
 const Info = styled.span`
   padding: 0;
diff --git a/app/components/component-manuscript/src/components/ManuscriptPage.js b/app/components/component-manuscript/src/components/ManuscriptPage.js
index 39387f32b092fbca0da81276b225aebd08a28eef..2d1847f503119b2b5ea93811d549324d4b1a34c1 100644
--- a/app/components/component-manuscript/src/components/ManuscriptPage.js
+++ b/app/components/component-manuscript/src/components/ManuscriptPage.js
@@ -1,5 +1,5 @@
 import { compose, withProps } from 'recompose'
-import { graphql } from '@apollo/react-hoc'
+import { graphql } from '@apollo/client/react/hoc'
 import gql from 'graphql-tag'
 import { withLoader } from 'pubsweet-client'
 
diff --git a/app/components/component-manuscripts/src/Manuscript.jsx b/app/components/component-manuscripts/src/Manuscript.jsx
index 95493e7e2e6b66e6edc164e2ede0698991555261..40ee291243c384716a9050955d278d038e398612 100644
--- a/app/components/component-manuscripts/src/Manuscript.jsx
+++ b/app/components/component-manuscripts/src/Manuscript.jsx
@@ -1,6 +1,6 @@
 import React from 'react'
 import gql from 'graphql-tag'
-import { useMutation } from '@apollo/react-hooks'
+import { useMutation } from '@apollo/client'
 // import { Action } from '@pubsweet/ui'
 import { UserAvatar } from '../../component-avatar/src'
 import {
@@ -11,9 +11,9 @@ import {
   Primary,
   Secondary,
   UserInfo,
-  SuccessStatus,
-  ErrorStatus,
-  NormalStatus,
+  // SuccessStatus,
+  // ErrorStatus,
+  // NormalStatus,
   UserAction as Action,
   StatusBadge,
 } from './style'
@@ -26,15 +26,12 @@ const DELETE_MANUSCRIPT = gql`
   }
 `
 
-
 const User = ({ manuscript }) => {
   const [deleteManuscript] = useMutation(DELETE_MANUSCRIPT)
 
   return (
     <Row>
-      <Cell>
-        {manuscript.meta && manuscript.meta.title}
-      </Cell>
+      <Cell>{manuscript.meta && manuscript.meta.title}</Cell>
       <Cell>{convertTimestampToDate(manuscript.created)}</Cell>
       <Cell>
         <StatusBadge status={manuscript.status} />
@@ -46,7 +43,8 @@ const User = ({ manuscript }) => {
             <UserInfo>
               <Primary>{manuscript.submitter.defaultIdentity.name}</Primary>
               <Secondary>
-                {manuscript.submitter.email || `(${manuscript.submitter.username})`}
+                {manuscript.submitter.email ||
+                  `(${manuscript.submitter.username})`}
               </Secondary>
             </UserInfo>
           </UserCombo>
diff --git a/app/components/component-manuscripts/src/Manuscripts.jsx b/app/components/component-manuscripts/src/Manuscripts.jsx
index f3d89a8d8efebf2d252851ec5c6c2c5be33054de..dd3dee928e6f6d45e9e95c9b37c98c6e438ca810 100644
--- a/app/components/component-manuscripts/src/Manuscripts.jsx
+++ b/app/components/component-manuscripts/src/Manuscripts.jsx
@@ -1,6 +1,6 @@
 import React, { useState } from 'react'
 import gql from 'graphql-tag'
-import { useQuery } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 
 import Manuscript from './Manuscript'
 import {
diff --git a/app/components/component-manuscripts/src/style.js b/app/components/component-manuscripts/src/style.js
index 6f5c40a4ad1d19e7d5b8fbd2c6ae15dd96d24505..6b132297686c80cfa6838379c7d6038ddbf4155f 100644
--- a/app/components/component-manuscripts/src/style.js
+++ b/app/components/component-manuscripts/src/style.js
@@ -1,6 +1,5 @@
 import styled from 'styled-components'
 import { Action } from '@pubsweet/ui'
-import { th, grid } from '@pubsweet/ui-toolkit'
 
 export {
   Row,
diff --git a/app/components/component-profile/src/ChangeUsername.jsx b/app/components/component-profile/src/ChangeUsername.jsx
index ea707cca30d53ca3a4b0f81e695661779c9a4397..6c981758d7d287104baa484b98804e245b2693e8 100644
--- a/app/components/component-profile/src/ChangeUsername.jsx
+++ b/app/components/component-profile/src/ChangeUsername.jsx
@@ -1,7 +1,7 @@
 import React, { useState } from 'react'
 import PropTypes from 'prop-types'
 import gql from 'graphql-tag'
-import { useMutation } from '@apollo/react-hooks'
+import { useMutation } from '@apollo/client'
 import { TextField, Button } from '@pubsweet/ui'
 import { th } from '@pubsweet/ui-toolkit'
 import styled from 'styled-components'
diff --git a/app/components/component-profile/src/Profile.jsx b/app/components/component-profile/src/Profile.jsx
index 957788567f94c52a5a6d3681283dffa57616cadd..a137940b612b238a9e0cd3986bba83dadf09d2be 100644
--- a/app/components/component-profile/src/Profile.jsx
+++ b/app/components/component-profile/src/Profile.jsx
@@ -3,7 +3,7 @@ import { Button, Action } from '@pubsweet/ui'
 // import { th } from '@pubsweet/ui-toolkit'
 // import styled from 'styled-components'
 import gql from 'graphql-tag'
-import { useQuery } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 import { useDropzone } from 'react-dropzone'
 
 import { Spinner } from '../../shared'
diff --git a/app/components/component-profile/src/index.js b/app/components/component-profile/src/index.js
index a09beba600af3781eae8ceff3b005052aa5fc878..fbc20f8175866145074b6fb581e819ae373ddcdd 100644
--- a/app/components/component-profile/src/index.js
+++ b/app/components/component-profile/src/index.js
@@ -1,2 +1,3 @@
 import Profile from './Profile'
+
 export { Profile }
diff --git a/app/components/component-review/src/components/DecisionPage.js b/app/components/component-review/src/components/DecisionPage.js
index 9e532ee08eb41b0f5064d8d1aa4db54a33d4426e..a157147ae6ab7a55917164b2bf302bc1b679fd41 100644
--- a/app/components/component-review/src/components/DecisionPage.js
+++ b/app/components/component-review/src/components/DecisionPage.js
@@ -3,8 +3,7 @@ import moment from 'moment'
 
 import { Tabs } from '@pubsweet/ui'
 import { Formik } from 'formik'
-import gql from 'graphql-tag'
-import { useMutation, useQuery } from '@apollo/react-hooks'
+import { useMutation, useQuery, gql } from '@apollo/client'
 import DecisionForm from './decision/DecisionForm'
 import DecisionReviews from './decision/DecisionReviews'
 import AssignEditorsReviewers from './assignEditors/AssignEditorsReviewers'
@@ -12,7 +11,7 @@ import AssignEditor from './assignEditors/AssignEditor'
 import ReviewMetadata from './metadata/ReviewMetadata'
 import Decision from './decision/Decision'
 // import EditorSection from './EditorSection'
-import { AdminSection, Columns, Manuscript, Chat, TabsContainer } from './style'
+import { AdminSection, Columns, Manuscript, Chat } from './style'
 
 // const addEditor = (manuscript, label) => ({
 //   content: <EditorSection manuscript={manuscript} />,
@@ -161,20 +160,20 @@ const uploadReviewFilesMutation = gql`
   }
 `
 
-const createFileMutation = gql`
-  mutation($file: Upload!) {
-    createFile(file: $file) {
-      id
-      created
-      label
-      filename
-      fileType
-      mimeType
-      size
-      url
-    }
-  }
-`
+// const createFileMutation = gql`
+//   mutation($file: Upload!) {
+//     createFile(file: $file) {
+//       id
+//       created
+//       label
+//       filename
+//       fileType
+//       mimeType
+//       size
+//       url
+//     }
+//   }
+// `
 
 const makeDecisionMutation = gql`
   mutation($id: ID!, $decision: String) {
@@ -185,28 +184,28 @@ const makeDecisionMutation = gql`
   }
 `
 
-const updateCacheForFileCreation = (proxy, { data: { createFile } }) => {
-  const data = proxy.readQuery({
-    query,
-    variables: {
-      id: match.params.version,
-    },
-  })
-
-  data.manuscript.reviews.map(review => {
-    if (review.id === file.objectId) {
-      review.comments.map(comment => {
-        if (comment.type === createFile.fileType) {
-          comment.files = [createFile]
-        }
-        return comment
-      })
-    }
-    return review
-  })
-
-  proxy.writeQuery({ query, data })
-}
+// const updateCacheForFileCreation = (proxy, { data: { createFile } }) => {
+//   const data = proxy.readQuery({
+//     query,
+//     variables: {
+//       id: match.params.version,
+//     },
+//   })
+
+//   data.manuscript.reviews.map(review => {
+//     if (review.id === file.objectId) {
+//       review.comments.map(comment => {
+//         if (comment.type === createFile.fileType) {
+//           comment.files = [createFile]
+//         }
+//         return comment
+//       })
+//     }
+//     return review
+//   })
+
+//   proxy.writeQuery({ query, data })
+// }
 
 // const createFile = file => {
 
@@ -280,17 +279,17 @@ const decisionSections = ({
   return decisionSections
 }
 
-const editorSections = ({ manuscript }) => {
-  const editorSections = []
-  const manuscriptVersions = manuscript.manuscriptVersions || []
-  manuscriptVersions.forEach(manuscript => {
-    editorSections.push(addEditor(manuscript, dateLabel(manuscript.updated)))
-  }, [])
+// const editorSections = ({ manuscript }) => {
+//   const editorSections = []
+//   const manuscriptVersions = manuscript.manuscriptVersions || []
+//   manuscriptVersions.forEach(manuscript => {
+//     editorSections.push(addEditor(manuscript, dateLabel(manuscript.updated)))
+//   }, [])
 
-  if (manuscript.status !== 'revising') {
-    editorSections.push(addEditor(manuscript, dateLabel()))
-  }
-}
+//   if (manuscript.status !== 'revising') {
+//     editorSections.push(addEditor(manuscript, dateLabel()))
+//   }
+// }
 
 const DecisionPage = ({ match }) => {
   // Hooks from the old world
@@ -312,7 +311,7 @@ const DecisionPage = ({ match }) => {
   if (loading) return <Spinner />
   if (error) return `Error! ${error.message}`
 
-  const manuscript = data.manuscript
+  const { manuscript } = data
 
   // Protect if channels don't exist for whatever reason
   let channelId
@@ -326,15 +325,15 @@ const DecisionPage = ({ match }) => {
         file,
       },
     }).then(({ data }) => {
-      const newFile = {
-        url: data.upload.url,
-        filename: file.name,
-        size: file.size,
-        object: 'Review',
-        objectId: updateReview.id,
-        fileType: type,
-      }
-      createFile(newFile)
+      // const newFile = {
+      //   url: data.upload.url,
+      //   filename: file.name,
+      //   size: file.size,
+      //   object: 'Review',
+      //   objectId: updateReview.id,
+      //   fileType: type,
+      // }
+      // createFile(newFile)
     })
 
   const updateReview = (data, file) => {
diff --git a/app/components/component-review/src/components/ReviewPage.js b/app/components/component-review/src/components/ReviewPage.js
index 0acc2b86393b5c5387175031afeebbf782cb053c..99cb6ff80f674da0003f56d42e6b57b74f988944 100644
--- a/app/components/component-review/src/components/ReviewPage.js
+++ b/app/components/component-review/src/components/ReviewPage.js
@@ -1,9 +1,7 @@
 import React from 'react'
-// import { compose, withProps } from 'recompose'
-import { useMutation, useQuery } from '@apollo/react-hooks'
+import { useMutation, useQuery } from '@apollo/client'
 import gql from 'graphql-tag'
 import { Formik } from 'formik'
-// import { withLoader } from 'pubsweet-client'
 import { cloneDeep } from 'lodash'
 import { getCommentContent } from './review/util'
 import ReviewLayout from '../components/review/ReviewLayout'
@@ -191,7 +189,7 @@ export default ({ match, ...props }) => {
   const [updateReviewMutation] = useMutation(updateReviewMutationQuery)
 
   // File upload
-  const [uploadReviewFiles] = useMutation(uploadReviewFilesMutation)
+  // const [uploadReviewFiles] = useMutation(uploadReviewFilesMutation)
 
   const [updateTeam] = useMutation(updateTeamMutation)
 
@@ -235,7 +233,7 @@ export default ({ match, ...props }) => {
   if (loading) return <Spinner />
   if (error) return `Error! ${error.message}`
 
-  const manuscript = data.manuscript
+  const { manuscript } = data
   const channelId = manuscript.channels.find(c => c.type === 'editorial').id
 
   const review =
@@ -245,10 +243,11 @@ export default ({ match, ...props }) => {
       )) ||
     {}
 
+  // eslint-disable-next-line
   const status = (
     (
-      (manuscript.teams.find(team => team.role === 'reviewerEditor') || {})
-        .status || []
+      (manuscript.teams.find(team => team.role === 'reviewer') || {}).status ||
+      []
     ).find(status => status.user === currentUser.id) || {}
   ).status
 
@@ -311,7 +310,7 @@ export default ({ match, ...props }) => {
 
   const completeReview = history => {
     const team = cloneDeep(manuscript.teams).find(
-      team => team.role === 'reviewerEditor',
+      team => team.role === 'reviewer',
     )
     team.members = team.members.map(m => {
       if (m.user.id === currentUser.id) {
@@ -434,7 +433,7 @@ export default ({ match, ...props }) => {
 //   ) || {},
 // status: (
 //   (
-//     (manuscript.teams.find(team => team.role === 'reviewerEditor') || {})
+//     (manuscript.teams.find(team => team.role === 'reviewer') || {})
 //       .status || []
 //   ).find(status => status.user === currentUser.id) || {}
 // ).status,
@@ -495,7 +494,7 @@ export default ({ match, ...props }) => {
 //   }),
 //     completeReview: history => {
 //       const team = cloneDeep(manuscript.teams).find(
-//         team => team.role === 'reviewerEditor',
+//         team => team.role === 'reviewer',
 //       )
 //       team.members = team.members.map(m => {
 //         if (m.user.id === currentUser.id) {
diff --git a/app/components/component-review/src/components/ReviewersPage.js b/app/components/component-review/src/components/ReviewersPage.js
index f94c6319f0fffc6c2293c7ce7cc4eb36521b5eb0..6331ff1f7fb497afcc8ad5f89de5ad5bb67da522 100644
--- a/app/components/component-review/src/components/ReviewersPage.js
+++ b/app/components/component-review/src/components/ReviewersPage.js
@@ -1,6 +1,6 @@
 import { compose, withProps } from 'recompose'
 import { withFormik } from 'formik'
-import { graphql } from '@apollo/react-hoc'
+import { graphql } from '@apollo/client/react/hoc'
 import gql from 'graphql-tag'
 import { withLoader } from 'pubsweet-client'
 import { omit } from 'lodash'
@@ -142,15 +142,14 @@ const handleSubmit = (
   { user },
   { props: { manuscript, updateTeamMutation, createTeamMutation, match } },
 ) => {
-  const team =
-    manuscript.teams.find(team => team.role === 'reviewerEditor') || {}
+  const team = manuscript.teams.find(team => team.role === 'reviewer') || {}
 
   const teamAdd = {
     objectId: manuscript.id,
     objectType: 'Manuscript',
     // status: [{ user: user.id, status: 'invited' }],
-    name: 'Reviewer Editor',
-    role: 'reviewerEditor',
+    name: 'Reviewers',
+    role: 'reviewer',
     members: [{ user: { id: user.id }, status: 'invited' }],
   }
   if (team.id) {
@@ -207,7 +206,7 @@ export default compose(
       const reviewersTeam =
         teams.find(
           team =>
-            team.role === 'reviewerEditor' &&
+            team.role === 'reviewer' &&
             team.object.objectId === manuscript.id &&
             team.object.objectType === 'Manuscript',
         ) || {}
diff --git a/app/components/component-review/src/components/assignEditors/AssignEditor.js b/app/components/component-review/src/components/assignEditors/AssignEditor.js
index a7f634cd130b0888176aa0557558ff2af8e42b00..51cd4ab4d846021f406c697da7a401ad354a768d 100644
--- a/app/components/component-review/src/components/assignEditors/AssignEditor.js
+++ b/app/components/component-review/src/components/assignEditors/AssignEditor.js
@@ -3,7 +3,7 @@ import config from 'config'
 import { compose, withProps } from 'recompose'
 import { cloneDeep, get } from 'lodash'
 import { Menu } from '@pubsweet/ui'
-import { graphql } from '@apollo/react-hoc'
+import { graphql } from '@apollo/client/react/hoc'
 import gql from 'graphql-tag'
 import { withLoader } from 'pubsweet-client'
 
diff --git a/app/components/component-review/src/components/assignEditors/AssignEditor.md b/app/components/component-review/src/components/assignEditors/AssignEditor.md
deleted file mode 100644
index 49085706311761ea72d1fda712a31c5b85ccf935..0000000000000000000000000000000000000000
--- a/app/components/component-review/src/components/assignEditors/AssignEditor.md
+++ /dev/null
@@ -1,92 +0,0 @@
-A drop-down menu for assigning an editor to a project.
-
-```js
-const { JournalProvider } = require('xpub-journal')
-const journal = require('@pubsweet/styleguide/config/journal')
-
-const project = {
-  id: faker.random.uuid(),
-}
-
-const team = {
-  members: [],
-}
-
-const manuscriptTemplate = () => ({
-  id: faker.random.uuid(),
-  teams: [
-    {
-      id: faker.random.uuid(),
-      role: 'reviewerEditor',
-      name: 'reviewer',
-      object: {
-        id: faker.random.uuid(),
-        __typename: 'Manuscript',
-      },
-      objectType: 'manuscript',
-      members: [
-        {
-          user: { id: 1 },
-        },
-      ],
-    },
-  ],
-  meta: {
-    title: faker.lorem.sentence(25),
-    abstract: faker.lorem.sentence(100),
-    articleType: 'original-research',
-    declarations: {
-      openData: 'yes',
-      openPeerReview: 'no',
-      preregistered: 'yes',
-      previouslySubmitted: 'yes',
-      researchNexus: 'no',
-      streamlinedReview: 'no',
-    },
-  },
-  decision: {
-    id: faker.random.uuid(),
-    comments: [{ type: 'note', content: 'this needs review' }],
-    created: 'Thu Oct 11 2018',
-    open: false,
-    status: '<p>This is a decision</p>',
-    user: { id: 1 },
-  },
-  reviews: [
-    {
-      comments: [{ content: 'this needs review' }],
-      created: 'Thu Oct 11 2018',
-      open: false,
-      recommendation: 'revise',
-      user: { id: 1, username: 'test user' },
-    },
-  ],
-})
-
-const manuscript = Object.assign({}, manuscriptTemplate())
-
-const options = [
-  {
-    value: faker.random.uuid(),
-    label: faker.internet.userName(),
-  },
-  {
-    value: faker.random.uuid(),
-    label: faker.internet.userName(),
-  },
-  {
-    value: faker.random.uuid(),
-    label: faker.internet.userName(),
-  },
-]
-;<JournalProvider journal={journal}>
-  <AssignEditor
-    manuscript={manuscript}
-    team={team}
-    teamName="Senior Editor"
-    teamTypeName="seniorEditor"
-    options={options}
-    addUserToTeam={value => console.log(value)}
-  />
-</JournalProvider>
-```
diff --git a/app/components/component-review/src/components/assignEditors/AssignEditorsReviewers.js b/app/components/component-review/src/components/assignEditors/AssignEditorsReviewers.js
index 5add8e65bdb2a58244e20e9b0903870669c4ad7e..2d00884c20e693911712d1323049f610a334527d 100644
--- a/app/components/component-review/src/components/assignEditors/AssignEditorsReviewers.js
+++ b/app/components/component-review/src/components/assignEditors/AssignEditorsReviewers.js
@@ -1,13 +1,5 @@
 import React from 'react'
-import styled from 'styled-components'
-import { Action } from '@pubsweet/ui'
-import {
-  Roles,
-  Container,
-  SectionHeader,
-  SectionRowGrid,
-  Title,
-} from '../style'
+import { Container, SectionHeader, SectionRowGrid, Title } from '../style'
 
 const AssignEditorsReviewers = ({ manuscript, AssignEditor }) => (
   <Container>
diff --git a/app/components/component-review/src/components/decision/DecisionForm.js b/app/components/component-review/src/components/decision/DecisionForm.js
index 16e5ddaf53fc2ac8df3d5dd8b8e576588c8d0a88..b70b7f3682836669671d10164a72fcfec7262016 100644
--- a/app/components/component-review/src/components/decision/DecisionForm.js
+++ b/app/components/component-review/src/components/decision/DecisionForm.js
@@ -20,7 +20,6 @@ import {
 } from '../review/util'
 
 import {
-  AdminSection,
   Container,
   Title,
   SectionHeader,
diff --git a/app/components/component-review/src/components/decision/DecisionReviews.js b/app/components/component-review/src/components/decision/DecisionReviews.js
index 0416fbc03ac441be6e0fa2baddf97b13b6ce6a74..e889f256ac2e06777a3a760b81c09d791430145f 100644
--- a/app/components/component-review/src/components/decision/DecisionReviews.js
+++ b/app/components/component-review/src/components/decision/DecisionReviews.js
@@ -1,18 +1,17 @@
 import React from 'react'
+import { Action } from '@pubsweet/ui'
 import DecisionReview from './DecisionReview'
 import { Container, SectionHeader, SectionRow, Title } from '../style'
-import { H1, Action } from '@pubsweet/ui'
 
 // TODO: read reviewer ordinal and name from project reviewer
 // const { status } =
-//     getUserFromTeam(manuscript, 'reviewerEditor').filter(
+//     getUserFromTeam(manuscript, 'reviewer').filter(
 //       member => member.user.id === currentUser.id,
 //     )[0] || {}
 //   return status
 
 const getCompletedReviews = (manuscript, currentUser) => {
-  const team =
-    manuscript.teams.find(team => team.role === 'reviewerEditor') || {}
+  const team = manuscript.teams.find(team => team.role === 'reviewer') || {}
   if (!team.members) {
     return null
   }
diff --git a/app/components/component-review/src/components/metadata/ReviewMetadata.js b/app/components/component-review/src/components/metadata/ReviewMetadata.js
index a59f6851b053d42f2790d94f650dafc0392d68f8..25bec27634eff8829a8f23cb22c0e250db654579 100644
--- a/app/components/component-review/src/components/metadata/ReviewMetadata.js
+++ b/app/components/component-review/src/components/metadata/ReviewMetadata.js
@@ -6,13 +6,7 @@ import { Attachment } from '@pubsweet/ui'
 
 import form from '../../../../../storage/forms/submit.json'
 
-import {
-  Container,
-  Title,
-  SectionHeader,
-  SectionRow,
-  SectionRowGrid,
-} from '../style'
+import { Container, Title, SectionHeader, SectionRowGrid } from '../style'
 
 const Heading = styled.span`
   font-weight: inherit;
@@ -42,8 +36,8 @@ const Cell = styled.span`
 const getNote = (notes, type) =>
   notes.find(note => note.notesType === type) || {}
 
-const getDeclarations = (manuscript, field) =>
-  ((manuscript.meta || {}).declarations || {})[field]
+// const getDeclarations = (manuscript, field) =>
+//   ((manuscript.meta || {}).declarations || {})[field]
 
 const getSupplementaryFiles = supplementary =>
   (supplementary || []).filter(file => file.fileType === 'supplementary') || []
@@ -68,7 +62,7 @@ const ReviewMetadata = ({ manuscript: rawManuscript }) => {
   }
 
   const sortedFormElements = form.children.sort((a, b) =>
-    parseInt(a.order || '0') > parseInt(b.order | '0') ? 1 : -1,
+    parseInt(a.order || '0', 10) > parseInt(b.order || '0', 10) ? 1 : -1,
   )
 
   return (
diff --git a/app/components/component-review/src/components/metadata/ReviewMetadata.md b/app/components/component-review/src/components/metadata/ReviewMetadata.md
deleted file mode 100644
index 7666b612eec17aaec702fcc2e584472effbb85d2..0000000000000000000000000000000000000000
--- a/app/components/component-review/src/components/metadata/ReviewMetadata.md
+++ /dev/null
@@ -1,63 +0,0 @@
-Project metadata, displayed at the top of the review form.
-
-```js
-const manuscriptTemplate = () => ({
-  id: faker.random.uuid(),
-  teams: [
-    {
-      id: faker.random.uuid(),
-      role: 'reviewerEditor',
-      name: 'Reviewer',
-      object: {
-        id: faker.random.uuid(),
-        __typename: 'Manuscript',
-      },
-      objectType: 'manuscript',
-      members: [
-        {
-          user: {
-            id: 1,
-            username: 'test user',
-          },
-          status: 'accepted',
-        },
-      ],
-    },
-  ],
-  meta: {
-    title: faker.lorem.sentence(25),
-    abstract: faker.lorem.sentence(100),
-    articleType: 'original-research',
-    declarations: {
-      openData: 'yes',
-      openPeerReview: 'no',
-      preregistered: 'yes',
-      previouslySubmitted: 'yes',
-      researchNexus: 'no',
-      streamlinedReview: 'no',
-    },
-  },
-  decision: {
-    id: faker.random.uuid(),
-    comments: [{ type: 'note', content: 'this needs review' }],
-    created: 'Thu Oct 11 2018',
-    open: false,
-    status: '<p>This is a decision</p>',
-    user: { id: 1 },
-  },
-  reviews: [
-    {
-      comments: [{ content: 'this needs review' }],
-      created: 'Thu Oct 11 2018',
-      open: false,
-      recommendation: 'revise',
-      user: { id: 1, username: 'test user' },
-    },
-  ],
-})
-
-const manuscript = Object.assign({}, manuscriptTemplate(), {
-  manuscriptVersions: [manuscriptTemplate()],
-})
-;<ReviewMetadata manuscript={manuscript} />
-```
diff --git a/app/components/component-review/src/components/review/ReviewForm.js b/app/components/component-review/src/components/review/ReviewForm.js
index fe45ab10fcbb1fa8224f6885b7ffb4f623912186..9febfa9b5822f688285bbdd6efc257417066d8ff 100644
--- a/app/components/component-review/src/components/review/ReviewForm.js
+++ b/app/components/component-review/src/components/review/ReviewForm.js
@@ -1,5 +1,4 @@
 import React, { useContext } from 'react'
-import styled from 'styled-components'
 import { cloneDeep, set } from 'lodash'
 import { Field } from 'formik'
 import { NoteEditor } from 'xpub-edit'
diff --git a/app/components/component-review/src/components/review/ReviewLayout.js b/app/components/component-review/src/components/review/ReviewLayout.js
index 330e64203430d40af3a886cb309588f94301837c..df4b3d968bfdab9009f0bd07c3e9580e6034c8ba 100644
--- a/app/components/component-review/src/components/review/ReviewLayout.js
+++ b/app/components/component-review/src/components/review/ReviewLayout.js
@@ -7,7 +7,7 @@ import ReviewForm from './ReviewForm'
 import ReviewMetadata from '../metadata/ReviewMetadata'
 import Review from './Review'
 import EditorSection from '../decision/EditorSection'
-import { Columns, Manuscript, Chat, AdminSection } from '../style'
+import { Columns, Manuscript, Chat } from '../style'
 import MessageContainer from '../../../../component-chat/src'
 
 const addEditor = (manuscript, label) => ({
diff --git a/app/components/component-review/src/components/reviewers/ReviewerForm.md b/app/components/component-review/src/components/reviewers/ReviewerForm.md
deleted file mode 100644
index 28ba3f44b2e30c6e50ac6e0bf0c41100539edef3..0000000000000000000000000000000000000000
--- a/app/components/component-review/src/components/reviewers/ReviewerForm.md
+++ /dev/null
@@ -1,40 +0,0 @@
-A form for inviting a reviewer to a version of a project.
-
-```js
-const { withFormik } = require('formik')
-
-const reviewerUsers = [
-  {
-    id: faker.random.uuid(),
-    email: faker.internet.email(),
-    username: faker.internet.userName(),
-  },
-  {
-    id: faker.random.uuid(),
-    email: faker.internet.email(),
-    username: faker.internet.userName(),
-  },
-  {
-    id: faker.random.uuid(),
-    email: faker.internet.email(),
-    username: faker.internet.userName(),
-  },
-]
-
-const loadOptions = input => {
-  // TODO: filter users
-
-  return Promise.resolve({ options: reviewerUsers })
-}
-
-const ConnectedReviewerForm = withFormik({
-  initialValues: {},
-  mapPropsToValues: ({ manuscript }) => manuscript,
-  displayName: 'reviewers',
-  handleSubmit: () => {},
-})(ReviewerForm)
-;<ConnectedReviewerForm
-  loadOptions={loadOptions}
-  form={{ values: { teams: [] } }}
-/>
-```
diff --git a/app/components/component-review/src/components/reviewers/Reviewers.js b/app/components/component-review/src/components/reviewers/Reviewers.js
index 913b74086776dfb12ded6b5d719ff5785d3fc3d8..2cdf32c8c50f3683e8868ab50414cda853cd712b 100644
--- a/app/components/component-review/src/components/reviewers/Reviewers.js
+++ b/app/components/component-review/src/components/reviewers/Reviewers.js
@@ -1,7 +1,6 @@
 import React from 'react'
 import styled from 'styled-components'
 import { Link } from '@pubsweet/ui'
-import { th } from '@pubsweet/ui-toolkit'
 import ReviewerForm from './ReviewerForm'
 import { Container, PaddedContent } from '../../../../shared'
 
diff --git a/app/components/component-review/src/components/reviewers/Reviewers.md b/app/components/component-review/src/components/reviewers/Reviewers.md
deleted file mode 100644
index af59ba8a78bd87cf531da1aca607646a3701194b..0000000000000000000000000000000000000000
--- a/app/components/component-review/src/components/reviewers/Reviewers.md
+++ /dev/null
@@ -1,146 +0,0 @@
-On the reviewers page, the handling editor can:
-
-- Search users by entering a username or email address.
-- Add a user as a reviewer of this version (which also adds them as a reviewer of the project, if not already present).
-- View a list of reviewers of this version and perform actions on each reviewer.
-
-```js
-const { withFormik } = require('formik')
-const { compose, withHandlers } = require('recompose')
-const Reviewer = require('./Reviewer').default
-const ReviewerForm = require('./ReviewerForm').default
-
-const journal = {
-  id: faker.random.uuid(),
-  reviewers: [
-    {
-      id: faker.random.uuid(),
-      user: faker.random.uuid(),
-    },
-  ],
-}
-
-const manuscriptTemplate = () => ({
-  id: faker.random.uuid(),
-  teams: [
-    {
-      id: faker.random.uuid(),
-      role: 'reviewerEditor',
-      name: 'reviewer',
-      object: {
-        id: faker.random.uuid(),
-        __typename: 'Manuscript',
-      },
-      objectType: 'manuscript',
-      members: [
-        {
-          user: { id: 1 },
-        },
-      ],
-    },
-  ],
-  meta: {
-    title: faker.lorem.sentence(25),
-    abstract: faker.lorem.sentence(100),
-    articleType: 'original-research',
-    declarations: {
-      openData: 'yes',
-      openPeerReview: 'no',
-      preregistered: 'yes',
-      previouslySubmitted: 'yes',
-      researchNexus: 'no',
-      streamlinedReview: 'no',
-    },
-  },
-  decision: {
-    id: faker.random.uuid(),
-    comments: [{ type: 'note', content: 'this needs review' }],
-    created: 'Thu Oct 11 2018',
-    open: false,
-    status: '<p>This is a decision</p>',
-    user: { id: 1 },
-  },
-  reviews: [
-    {
-      comments: [{ content: 'this needs review' }],
-      created: 'Thu Oct 11 2018',
-      open: false,
-      recommendation: 'revise',
-      user: { id: 1, username: 'test user' },
-    },
-  ],
-})
-
-const manuscript = Object.assign({}, manuscriptTemplate())
-
-const reviewers = [
-  {
-    status: 'invited',
-    user: { id: 1, username: 'test user' },
-  },
-]
-
-const reviewerUsers = [
-  {
-    id: faker.random.uuid(),
-    email: faker.internet.email(),
-    username: faker.internet.userName(),
-  },
-  {
-    id: faker.random.uuid(),
-    email: faker.internet.email(),
-    username: faker.internet.userName(),
-  },
-  {
-    id: faker.random.uuid(),
-    email: faker.internet.email(),
-    username: faker.internet.userName(),
-  },
-]
-
-initialState = {
-  reviewers,
-}
-
-const ReviewerFormContainer = compose(
-  withFormik({
-    form: 'reviewers',
-    handleSubmit: ({ user }) => {
-      setState({
-        reviewers: state.reviewers.concat({
-          id: faker.random.uuid(),
-          reviewer: faker.random.uuid(),
-          events: {
-            invited: new Date().toISOString(),
-          },
-          _user: user,
-          _reviewer: {
-            ordinal: null,
-          },
-        }),
-      })
-    },
-  }),
-  withHandlers({
-    loadOptions: props => input =>
-      Promise.resolve({ options: props.reviewerUsers }),
-  }),
-)(ReviewerForm)
-
-const ReviewerContainer = withHandlers({
-  removeReviewer: props => () =>
-    setState({
-      reviewers: state.reviewers.filter(
-        reviewer => reviewer.id !== props.reviewer.id,
-      ),
-    }),
-})(Reviewer)
-;<Reviewers
-  ReviewerForm={ReviewerFormContainer}
-  Reviewer={ReviewerContainer}
-  journal={journal}
-  manuscript={manuscript}
-  reviewers={state.reviewers}
-  reviewerUsers={reviewerUsers}
-/>
-```
diff --git a/app/components/component-submit/src/components/FormTemplate.js b/app/components/component-submit/src/components/FormTemplate.js
index 23d6c95103a125efbf1b9a4a4229eda705a27b30..6baed800ae0a1e2957ab05330ddd6472879cf433 100644
--- a/app/components/component-submit/src/components/FormTemplate.js
+++ b/app/components/component-submit/src/components/FormTemplate.js
@@ -1,6 +1,5 @@
 import React from 'react'
 import styled from 'styled-components'
-import { th } from '@pubsweet/ui-toolkit'
 import { unescape, groupBy, isArray, get, set, cloneDeep } from 'lodash'
 import { FieldArray } from 'formik'
 import * as uiComponents from '@pubsweet/ui'
diff --git a/app/components/component-submit/src/components/NewSubmissionPage.jsx b/app/components/component-submit/src/components/NewSubmissionPage.jsx
index 96a65839dcbfe74e13b2316494d86e2a1dd7e067..2ce2b53f61730cc79c8d318ae341cf6313c0cdce 100644
--- a/app/components/component-submit/src/components/NewSubmissionPage.jsx
+++ b/app/components/component-submit/src/components/NewSubmissionPage.jsx
@@ -1,5 +1,5 @@
 import React from 'react'
-import { useQuery, useMutation, ApolloConsumer } from '@apollo/react-hooks'
+import { useQuery, useMutation, ApolloConsumer } from '@apollo/client'
 // import Authorize from 'pubsweet-client/src/helpers/Authorize'
 
 import config from 'config'
diff --git a/app/components/component-submit/src/components/Submit.js b/app/components/component-submit/src/components/Submit.js
index f31448cfe3e5738e0a3ac7b7b29946b1050601d1..79f7cdf9d1e12a7a7b3768caa9c3591f03f550e7 100644
--- a/app/components/component-submit/src/components/Submit.js
+++ b/app/components/component-submit/src/components/Submit.js
@@ -1,7 +1,5 @@
 import React from 'react'
-import styled from 'styled-components'
 import { Tabs } from '@pubsweet/ui'
-import { th } from '@pubsweet/ui-toolkit'
 import moment from 'moment'
 import CurrentVersion from './CurrentVersion'
 import DecisionReviewColumn from './DecisionReviewColumn'
diff --git a/app/components/component-submit/src/components/SubmitPage.js b/app/components/component-submit/src/components/SubmitPage.js
index 53814f4ee0947c7b40f0e9d7168d8eb4d098a4b6..6bd3e8adab5575cc305e712363ed75d521aafcf0 100644
--- a/app/components/component-submit/src/components/SubmitPage.js
+++ b/app/components/component-submit/src/components/SubmitPage.js
@@ -1,6 +1,6 @@
 import { debounce, cloneDeep, isEmpty, set } from 'lodash'
 import { compose, withProps, withState, withHandlers } from 'recompose'
-import { graphql } from '@apollo/react-hoc'
+import { graphql } from '@apollo/client/react/hoc'
 import gql from 'graphql-tag'
 import { withFormik } from 'formik'
 import { withLoader } from 'pubsweet-client'
diff --git a/app/components/component-teams-manager/src/components/TeamsManagerPage.js b/app/components/component-teams-manager/src/components/TeamsManagerPage.js
index 58a52ce95a69843da8618505e8b050107e7cb468..9a4c7cd09b5e6a982bbc196665cd1bc6813261ae 100644
--- a/app/components/component-teams-manager/src/components/TeamsManagerPage.js
+++ b/app/components/component-teams-manager/src/components/TeamsManagerPage.js
@@ -1,7 +1,7 @@
 import { compose } from 'recompose'
 import { omit } from 'lodash'
 import config from 'config'
-import { graphql } from '@apollo/react-hoc'
+import { graphql } from '@apollo/client/react/hoc'
 import gql from 'graphql-tag'
 
 import queries from './graphql/queries'
diff --git a/app/components/component-users-manager/src/User.jsx b/app/components/component-users-manager/src/User.jsx
index 0d6341ba0017c25159be5b1c12285c708d1cbbae..31b144cbcfbed6efb2fd052f2f7974ea21a6e66b 100644
--- a/app/components/component-users-manager/src/User.jsx
+++ b/app/components/component-users-manager/src/User.jsx
@@ -1,6 +1,6 @@
 import React from 'react'
 import gql from 'graphql-tag'
-import { useMutation } from '@apollo/react-hooks'
+import { useMutation } from '@apollo/client'
 import { Action } from '@pubsweet/ui'
 import { UserAvatar } from '../../component-avatar/src'
 import { Row, Cell, LastCell } from './style'
diff --git a/app/components/component-users-manager/src/UsersManager.jsx b/app/components/component-users-manager/src/UsersManager.jsx
index 83392a18c3d0eee04abc4bd0887dc74a60235678..5a09925c7978a4b2f0839064440df7e8c0540a9f 100644
--- a/app/components/component-users-manager/src/UsersManager.jsx
+++ b/app/components/component-users-manager/src/UsersManager.jsx
@@ -1,6 +1,6 @@
 import React, { useState } from 'react'
 import gql from 'graphql-tag'
-import { useQuery } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 // import { Heading } from '@pubsweet/ui'
 
 import User from './User'
diff --git a/app/components/wax-collab/src/EditorElements.js b/app/components/wax-collab/src/EditorElements.js
index 3bb44c3fc0a663ffca99c57ac2923846f9908f14..b4a5419d609a0da2ed28e5384ac840590e0eee40 100644
--- a/app/components/wax-collab/src/EditorElements.js
+++ b/app/components/wax-collab/src/EditorElements.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import { css } from 'styled-components'
 
 /* All styles regarding ProseMirror surface and elements */
 
diff --git a/app/components/wax-collab/src/Editoria.js b/app/components/wax-collab/src/Editoria.js
index e791dceb8bdc61498d007fe93b542332b5347078..91b2b586f155a78bde9f0ad492f0c86de778f577 100644
--- a/app/components/wax-collab/src/Editoria.js
+++ b/app/components/wax-collab/src/Editoria.js
@@ -1,22 +1,22 @@
 import React, { Fragment } from 'react'
 import { Wax } from 'wax-prosemirror-core'
-import styled, { createGlobalStyle } from 'styled-components'
+// import styled from 'styled-components'
 
 import EditoriaLayout from './EditoriaLayout'
 
 import { config } from './config'
 
-const StyledWax = styled(Wax)`
-  // .wax-surface-scroll {
-  //   height: ${props => (props.debug ? '50vh' : '100%')};
-  // }
-`
+// const StyledWax = styled(Wax)`
+//   // .wax-surface-scroll {
+//   //   height: ${props => (props.debug ? '50vh' : '100%')};
+//   // }
+// `
 
 const renderImage = file => {
   const reader = new FileReader()
-  return new Promise((accept, fail) => {
-    reader.onload = () => accept(reader.result)
-    reader.onerror = () => fail(reader.error)
+  return new Promise((resolve, reject) => {
+    reader.onload = () => resolve(reader.result)
+    reader.onerror = () => reject(reader.error)
     // Some extra delay to make the asynchronicity visible
     setTimeout(() => reader.readAsDataURL(file), 150)
   })
@@ -35,11 +35,11 @@ const Editoria = ({ content, readonly }) => (
       config={config}
       fileUpload={file => renderImage(file)}
       layout={EditoriaLayout}
-      value={content}
-      readonly={readonly}
       placeholder="Type Something..."
-      // onChange={source => console.log(source)}
+      readonly={readonly}
       user={user}
+      // onChange={source => console.log(source)}
+      value={content}
     />
   </Fragment>
 )
diff --git a/app/components/wax-collab/src/config/config.js b/app/components/wax-collab/src/config/config.js
index 22337c1901cefe8fca00c5200777c9bebb1029cb..203896dcd031bdabd62c4d15e32708ea30bc9e14 100644
--- a/app/components/wax-collab/src/config/config.js
+++ b/app/components/wax-collab/src/config/config.js
@@ -17,10 +17,10 @@ import {
   PlaceholderService,
   InlineAnnotationsService,
   LinkService,
-  ListsService,
-  ListToolGroupService,
-  TablesService,
-  TableToolGroupService,
+  // ListsService,
+  // ListToolGroupService,
+  // TablesService,
+  // TableToolGroupService,
   BaseService,
   BaseToolGroupService,
   DisplayBlockLevelService,
@@ -28,17 +28,17 @@ import {
   ImageToolGroupService,
   TextBlockLevelService,
   TextToolGroupService,
-  NoteService,
-  NoteToolGroupService,
-  TrackChangeService,
-  CommentsService,
+  // NoteService,
+  // NoteToolGroupService,
+  // TrackChangeService,
+  // CommentsService,
 } from 'wax-prosemirror-services'
 
-import _ from 'lodash'
+// import _ from 'lodash'
 import invisibles, {
-  space,
+  // space,
   hardBreak,
-  paragraph,
+  // paragraph,
 } from '@guardian/prosemirror-invisibles'
 
 // const ydoc = new Y.Doc();
diff --git a/app/components/wax-collab/src/serviceWorker.js b/app/components/wax-collab/src/serviceWorker.js
index 3c99c936831875a4a88e1dea5440c12e3826c996..35729282135819f18654d9a04881ae355335dfab 100644
--- a/app/components/wax-collab/src/serviceWorker.js
+++ b/app/components/wax-collab/src/serviceWorker.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-console */
 // This optional code is used to register a service worker.
 // register() is not called by default.
 
diff --git a/app/config/journal/article-sections.js b/app/config/journal/article-sections.js
deleted file mode 100644
index ab5c5e94d62fc58cf8bb7b12a7ac462f1ddba050..0000000000000000000000000000000000000000
--- a/app/config/journal/article-sections.js
+++ /dev/null
@@ -1,30 +0,0 @@
-export default [
-  {
-    label: 'Cognitive Psychology',
-    value: 'cognitive-psychology',
-  },
-  {
-    label: 'Social Psychology',
-    value: 'social-psychology',
-  },
-  {
-    label: 'Personality Psychology',
-    value: 'personality-psychology',
-  },
-  {
-    label: 'Developmental Psychology',
-    value: 'developmental-psychology',
-  },
-  {
-    label: 'Clinical Psychology',
-    value: 'clinical-psychology',
-  },
-  {
-    label: 'Organizational Behavior',
-    value: 'organizational-behavior',
-  },
-  {
-    label: 'Methodology and Research Practice',
-    value: 'methodology',
-  },
-]
diff --git a/app/config/journal/declarations.js b/app/config/journal/declarations.js
deleted file mode 100644
index dca117515f29e1b3a1da05eda8390dbdabb6de2b..0000000000000000000000000000000000000000
--- a/app/config/journal/declarations.js
+++ /dev/null
@@ -1,101 +0,0 @@
-export default {
-  questions: [
-    {
-      id: 'openData',
-      legend: 'Data is open ?',
-      options: [
-        {
-          label: 'Yes',
-          value: 'yes',
-        },
-        {
-          label: 'No/Not Applicable',
-          value: 'no',
-        },
-      ],
-      description:
-        'The journal requires data be openly available, and our full policy is <a href="https://www.collabra.org/about/editorialpolicies/#open-data-open-analytic-methods-code-and-research-materials-transparency" target="_blank">here</a>. If you have exceptions that need to be considered, please click "No" and explain in your cover letter below. Please click N/A if your submission does not feature data.',
-    },
-    {
-      id: 'previouslySubmitted',
-      legend: 'Previously submitted ?',
-      options: [
-        {
-          label: 'Yes',
-          value: 'yes',
-        },
-        {
-          label: 'No',
-          value: 'no',
-        },
-      ],
-      description:
-        'Provide further details in your cover letter below, if necessary.',
-    },
-    {
-      id: 'openPeerReview',
-      legend: 'Open peer review ?',
-      options: [
-        {
-          label: 'Yes',
-          value: 'yes',
-        },
-        {
-          label: 'No',
-          value: 'no',
-        },
-      ],
-      description:
-        'Please read a description of our <a href="https://www.collabra.org/about/editorialpolicies/#open-peer-review" target="_blank">“Open Review”</a> option and select “Yes” if you choose this process.',
-    },
-    {
-      id: 'streamlinedReview',
-      legend: 'Streamlined review ?',
-      options: [
-        {
-          label: 'Yes',
-          value: 'yes',
-        },
-        {
-          label: 'No',
-          value: 'no',
-        },
-      ],
-      description:
-        'Please read a description of our <a href="https://www.collabra.org/about/editorialpolicies/#streamlined-review" target="_blank">“Streamlined Review”</a> option and select “Yes” if you choose this process. If “Yes”, please upload your ported decision letter and reviews as “Supplementary Files” below, clearly labeled.',
-    },
-    {
-      id: 'researchNexus',
-      legend:
-        'Submitted as part of the <a href="https://www.collabra.org/collections/special/" target="_blank">research nexus</a> ?',
-      options: [
-        {
-          label: 'Yes',
-          value: 'yes',
-        },
-        {
-          label: 'No',
-          value: 'no',
-        },
-      ],
-      description:
-        'If yes, mention the name of the Research Nexus in your cover letter below.',
-    },
-    {
-      id: 'preregistered',
-      legend: 'Pre-registered ?',
-      options: [
-        {
-          label: 'Yes',
-          value: 'yes',
-        },
-        {
-          label: 'No',
-          value: 'no',
-        },
-      ],
-      description:
-        'If any or all elements of your study have been pre-registered, click yes and ensure details are in the Acknowledgements section of your manuscript, following these <a href="https://www.collabra.org/about/editorialpolicies/#preregistration-of-studies-and-analysis-plans" target="_blank">guidelines</a>.',
-    },
-  ],
-}
diff --git a/app/config/journal/editors.js b/app/config/journal/editors.js
deleted file mode 100644
index 9c2affbc43fbe73e0b011e8d2a715d27581f35c1..0000000000000000000000000000000000000000
--- a/app/config/journal/editors.js
+++ /dev/null
@@ -1,32 +0,0 @@
-export default {
-  handlingEditor: [
-    {
-      name: 'Handling Editor One',
-      user: 5,
-    },
-    {
-      name: 'Handling Editor Two',
-      user: 6,
-    },
-  ],
-  managingEditor: [
-    {
-      name: 'Managing Editor One',
-      user: 1,
-    },
-    {
-      name: 'Managing Editor Two',
-      user: 2,
-    },
-  ],
-  seniorEditor: [
-    {
-      name: 'Senior Editor One',
-      user: 3,
-    },
-    {
-      name: 'Senior Editor Two',
-      user: 4,
-    },
-  ],
-}
diff --git a/app/config/journal/index.js b/app/config/journal/index.js
deleted file mode 100644
index bace9afc1f05303ab256c4582c0cedc8b1ac9f00..0000000000000000000000000000000000000000
--- a/app/config/journal/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-export { default as metadata } from './metadata'
-export { default as declarations } from './declarations'
-export { default as decisions } from './decisions'
-export { default as recommendations } from './recommendations'
-export { default as sections } from './sections'
-export { default as articleSections } from './article-sections'
-export { default as articleTypes } from './article-types'
-export { default as editors } from './editors'
-export { default as roles } from './roles'
-export { default as reviewStatus } from './review-status'
-export { default as notes } from './submit-notes'
-export { default as supplementary } from './supplementary'
diff --git a/app/config/journal/metadata.js b/app/config/journal/metadata.js
deleted file mode 100644
index bdb2ef3289a660810bd39e48102d350d6667173b..0000000000000000000000000000000000000000
--- a/app/config/journal/metadata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export default {
-  issn: '0000-0001',
-  name: 'SimpleJ',
-}
diff --git a/app/config/journal/review-status.js b/app/config/journal/review-status.js
deleted file mode 100644
index fd8c98ac00f8dadbeaf93e619bc26499ab95c7b6..0000000000000000000000000000000000000000
--- a/app/config/journal/review-status.js
+++ /dev/null
@@ -1 +0,0 @@
-export default ['invited', 'accepted', 'rejected', 'completed']
diff --git a/app/globals.js b/app/globals.js
index 0135d12727193960a9d932afe202bfdffb303f6e..27fc9489ae164c585d255838dffbf1e2c5e390c1 100644
--- a/app/globals.js
+++ b/app/globals.js
@@ -12,6 +12,7 @@ export const hexa = (hex, alpha) => {
   return `rgb(${r}, ${g}, ${b})`
 }
 
+// eslint-disable-next-line func-names
 export const zIndex = new (function() {
   // Write down a camel-cased element descriptor as the name (e.g. modal or chatInput).
   // Define at a component level here, then use math to handle order at a local level.
diff --git a/app/graphql/index.js b/app/graphql/index.js
deleted file mode 100644
index b980b81b6a6225ecbaa97d7ccc6576e7243d1afa..0000000000000000000000000000000000000000
--- a/app/graphql/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// TODO: Combine this with app/queries/index
-
-import gql from 'graphql-tag'
-
-export default {
-  currentUser: gql`
-    {
-      currentUser {
-        id
-        username
-        admin
-        profilePicture
-        defaultIdentity {
-          aff
-          name
-        }
-      }
-    }
-  `,
-}
diff --git a/app/hooks/useCurrentUser.js b/app/hooks/useCurrentUser.js
index 5a5ec77ce07fd2d226772200140dc16e0c81074f..6477060da8aa262b9b05798792ebe0205ab33c9b 100644
--- a/app/hooks/useCurrentUser.js
+++ b/app/hooks/useCurrentUser.js
@@ -1,4 +1,4 @@
-import { useQuery } from '@apollo/react-hooks'
+import { useQuery } from '@apollo/client'
 
 import { GET_CURRENT_USER } from '../queries'
 
diff --git a/app/queries/index.js b/app/queries/index.js
index 8aaf5dbb875500c0bcb0f6b06f7587f81ade91f2..17d6b3ba206f39b9addd2edd475969fc85f5c51a 100644
--- a/app/queries/index.js
+++ b/app/queries/index.js
@@ -6,6 +6,7 @@ export const GET_CURRENT_USER = gql`
       id
       profilePicture
       username
+      admin
       defaultIdentity {
         aff
         name
@@ -17,6 +18,11 @@ export const GET_CURRENT_USER = gql`
           email
         }
       }
+      online
+      _currentRoles {
+        id
+        roles
+      }
     }
   }
 `
diff --git a/app/routes.js b/app/routes.js
index ab13a06de6fde2a51ff54c66d85b684910a578ae..ac455bdf69d3d384d13584c093ee041c1a8361df 100644
--- a/app/routes.js
+++ b/app/routes.js
@@ -1,43 +1,16 @@
 import React from 'react'
-import { Route, Switch, Redirect } from 'react-router-dom'
+import { Route, Switch } from 'react-router-dom'
 
 import Login from './components/component-login'
 
 import AdminPage from './components/AdminPage'
 
-// const createReturnUrl = ({ pathname, search = '' }) => pathname + search
-// const loginUrl = location => `/login?next=${createReturnUrl(location)}`
-
-// const adminWrap = Component => props => (
-//   <AdminPage {...props}>
-//     <Component {...props} />
-//   </AdminPage>
-// )
-// TODO: use componentDidMount to fetch the current user before rendering?
-
 export default (
   <Switch>
     {/* AdminPage has nested routes within */}
     <Route path="/journal">
       <AdminPage />
     </Route>
-
-    {/* <PrivateRoute
-        component={FindReviewersPage}
-        exact
-        path="/journals/:journal/versions/:version/find-reviewers"
-      />
-      <PrivateRoute
-        component={FindReviewersAuthorPage}
-        exact
-        path="/journals/:journal/versions/:version/find-reviewers/author/:id"
-      />
-      <PrivateRoute
-        component={FindReviewersPaperPage}
-        exact
-        path="/journals/:journal/versions/:version/find-reviewers/paper/:id"
-      /> */}
-
     <Route component={Login} path="/login" />
   </Switch>
 )
diff --git a/app/shared/currentRolesVar.js b/app/shared/currentRolesVar.js
new file mode 100644
index 0000000000000000000000000000000000000000..7278c2abd93fc6a0f6a784c56b0682472910ca92
--- /dev/null
+++ b/app/shared/currentRolesVar.js
@@ -0,0 +1,5 @@
+import { makeVar } from '@apollo/client'
+
+const currenRolesVar = makeVar([])
+
+export default currenRolesVar
diff --git a/app/shared/hasRole.js b/app/shared/hasRole.js
new file mode 100644
index 0000000000000000000000000000000000000000..23a73b87ff2ef9413884e3ed0e4ca726b12063e9
--- /dev/null
+++ b/app/shared/hasRole.js
@@ -0,0 +1,11 @@
+const hasRole = (obj, role) => {
+  const currentRoles = (obj && obj._currentRoles) || []
+
+  // When multiple roles are provided it acts as an 'OR'
+  if (Array.isArray(role)) {
+    return role.some(r => currentRoles.includes(r))
+  }
+  return currentRoles.includes(role)
+}
+
+export default hasRole
diff --git a/app/sortAndGroup.js b/app/sortAndGroup.js
index 3ee32d7944fcb34059c9b99f71b60099f3a57741..87956bcd9b61f56c985967529e0858bd93e8437c 100644
--- a/app/sortAndGroup.js
+++ b/app/sortAndGroup.js
@@ -66,6 +66,7 @@ export const sortAndGroupMessages = messages => {
       } else {
         // if we're on to the second message, we need to evaulate the timestamp
         // if the second message is older than the first message by our variance
+        // eslint-disable-next-line no-lonely-if
         if (oldMessage(messages[i], messages[i - 1])) {
           // push the batch of messages to master array
           masterArray.push(newArray)
diff --git a/app/theme/elements/ButtonStyles.js b/app/theme/elements/ButtonStyles.js
index ede85e5c2d1e1d866dcc1ea73d46b40d557a549c..df6f9870bb37bfb006a5d34ad2025dac787e4f90 100644
--- a/app/theme/elements/ButtonStyles.js
+++ b/app/theme/elements/ButtonStyles.js
@@ -1,4 +1,4 @@
-import styled, { css } from 'styled-components'
+import { css } from 'styled-components'
 
 export default css`
   background: #fff;
diff --git a/app/theme/index.js b/app/theme/index.js
index 18926d361975fae7334586fcdac531a0be98550b..9ecac132a259087b9e7994fcc02f54b879b89b1e 100644
--- a/app/theme/index.js
+++ b/app/theme/index.js
@@ -17,7 +17,7 @@ const cokoTheme = {
   /* Colors */
   colorBackground: 'white',
   colorSecondaryBackground: '#f9fafb', // custom
-  colorPrimary: '#0D83DD',
+  colorPrimary: '#3AAE2A',
   colorSecondary: '#9e9e9e',
   colorFurniture: '#E8E8E8',
   colorBorder: '#AAA',
diff --git a/config/authsome.js b/config/authsome.js
index 8423ba891854508b84d792884a62d2a1c90c28d4..423148f99fc78f23577e5740a522969782397a32 100644
--- a/config/authsome.js
+++ b/config/authsome.js
@@ -1,8 +1,10 @@
 const { pickBy } = require('lodash')
 
-class SimpleJMode {
+const objType = obj => (obj.constructor && obj.constructor.name) || obj.type
+
+class AuthsomeMode {
   /**
-   * Creates a new instance of SimpleJMode
+   * Creates a new instance of AuthsomeMode
    *
    * @param {string} userId A user's UUID
    * @param {string} operation The operation you're authorizing for
@@ -12,28 +14,11 @@ class SimpleJMode {
    */
   constructor(userId, operation, object, context) {
     this.userId = userId
-    this.operation = SimpleJMode.mapOperation(operation)
+    this.operation = operation
     this.object = object
     this.context = context
   }
 
-  /**
-   * Maps operations from HTTP verbs to semantic verbs
-   *
-   * @param {any} operation
-   * @returns {string}
-   */
-  static mapOperation(operation) {
-    const operationMap = {
-      GET: 'read',
-      POST: 'create',
-      PATCH: 'update',
-      DELETE: 'delete',
-    }
-
-    return operationMap[operation] ? operationMap[operation] : operation
-  }
-
   /**
    * Checks if user is a member of a team of a certain type for a certain object
    *
@@ -42,16 +27,23 @@ class SimpleJMode {
    * @returns {boolean}
    */
   async isTeamMember(role, object) {
-    if (!this.user || !Array.isArray(this.user.teams)) {
+    if (!this.user) {
       return false
     }
 
+    this.user.teams =
+      this.user.teams ||
+      (
+        await this.context.models.User.query()
+          .findById(this.user.id)
+          .eager('teams')
+      ).teams
+
     let membershipCondition
     if (object) {
       // We're asking if a user is a member of a team for a specific object
       membershipCondition = team => {
-        // TODO: This needs to be fixed...
-        const objectId = team.objectId || (team.object && team.object.objectId)
+        const { objectId } = team
         return team.role === role && objectId === object.id
       }
     } else {
@@ -60,11 +52,8 @@ class SimpleJMode {
     }
 
     const memberships = await Promise.all(
-      this.user.teams.map(async teamId => {
-        // TODO: This needs to be fixed...
-        const id = teamId.id ? teamId.id : teamId
-        const team = await this.context.models.Team.find(id)
-        if (!team) return [false]
+      this.user.teams.map(async team => {
+        if (!team) return false
 
         return membershipCondition(team)
       }),
@@ -85,8 +74,7 @@ class SimpleJMode {
   }
 
   /**
-   * Checks if the user is an admin, as represented with the owners
-   * relationship
+   * Checks if the user is an admin
    *
    * @returns {boolean}
    */
@@ -122,21 +110,24 @@ class SimpleJMode {
   }
 
   /**
-   * Checks if user is a senior editor (member of a team of type senior editor) for an object
+   * Checks if user is an editor (any editor) globally
    *
    * @returns {boolean}
    */
-  isManagingEditor(object) {
-    return this.isTeamMember('managingEditor', object)
+  async isGlobalEditor(object) {
+    const seniorEditor = await this.isTeamMember('seniorEditor')
+    const handlingEditor = await this.isTeamMember('handlingEditor')
+
+    return seniorEditor || handlingEditor
   }
 
   /**
-   * Checks if user is a reviewer editor (member of a team of type reviewer editor) for an object
+   * Checks if user is a reviewer (member of a team of type reviewer) for an object
    *
    * @returns {boolean}
    */
-  isAssignedReviewerEditor(object) {
-    return this.isTeamMember('reviewerEditor', object)
+  isAssignedReviewer(object) {
+    return this.isTeamMember('reviewer', object)
   }
 
   /**
@@ -149,15 +140,6 @@ class SimpleJMode {
     return !!this.userId
   }
 
-  /**
-   * Checks if a user can create a collection.
-   *
-   * @returns {boolean}
-   */
-  canCreateCollection() {
-    return this.isAuthenticated()
-  }
-
   /**
    * Checks if a user can read a specific collection
    *
@@ -173,11 +155,6 @@ class SimpleJMode {
 
     const manuscript = this.object
 
-    // TODO: Enable more team types
-    // if (await this.isManagingEditor(manuscript)) {
-    //   return true
-    // }
-
     let permission = await this.checkTeamMembers(
       [
         'isAssignedSeniorEditor',
@@ -258,13 +235,6 @@ class SimpleJMode {
           { id: fragment.collections[0] },
         )
 
-    // permission = permission
-    //   ? true
-    //   : await this.isAssignedManagingEditor(fragment)
-    // Caveat: this means every logged-in user can read every fragment (but needs its UUID)
-    // Ideally we'd check if the fragment (version) belongs to a collection (project)
-    // where the user is a member of a team with the appropriate rights. However there is no
-    // link from a fragment back to a collection at this point. Something to keep in mind!
     return permission
   }
 
@@ -273,41 +243,41 @@ class SimpleJMode {
    *
    * @returns {boolean}
    */
-  // async canListManuscripts() {
-  //   if (!this.isAuthenticated()) {
-  //     return false
-  //   }
-
-  //   this.user = await getUserAndTeams(this.userId, this.context)
-
-  //   return {
-  //     filter: async manuscripts => {
-  //       const filteredManuscripts = await Promise.all(
-  //         manuscripts.map(async manuscript => {
-  //           let condition = await this.checkTeamMembers(
-  //             [
-  //               'isAssignedSeniorEditor',
-  //               'isAssignedHandlingEditor',
-  //               'isManagingEditor',
-  //               'isAssignedReviewerEditor',
-  //             ],
-  //             manuscript,
-  //           )
-  //           // condition = condition
-  //           //   ? true
-  //           //   : await this.canReadatLeastOneFragmentOfCollection(collection, [
-  //           //       'isAssignedReviewerEditor',
-  //           //     ])
-
-  //           condition = condition ? true : await this.isAuthor(manuscript)
-  //           return condition ? manuscript : false
-  //         }),
-  //       )
-
-  //       return filteredManuscripts.filter(manuscript => manuscript)
-  //     },
-  //   }
-  // }
+  async canListManuscripts() {
+    if (!this.isAuthenticated()) {
+      return false
+    }
+
+    this.user = await getUserAndTeams(this.userId, this.context)
+
+    return {
+      filter: async manuscripts => {
+        const filteredManuscripts = await Promise.all(
+          manuscripts.map(async manuscript => {
+            let condition = await this.checkTeamMembers(
+              [
+                'isAssignedSeniorEditor',
+                'isAssignedHandlingEditor',
+                'isManagingEditor',
+                'isAssignedReviewerEditor',
+              ],
+              manuscript,
+            )
+            // condition = condition
+            //   ? true
+            //   : await this.canReadatLeastOneFragmentOfCollection(collection, [
+            //       'isAssignedReviewerEditor',
+            //     ])
+
+            condition = condition ? true : await this.isAuthor(manuscript)
+            return condition ? manuscript : false
+          }),
+        )
+
+        return filteredManuscripts.filter(manuscript => manuscript)
+      },
+    }
+  }
 
   /**
    * Checks if a user can create fragments
@@ -384,7 +354,7 @@ class SimpleJMode {
    * Checks if a user can create a team
    *
    * @returns {boolean}
-   * @memberof SimpleJMode
+   * @memberof AuthsomeMode
    */
   async canCreateTeam() {
     if (!this.isAuthenticated()) {
@@ -472,23 +442,6 @@ class SimpleJMode {
     return permission
   }
 
-  /**
-   * Checks if a user can update manuscript
-   *
-   * @returns {boolean}
-   */
-  // async canUpdateManuscript() {
-  //   this.user = await getUserAndTeams(this.userId, this.context)
-  //   const { current } = this.object
-  //   if (current) {
-  //     return this.checkTeamMembers(
-  //       ['isAuthor', 'isAssignedSeniorEditor', 'isAssignedHandlingEditor'],
-  //       current,
-  //     )
-  //   }
-  //   return false
-  // }
-
   /**
    * Checks if a user can delete Manuscript
    *
@@ -531,31 +484,6 @@ class SimpleJMode {
     )
   }
 
-  async canViewMySubmissionSection() {
-    this.user = await getUserAndTeams(this.userId, this.context)
-    const manuscripts = await Promise.all(
-      this.object.map(async manuscript => this.isAuthor(manuscript)),
-    )
-
-    return manuscripts.some(manuscript => manuscript)
-  }
-
-  async canViewReviewSection() {
-    this.user = await getUserAndTeams(this.userId, this.context)
-
-    const collection = await Promise.all(
-      this.object.map(async manuscript => {
-        const permission = await this.checkTeamMembers(
-          ['isAssignedReviewerEditor'],
-          manuscript,
-        )
-
-        return permission
-      }),
-    )
-    return collection.some(collection => collection)
-  }
-
   async canViewManuscripts() {
     this.user = await getUserAndTeams(this.userId, this.context)
     const manuscripts = await Promise.all(
@@ -571,101 +499,7 @@ class SimpleJMode {
       ),
     )
 
-    return manuscripts.some(collection => collection)
-  }
-
-  async canViewPage() {
-    this.user = await getUserAndTeams(this.userId, this.context)
-    const { path, params } = this.object
-
-    if (path === '/teams') {
-      return !!this.isAdmin()
-    }
-
-    if (path === '/journals/:journal/versions/:version/submit') {
-      return this.checkPageSubmit(params)
-    }
-
-    if (path === '/journals/:journal/versions/:version/reviews/:review') {
-      return this.checkPageReviews(params)
-    }
-
-    if (
-      path === '/journals/:journal/versions/:version/review' ||
-      path === '/journals/:journal/versions/:version/reviewers'
-    ) {
-      return this.checkPageReview(params)
-    }
-
-    if (path === '/journals/:journal/versions/:version/decisions/:decision') {
-      return this.checkPageDecision(params)
-    }
-
-    return true
-  }
-
-  async checkPageSubmit(params) {
-    const collection = this.context.models.Collection.find(params.project)
-    let permission = await this.isAuthor(collection)
-
-    // permission = permission
-    //   ? true
-    //   : await !this.canReadatLeastOneFragmentOfCollection(collection, [
-    //       'isAssignedReviewerEditor',
-    //     ])
-
-    permission = permission
-      ? true
-      : await this.checkTeamMembers(
-          [
-            'isAssignedSeniorEditor',
-            'isAssignedHandlingEditor',
-            'isAssignedReviewerEditor',
-          ],
-          collection,
-        )
-
-    return permission
-  }
-
-  async checkPageDecision(params) {
-    const collection = this.context.models.Collection.find(params.project)
-
-    if (this.isAuthor(collection)) return false
-
-    const permission = await this.checkTeamMembers(
-      ['isAssignedSeniorEditor', 'isAssignedHandlingEditor'],
-      collection,
-    )
-
-    return permission
-  }
-
-  async checkPageReviews(params) {
-    const fragment = this.context.models.Fragment.find(params.version)
-
-    const permission = await this.checkTeamMembers(
-      ['isAssignedReviewerEditor'],
-      fragment,
-    )
-
-    return permission
-  }
-
-  async checkPageReview(params) {
-    const collection = this.context.models.Collection.find(params.project)
-
-    const permission = await this.checkTeamMembers(
-      ['isAssignedSeniorEditor', 'isAssignedHandlingEditor'],
-      collection,
-    )
-
-    return permission
-  }
-
-  async checkTeamMembers(team, object) {
-    const permission = await Promise.all(team.map(t => this[t](object)))
-    return permission.includes(true)
+    return manuscripts.some(m => m)
   }
 }
 
@@ -690,21 +524,11 @@ module.exports = {
     const user = await getUserAndTeams(userId, context)
     if (!user) return false
 
-    // we need to introduce a new Role Managing Editor
-    // currently we take for granted that an admin is the Managing Editor
-    // Temporally we need this if statement to prevent admin from seeing
-    // review and submission section on dashboard (ME permissions)
-    // if (
-    //   operation === 'can view review section' ||
-    //   operation === 'can view my submission section' ||
-    //   operation === 'can view my manuscripts section'
-    // )
-    //   return false
     return user.admin
   },
   create: (userId, operation, object, context) => true,
   update: async (userId, operation, object, context) => {
-    const mode = new SimpleJMode(userId, operation, object, context)
+    const mode = new AuthsomeMode(userId, operation, object, context)
 
     if (
       mode.object === 'Manuscript' ||
@@ -734,59 +558,43 @@ module.exports = {
     return false
   },
   delete: (userId, operation, object, context) => {
-    const mode = new SimpleJMode(userId, operation, object, context)
+    const mode = new AuthsomeMode(userId, operation, object, context)
 
-    if (object && object.type === 'users') {
+    if (object && objType(object) === 'users') {
       return mode.canDeleteUser()
     }
 
-    if (object === 'Manuscript' || object.type === 'Manuscript') {
+    if (object === 'Manuscript' || objType(object) === 'Manuscript') {
       return mode.isAuthor(object)
     }
 
-    if (object === 'Team' || object.type === 'Team') {
+    if (object === 'Team' || objType(object) === 'Team') {
       return true
       // return mode.canDeleteTeam()
     }
 
     return false
   },
-  'can view my submission section': (userId, operation, object, context) => {
-    const mode = new SimpleJMode(userId, operation, object, context)
-    return mode.canViewMySubmissionSection()
-  },
-  'can view my manuscripts section': (userId, operation, object, context) => {
-    const mode = new SimpleJMode(userId, operation, object, context)
-    return mode.canViewManuscripts()
-  },
-  'can view review section': (userId, operation, object, context) => {
-    const mode = new SimpleJMode(userId, operation, object, context)
-    return mode.canViewReviewSection()
-  },
-  'can delete manuscript': (userId, operation, object, context) => {
-    const mode = new SimpleJMode(userId, operation, object, context)
-    return mode.canDeleteManuscript()
-  },
-  'can view page': (userId, operation, object, context) => {
-    const mode = new SimpleJMode(userId, operation, object, context)
-    return mode.canViewPage()
-  },
-  'can view only admin': () => false,
   read: async (userId, operation, object, context) => {
-    const mode = new SimpleJMode(userId, operation, object, context)
+    const mode = new AuthsomeMode(userId, operation, object, context)
 
+    // Can a user read (list) Manuscripts or Reviews?
     if (object === 'Manuscript' || object === 'Review') {
       return true
     }
 
-    if (object.type === 'Review') {
+    // Can a user read a specific Review?
+    if (objType(object) === 'Review') {
       return mode.isAllowedToReview(object)
     }
 
-    if (object.type === 'Manuscript') {
+    // Can a user read a specific Manuscript?
+    if (objType(object) === 'Manuscript') {
       return mode.canReadManuscript()
     }
-    if (object.type === 'team' || object === 'Team') {
+
+    // Can a user read
+    if (objType(object) === 'team' || object === 'Team') {
       return mode.canReadTeam()
     }
 
@@ -798,7 +606,7 @@ module.exports = {
       return mode.canListUsers()
     }
 
-    if (object.type === 'user' || object === 'User') {
+    if (objType(object) === 'user' || object === 'User') {
       return mode.canReadUser()
     }
 
diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json
new file mode 100644
index 0000000000000000000000000000000000000000..9cd99c2cfc4b2aa585fd019b32bee51e408c42c3
--- /dev/null
+++ b/config/custom-environment-variables.json
@@ -0,0 +1,6 @@
+{
+  "auth-orcid": {
+    "clientID": "ORCID_CLIENT_ID",
+    "clientSecret": "ORCID_CLIENT_SECRET"
+  }
+}
\ No newline at end of file
diff --git a/config/default.js b/config/default.js
index 5ba4fcd8fd2f46a462f0f6034255c039a55f9188..3986e834308267490a553720339ccad8a7b01c49 100644
--- a/config/default.js
+++ b/config/default.js
@@ -44,7 +44,6 @@ module.exports = {
     db: {},
     port: 3000,
     logger,
-    enableExperimentalGraphql: true,
     uploads: 'uploads',
     typeDefs: `
       extend type User {
@@ -134,16 +133,9 @@ module.exports = {
   },
   'pubsweet-client': {
     API_ENDPOINT: '/api',
-    'login-redirect': '/',
-    'redux-log': false,
+    'login-redirect': '/journal/dashboard',
     theme: process.env.PUBSWEET_THEME,
   },
-  'password-reset': {
-    url:
-      process.env.PUBSWEET_PASSWORD_RESET_URL ||
-      'http://localhost:3000/password-reset',
-    sender: process.env.PUBSWEET_PASSWORD_RESET_SENDER || 'dev@example.com',
-  },
   'pubsweet-component-xpub-dashboard': {
     acceptUploadFiles: [
       'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
@@ -155,15 +147,6 @@ module.exports = {
       'application/zip',
     ],
   },
-  'pubsweet-component-ink-backend': {
-    inkEndpoint: process.env.INK_ENDPOINT || 'http://167.99.161.30:3000/',
-    email: process.env.INK_USERNAME,
-    password: process.env.INK_PASSWORD,
-    maxRetries: 500,
-    recipes: {
-      'editoria-typescript': '2',
-    },
-  },
   publicKeys: [
     'pubsweet-client',
     'authsome',
@@ -172,6 +155,8 @@ module.exports = {
     'pubsweet-component-xpub-formbuilder',
     'pubsweet',
     'detectionMethodCorrelations',
+    'journal',
   ],
   schema: {},
+  journal: require('./journal'),
 }
diff --git a/config/development.js b/config/development.js
index 98b60078ef5e5d71c2f4043a62c2912a3e4fcc16..8abc7e59a77254a424869b9311aa21ac7d916616 100644
--- a/config/development.js
+++ b/config/development.js
@@ -1,5 +1,3 @@
-const { deferConfig } = require('config/defer')
-
 module.exports = {
   'pubsweet-server': {
     db: {
@@ -8,13 +6,11 @@ module.exports = {
     },
     port: process.env.PORT || 3000,
     pool: { min: 0, max: 10, idleTimeoutMillis: 1000 },
-    baseUrl: deferConfig(
-      cfg => `http://localhost:${cfg['pubsweet-server'].port}`,
-    ),
+    baseUrl: `http://localhost:4000`,
     secret: 'secret-string',
   },
   'pubsweet-client': {
-    baseUrl: 'http://localhost:4000/',
+    baseUrl: `http://localhost:4000`,
   },
   mailer: {
     from: 'simplej@example.com',
diff --git a/app/config/journal/article-types.js b/config/journal/article-types.js
similarity index 93%
rename from app/config/journal/article-types.js
rename to config/journal/article-types.js
index a5d08e5f9823fcce6aa1ff85435a1b798ac5629a..ccd22cb56c98870b5520cd9d5850a36720f03efb 100644
--- a/app/config/journal/article-types.js
+++ b/config/journal/article-types.js
@@ -1,4 +1,4 @@
-export default [
+module.exports = [
   {
     label: 'Original Research Report',
     value: 'original-research',
diff --git a/app/config/journal/decisions.js b/config/journal/decisions.js
similarity index 96%
rename from app/config/journal/decisions.js
rename to config/journal/decisions.js
index 3b1e485081ec770ff34278be18f7a410bcdd2143..bb05921d47b9c444a1bad6dbb54aed74b992b33e 100644
--- a/app/config/journal/decisions.js
+++ b/config/journal/decisions.js
@@ -1,4 +1,4 @@
-export default {
+module.exports = {
   accepted: {
     color: 'green',
     label: 'Accept',
diff --git a/config/journal/index.js b/config/journal/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..8b7b245e19968a33c6e1dc6ac15ab2de9b24b165
--- /dev/null
+++ b/config/journal/index.js
@@ -0,0 +1,11 @@
+module.exports = {
+  metadata: require('./metadata'),
+  decisions: require('./decisions'),
+  recommendations: require('./recommendations'),
+  sections: require('./sections'),
+  articleTypes: require('./article-types'),
+  roles: require('./roles'),
+  reviewStatus: require('./review-status'),
+  notes: require('./submit-notes'),
+  supplementary: require('./supplementary'),
+}
diff --git a/config/journal/metadata.js b/config/journal/metadata.js
new file mode 100644
index 0000000000000000000000000000000000000000..47074571b820d9123bb8fdec3442a8e024c0a669
--- /dev/null
+++ b/config/journal/metadata.js
@@ -0,0 +1,4 @@
+module.exports = {
+  issn: '0000-0001',
+  name: 'Aperture',
+}
diff --git a/app/config/journal/recommendations.js b/config/journal/recommendations.js
similarity index 91%
rename from app/config/journal/recommendations.js
rename to config/journal/recommendations.js
index 642d16fafd9cd4672ac44d82d85298506de23528..b378e93713aa43f220786f9a874a0b2ab29c0849 100644
--- a/app/config/journal/recommendations.js
+++ b/config/journal/recommendations.js
@@ -1,4 +1,4 @@
-export default [
+module.exports = [
   {
     color: 'green',
     label: 'Accept',
diff --git a/config/journal/review-status.js b/config/journal/review-status.js
new file mode 100644
index 0000000000000000000000000000000000000000..3a728ff5236e4080801492328330ba790f3d7c27
--- /dev/null
+++ b/config/journal/review-status.js
@@ -0,0 +1 @@
+module.exports = ['invited', 'accepted', 'rejected', 'completed']
diff --git a/app/config/journal/roles.js b/config/journal/roles.js
similarity index 87%
rename from app/config/journal/roles.js
rename to config/journal/roles.js
index 0f9334d4c66a69a75359e50150a8f7b40f153ee6..95129e0a1ec5d4e512cf548d971ea7f470f04c5b 100644
--- a/app/config/journal/roles.js
+++ b/config/journal/roles.js
@@ -1,4 +1,4 @@
-export default {
+module.exports = {
   author: 'Author',
   handlingEditor: 'Handling Editor',
   managingEditor: 'Managing Editor',
diff --git a/app/config/journal/sections.js b/config/journal/sections.js
similarity index 76%
rename from app/config/journal/sections.js
rename to config/journal/sections.js
index 72bbd760b76499147343cb51e9a73954f71eade3..063ea160fa01ef9233d1f6812f87d2c5d6753162 100644
--- a/app/config/journal/sections.js
+++ b/config/journal/sections.js
@@ -1,4 +1,4 @@
-export default [
+module.exports = [
   {
     id: 'submissions',
     label: 'My Submissions',
diff --git a/app/config/journal/submit-notes.js b/config/journal/submit-notes.js
similarity index 97%
rename from app/config/journal/submit-notes.js
rename to config/journal/submit-notes.js
index 1e811e33f2f486a39145d73202acd57d33444cba..d5e7bd08b12db071b607b73f0eb1c69f0e9e02ac 100644
--- a/app/config/journal/submit-notes.js
+++ b/config/journal/submit-notes.js
@@ -1,4 +1,4 @@
-export default {
+module.exports = {
   fundingAcknowledgement: {
     placeholder: 'Enter an acknowledgment…',
     title: 'Funding body acknowledgement (required)',
diff --git a/app/config/journal/supplementary.js b/config/journal/supplementary.js
similarity index 84%
rename from app/config/journal/supplementary.js
rename to config/journal/supplementary.js
index 6904c399a874b03484df1097b1be6648cd753138..2b0aff3f7a0a6c968a20a403c52abb83bb4dec03 100644
--- a/app/config/journal/supplementary.js
+++ b/config/journal/supplementary.js
@@ -1,4 +1,4 @@
-export default {
+module.exports = {
   description: `
     <pre>All neccessary supplementary files for your research objects
     </pre>
diff --git a/config/permissions.js b/config/permissions.js
new file mode 100644
index 0000000000000000000000000000000000000000..ebd6f8dc0a311248b2e4b18e0b50ce4b27638727
--- /dev/null
+++ b/config/permissions.js
@@ -0,0 +1,40 @@
+// eslint-disable-next-line no-unused-vars
+const { rule, shield, and, or, not, allow, deny } = require('graphql-shield')
+
+const isAdmin = rule({ cache: 'contextual' })(
+  async (parent, args, ctx, info) => ctx.user.admin,
+)
+
+const isEditor = rule({ cache: 'contextual' })(
+  async (parent, args, ctx, info) => {
+    const rows = ctx.user
+      .$relatedQuery('teams')
+      .where({ role: 'seniorEditor' })
+      .orWhere({ role: 'handlingEditor' })
+      .resultSize()
+    return rows !== 0
+  },
+)
+
+const isAuthenticated = rule({ cache: 'contextual' })(
+  async (parent, args, ctx, info) => !!ctx.user,
+)
+
+const permissions = shield(
+  {
+    Query: {
+      paginatedManuscripts: isAdmin,
+    },
+    Mutation: {
+      createManuscript: isAuthenticated,
+    },
+    // Fruit: isAuthenticated,
+    // Customer: isAdmin,
+  },
+  {
+    allowExternalErrors: true,
+    fallbackRule: or(isAdmin, isEditor),
+  },
+)
+
+module.exports = permissions
diff --git a/cypress/dumps/initialState.sql b/cypress/dumps/initialState.sql
new file mode 100644
index 0000000000000000000000000000000000000000..54976467b5bd466564000a01a9e73389f6e596ba
--- /dev/null
+++ b/cypress/dumps/initialState.sql
@@ -0,0 +1,637 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.5
+-- Dumped by pg_dump version 10.5
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Name: pgboss; Type: SCHEMA; Schema: -; Owner: test
+--
+
+CREATE SCHEMA pgboss;
+
+
+ALTER SCHEMA pgboss OWNER TO test;
+
+--
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
+--
+
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
+
+
+--
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
+--
+
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
+
+
+--
+-- Name: pgcrypto; Type: EXTENSION; Schema: -; Owner:
+--
+
+CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public;
+
+
+--
+-- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner:
+--
+
+COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions';
+
+
+SET default_tablespace = '';
+
+SET default_with_oids = false;
+
+--
+-- Name: aliases; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.aliases (
+    id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
+    updated timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
+    name character varying(255),
+    email character varying(255),
+    aff character varying(255)
+);
+
+
+ALTER TABLE public.aliases OWNER TO test;
+
+--
+-- Name: channel_members; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.channel_members (
+    id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    user_id uuid NOT NULL,
+    channel_id uuid NOT NULL
+);
+
+
+ALTER TABLE public.channel_members OWNER TO test;
+
+--
+-- Name: channels; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.channels (
+    id uuid NOT NULL,
+    manuscript_id uuid,
+    team_id uuid,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    topic text,
+    type text
+);
+
+
+ALTER TABLE public.channels OWNER TO test;
+
+--
+-- Name: entities; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.entities (
+    id uuid NOT NULL,
+    data jsonb
+);
+
+
+ALTER TABLE public.entities OWNER TO test;
+
+--
+-- Name: files; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.files (
+    id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    object text,
+    object_id uuid,
+    label text,
+    file_type text,
+    filename text,
+    url text,
+    mime_type text,
+    size integer,
+    type text NOT NULL
+);
+
+
+ALTER TABLE public.files OWNER TO test;
+
+--
+-- Name: identities; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.identities (
+    id uuid NOT NULL,
+    user_id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    type text NOT NULL,
+    identifier text,
+    name text,
+    aff text,
+    oauth jsonb,
+    is_default boolean
+);
+
+
+ALTER TABLE public.identities OWNER TO test;
+
+--
+-- Name: manuscripts; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.manuscripts (
+    id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    parent_id uuid,
+    submitter_id uuid,
+    status text,
+    decision text,
+    authors jsonb,
+    suggestions jsonb,
+    meta jsonb,
+    submission jsonb,
+    type text NOT NULL
+);
+
+
+ALTER TABLE public.manuscripts OWNER TO test;
+
+--
+-- Name: messages; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.messages (
+    id uuid NOT NULL,
+    user_id uuid NOT NULL,
+    channel_id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    content text
+);
+
+
+ALTER TABLE public.messages OWNER TO test;
+
+--
+-- Name: migrations; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.migrations (
+    id text NOT NULL,
+    run_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP
+);
+
+
+ALTER TABLE public.migrations OWNER TO test;
+
+--
+-- Name: reviews; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.reviews (
+    id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    recommendation text,
+    is_decision boolean DEFAULT false,
+    comments jsonb,
+    user_id uuid,
+    manuscript_id uuid,
+    type text NOT NULL
+);
+
+
+ALTER TABLE public.reviews OWNER TO test;
+
+--
+-- Name: team_members; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.team_members (
+    id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
+    updated timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
+    status character varying(255),
+    team_id uuid,
+    user_id uuid,
+    alias_id uuid
+);
+
+
+ALTER TABLE public.team_members OWNER TO test;
+
+--
+-- Name: teams; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.teams (
+    id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    name text,
+    role text NOT NULL,
+    owners jsonb,
+    global boolean,
+    type text NOT NULL,
+    object_id uuid,
+    object_type character varying(255)
+);
+
+
+ALTER TABLE public.teams OWNER TO test;
+
+--
+-- Name: users; Type: TABLE; Schema: public; Owner: test
+--
+
+CREATE TABLE public.users (
+    id uuid NOT NULL,
+    created timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+    updated timestamp with time zone,
+    admin boolean,
+    email text,
+    username text,
+    password_hash text,
+    teams jsonb,
+    password_reset_token text,
+    password_reset_timestamp timestamp with time zone,
+    type text NOT NULL,
+    profile_picture text,
+    online boolean
+);
+
+
+ALTER TABLE public.users OWNER TO test;
+
+--
+-- Data for Name: aliases; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: channel_members; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: channels; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: entities; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: files; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: identities; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+INSERT INTO public.identities (id, user_id, created, updated, type, identifier, name, aff, oauth, is_default) VALUES ('d341a633-cdce-4a7f-a9ad-5afc03cd0dd1', '027afa6a-edbc-486e-bb31-71e12f8ea1c5', '2020-07-21 16:17:24.741+02', '2020-07-21 16:17:25.87+02', 'orcid', '0000-0002-0564-2016', 'Emily Clay', NULL, '{"accessToken": "079a1165-31e5-4b59-9a99-d80ff7a21ebf", "refreshToken": "ccadc737-defc-419e-823b-a9f3673848ba"}', true);
+INSERT INTO public.identities (id, user_id, created, updated, type, identifier, name, aff, oauth, is_default) VALUES ('bcda196e-765a-42c8-94da-ca2e43b80f96', '3802b0e7-aadc-45de-9cf9-918fede99b97', '2020-07-21 16:30:45.721+02', '2020-07-21 16:33:26.742+02', 'orcid', '0000-0002-5641-5729', 'Sinead Sullivan', NULL, '{"accessToken": "ef1ed3ec-8371-41b2-a136-fd196ae52a72", "refreshToken": "6972dace-d9a6-4cd3-a2ad-ec7eb3e457c7"}', true);
+INSERT INTO public.identities (id, user_id, created, updated, type, identifier, name, aff, oauth, is_default) VALUES ('4af83984-6359-47c5-a075-5ddfa9c555d9', '0da0bbec-9261-4706-b990-0c10aa3cc6b4', '2020-07-21 16:35:06.127+02', '2020-07-21 16:35:07.104+02', 'orcid', '0000-0002-7645-9921', 'Sherry Crofoot', NULL, '{"accessToken": "2ad4e130-0775-4e13-87fb-8e8f5a0570ae", "refreshToken": "159933d9-2020-4c02-bdfb-163af41017dc"}', true);
+INSERT INTO public.identities (id, user_id, created, updated, type, identifier, name, aff, oauth, is_default) VALUES ('acfa1777-0aec-4fe1-bc16-92bb9d19e884', '85e1300e-003c-4e96-987b-23812f902477', '2020-07-21 16:35:38.384+02', '2020-07-21 16:35:39.358+02', 'orcid', '0000-0002-9429-4446', 'Elaine Barnes', NULL, '{"accessToken": "dcf07bc7-e59c-41b3-9ce0-924ac20aeeea", "refreshToken": "ae49d6a1-8e62-419d-8767-4a3ec22c1950"}', true);
+INSERT INTO public.identities (id, user_id, created, updated, type, identifier, name, aff, oauth, is_default) VALUES ('88c85115-d83c-42d7-a1a1-0139827977da', '40e3d054-9ac8-4c0f-84ed-e3c6307662cd', '2020-07-21 16:36:24.975+02', '2020-07-21 16:36:26.059+02', 'orcid', '0000-0001-5956-7341', 'Gale Davis', NULL, '{"accessToken": "3e9f6f6c-7cc0-4afa-9fdf-6ed377c36aad", "refreshToken": "80b1e911-df97-43f1-9f11-17b61913f6d7"}', true);
+INSERT INTO public.identities (id, user_id, created, updated, type, identifier, name, aff, oauth, is_default) VALUES ('2ac76834-4ddf-493a-8e50-16c3ecba1b94', '34785737-493d-4819-9982-f522abfaffe6', '2020-07-21 16:39:14.755+02', '2020-07-21 16:39:15.753+02', 'orcid', '0000-0003-1838-2441', 'Joanne Pilger', NULL, '{"accessToken": "fd3da810-1439-4666-ac1d-e737a8ba96bd", "refreshToken": "d11215a2-9921-4a74-be7e-2bec4946d1fb"}', true);
+
+
+--
+-- Data for Name: manuscripts; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: messages; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: migrations; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+INSERT INTO public.migrations (id, run_at) VALUES ('1524494862-entities.sql', '2020-07-21 16:01:00.856209+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1537450834-files.sql', '2020-07-21 16:01:00.866487+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1537450834-review.sql', '2020-07-21 16:01:00.876573+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1542276313-initial-user-migration.sql', '2020-07-21 16:01:00.887088+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1542801241-initial-team-migration.sql', '2020-07-21 16:01:00.898301+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1547596236-initial-team-member-migration.js', '2020-07-21 16:01:00.954317+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1548205275-move-members.js', '2020-07-21 16:01:01.009825+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1548205276-simplify-object.js', '2020-07-21 16:01:01.025532+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1548328420-add-alias-migration.js', '2020-07-21 16:01:01.068783+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1560771823-add-unique-constraints-to-users.sql', '2020-07-21 16:01:01.078878+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1580908536-add-identities.sql', '2020-07-21 16:01:01.092107+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1581371297-migrate-users-to-identities.js', '2020-07-21 16:01:01.107057+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1581450834-manuscript.sql', '2020-07-21 16:01:01.118725+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1582930582-drop-fragments-and-collections.js', '2020-07-21 16:01:01.12668+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1585323910-add-channels.sql', '2020-07-21 16:01:01.14497+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1585344885-add-messages.sql', '2020-07-21 16:01:01.15657+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1585513226-add-profile-pic.sql', '2020-07-21 16:01:01.162443+02');
+INSERT INTO public.migrations (id, run_at) VALUES ('1592915682-change-identities-constraint.sql', '2020-07-21 16:01:01.17359+02');
+
+
+--
+-- Data for Name: reviews; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: team_members; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: teams; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+
+
+--
+-- Data for Name: users; Type: TABLE DATA; Schema: public; Owner: test
+--
+
+INSERT INTO public.users (id, created, updated, admin, email, username, password_hash, teams, password_reset_token, password_reset_timestamp, type, profile_picture, online) VALUES ('0da0bbec-9261-4706-b990-0c10aa3cc6b4', '2020-07-21 16:35:06.125+02', '2020-07-21 16:35:24.978+02', NULL, NULL, '0000000276459921', NULL, NULL, NULL, NULL, 'user', NULL, false);
+INSERT INTO public.users (id, created, updated, admin, email, username, password_hash, teams, password_reset_token, password_reset_timestamp, type, profile_picture, online) VALUES ('85e1300e-003c-4e96-987b-23812f902477', '2020-07-21 16:35:38.381+02', '2020-07-21 16:36:08.629+02', NULL, NULL, '0000000294294446', NULL, NULL, NULL, NULL, 'user', NULL, false);
+INSERT INTO public.users (id, created, updated, admin, email, username, password_hash, teams, password_reset_token, password_reset_timestamp, type, profile_picture, online) VALUES ('40e3d054-9ac8-4c0f-84ed-e3c6307662cd', '2020-07-21 16:36:24.973+02', '2020-07-21 16:39:03.909+02', NULL, NULL, '0000000159567341', NULL, NULL, NULL, NULL, 'user', NULL, false);
+INSERT INTO public.users (id, created, updated, admin, email, username, password_hash, teams, password_reset_token, password_reset_timestamp, type, profile_picture, online) VALUES ('34785737-493d-4819-9982-f522abfaffe6', '2020-07-21 16:39:14.753+02', '2020-07-21 16:39:29.593+02', NULL, NULL, '0000000318382441', NULL, NULL, NULL, NULL, 'user', NULL, false);
+INSERT INTO public.users (id, created, updated, admin, email, username, password_hash, teams, password_reset_token, password_reset_timestamp, type, profile_picture, online) VALUES ('027afa6a-edbc-486e-bb31-71e12f8ea1c5', '2020-07-21 16:17:24.734+02', '2020-07-21 16:40:03+02', NULL, NULL, '0000000205642016', NULL, NULL, NULL, NULL, 'user', NULL, false);
+INSERT INTO public.users (id, created, updated, admin, email, username, password_hash, teams, password_reset_token, password_reset_timestamp, type, profile_picture, online) VALUES ('3802b0e7-aadc-45de-9cf9-918fede99b97', '2020-07-21 16:30:45.719+02', '2020-07-21 16:41:40.685+02', true, NULL, '0000000256415729', NULL, NULL, NULL, NULL, 'user', NULL, true);
+
+
+--
+-- Name: aliases aliases_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.aliases
+    ADD CONSTRAINT aliases_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: channel_members channel_members_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.channel_members
+    ADD CONSTRAINT channel_members_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: channels channels_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.channels
+    ADD CONSTRAINT channels_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: entities entities_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.entities
+    ADD CONSTRAINT entities_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: files files_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.files
+    ADD CONSTRAINT files_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: identities identities_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.identities
+    ADD CONSTRAINT identities_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: manuscripts manuscripts_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.manuscripts
+    ADD CONSTRAINT manuscripts_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: messages messages_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.messages
+    ADD CONSTRAINT messages_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: migrations migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.migrations
+    ADD CONSTRAINT migrations_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: reviews reviews_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.reviews
+    ADD CONSTRAINT reviews_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: team_members team_members_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.team_members
+    ADD CONSTRAINT team_members_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: teams teams_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.teams
+    ADD CONSTRAINT teams_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: users users_email_key; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.users
+    ADD CONSTRAINT users_email_key UNIQUE (email);
+
+
+--
+-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.users
+    ADD CONSTRAINT users_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: users users_username_key; Type: CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.users
+    ADD CONSTRAINT users_username_key UNIQUE (username);
+
+
+--
+-- Name: channel_members_idx; Type: INDEX; Schema: public; Owner: test
+--
+
+CREATE INDEX channel_members_idx ON public.channel_members USING btree (user_id, channel_id);
+
+
+--
+-- Name: is_default_idx; Type: INDEX; Schema: public; Owner: test
+--
+
+CREATE UNIQUE INDEX is_default_idx ON public.identities USING btree (is_default, user_id) WHERE (is_default IS TRUE);
+
+
+--
+-- Name: team_members_team_id_user_id_index; Type: INDEX; Schema: public; Owner: test
+--
+
+CREATE INDEX team_members_team_id_user_id_index ON public.team_members USING btree (team_id, user_id);
+
+
+--
+-- Name: teams_object_id_object_type_index; Type: INDEX; Schema: public; Owner: test
+--
+
+CREATE INDEX teams_object_id_object_type_index ON public.teams USING btree (object_id, object_type);
+
+
+--
+-- Name: channel_members channel_members_channel_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.channel_members
+    ADD CONSTRAINT channel_members_channel_id_fkey FOREIGN KEY (channel_id) REFERENCES public.channels(id);
+
+
+--
+-- Name: channel_members channel_members_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.channel_members
+    ADD CONSTRAINT channel_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: channels channels_manuscript_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.channels
+    ADD CONSTRAINT channels_manuscript_id_fkey FOREIGN KEY (manuscript_id) REFERENCES public.manuscripts(id) ON DELETE CASCADE;
+
+
+--
+-- Name: channels channels_team_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.channels
+    ADD CONSTRAINT channels_team_id_fkey FOREIGN KEY (team_id) REFERENCES public.teams(id);
+
+
+--
+-- Name: manuscripts manuscripts_submitter_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.manuscripts
+    ADD CONSTRAINT manuscripts_submitter_id_fkey FOREIGN KEY (submitter_id) REFERENCES public.users(id);
+
+
+--
+-- Name: messages messages_channel_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.messages
+    ADD CONSTRAINT messages_channel_id_fkey FOREIGN KEY (channel_id) REFERENCES public.channels(id) ON DELETE CASCADE;
+
+
+--
+-- Name: messages messages_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.messages
+    ADD CONSTRAINT messages_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: identities sidentities_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.identities
+    ADD CONSTRAINT sidentities_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: team_members team_members_alias_id_foreign; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.team_members
+    ADD CONSTRAINT team_members_alias_id_foreign FOREIGN KEY (alias_id) REFERENCES public.aliases(id);
+
+
+--
+-- Name: team_members team_members_team_id_foreign; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.team_members
+    ADD CONSTRAINT team_members_team_id_foreign FOREIGN KEY (team_id) REFERENCES public.teams(id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+--
+-- Name: team_members team_members_user_id_foreign; Type: FK CONSTRAINT; Schema: public; Owner: test
+--
+
+ALTER TABLE ONLY public.team_members
+    ADD CONSTRAINT team_members_user_id_foreign FOREIGN KEY (user_id) REFERENCES public.users(id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/cypress/integration/login_spec.js b/cypress/integration/login_spec.js
index 069a9f38345efe2e7fa691f91fe37656f13f2334..42ec338b90f86141b5e71a8b9fb61d6860e39bab 100644
--- a/cypress/integration/login_spec.js
+++ b/cypress/integration/login_spec.js
@@ -1,23 +1,17 @@
 describe('Login test', () => {
   it('Can log in as admin (and logout)', () => {
-    cy.task('db:seed')
-    cy.visit('/dashboard')
+    cy.task('restore', 'initialState')
+    cy.task('createToken', 'Sinead Sullivan').then(token => {
+      cy.setToken(token)
+      cy.visit('/journal/dashboard')
+    })
 
-    const username = 'admin'
-    const password = 'password'
+    // console.log(localStorage.getItem('token'))
 
-    cy.get('input[name="username"]').type(username)
-    cy.get('input[name="password"]').type(password)
-    cy.get('button[type="submit"]').click()
-
-    cy.url().should('include', '/dashboard')
-    cy.get('nav')
-      .contains('Login')
-      .should('not.exist')
+    cy.get('nav').contains('Sinead')
+    cy.get('nav').contains('Dashboard')
     cy.get('nav').contains('admin')
-    cy.get('nav').contains('Logout')
 
-    cy.get('nav button').click()
-    cy.get('nav').contains('Login')
+    cy.contains('You have not submitted any manuscripts yet')
   })
 })
diff --git a/cypress/integration/submission_spec.js b/cypress/integration/submission_spec.js
index c0217f90fcfa8f3194d4ea72976918cc93303526..e897322d6ba42619225a8cb1a09b6fbec6282827 100644
--- a/cypress/integration/submission_spec.js
+++ b/cypress/integration/submission_spec.js
@@ -1,243 +1,243 @@
-// TODO: What's with the wait?
-
-const login = (username, password = 'password') => {
-  cy.get('input[name="username"]')
-    .click()
-    .wait(200)
-    .focus()
-    .type(username)
-    .blur()
-  cy.get('input[name="password"]')
-    .click()
-    .wait(200)
-    .focus()
-    .type(password)
-    .blur()
-  cy.get('button[type="submit"]').click()
-  // cy.wait(1000)
-}
-
-const doReview = (username, note, confidential, recommendation) => {
-  // 1. Login
-  login(username)
-
-  // 2. Accept and do the review
-  cy.get('[data-testid=accept-review]').click()
-  cy.contains('Do Review').click()
-
-  cy.get('[placeholder*="Enter your review"] div[contenteditable="true"]')
-    .focus()
-    .type(note)
-    .blur()
-  cy.wait(1000)
-  cy.get(
-    '[placeholder*="Enter a confidential note"] div[contenteditable="true"]',
-  )
-    .focus()
-    .type(confidential)
-    .blur()
-  cy.wait(1000)
-  // 0 == accept, 1 == revise, 2 == reject
-  cy.get(`[class*=Radio__Label]:nth(${recommendation})`).click()
-  cy.get('button[type=submit]').click()
-
-  // 3. Logout
-  cy.get('nav button').click()
-}
-
-describe('PDF submission test', () => {
-  it('can upload and submit a PDF', () => {
-    cy.task('db:seed')
-
-    cy.visit('/dashboard')
-
-    // 1. Log in as author
-    login('author')
-
-    // 2. Submit a PDF
-    cy.fixture('test-pdf.pdf', 'base64').then(fileContent => {
-      cy.get('[data-testid="dropzone"]').upload(
-        {
-          fileContent,
-          fileName: 'test-pdf.pdf',
-          encoding: 'base64',
-          mimeType: 'application/pdf',
-        },
-        { subjectType: 'drag-n-drop' },
-      )
-    })
-
-    cy.get('body').contains('Submission information')
-    cy.get('[data-testid="meta.title"]').contains('test pdf')
-    cy.get('[data-testid="meta.title"] div[contenteditable="true"]')
-      .click()
-      .type('{selectall}{del}A Manuscript For The Ages')
-
-    cy.get('[data-testid="meta.abstract"] div[contenteditable="true"]')
-      .click()
-      .type(
-        `{selectall}{del}Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem.`,
-      )
-
-    cy.get('[data-testid="meta.keywords"]').type('quantum, machines, nature')
-
-    // TODO: Find a way to not match by partial class
-    cy.get('[class*="Menu__Root"]').click()
-    cy.get('[class*="Menu__Root"] [role="option"]:first').click()
-
-    // TODO: Find a way to remove the forces
-    cy.get('[name="meta.articleSections"]:first').click({ force: true })
-    cy.get('[name="meta.declarations.openData"]:first').click({ force: true })
-    cy.get('[name="meta.declarations.previouslySubmitted"]:nth(1)').click({
-      force: true,
-    })
-    cy.get('[name="meta.declarations.openPeerReview"]:first').click({
-      force: true,
-    })
-    cy.get('[name="meta.declarations.streamlinedReview"]:nth(1)').click({
-      force: true,
-    })
-    cy.get('[name="meta.declarations.researchNexus"]:nth(1)').click({
-      force: true,
-    })
-    cy.get('[name="meta.declarations.preregistered"]:first').click({
-      force: true,
-    })
-
-    cy.get('[data-testid="suggestions.reviewers.suggested"]').type('Jane Doe')
-    cy.get('[data-testid="suggestions.reviewers.opposed"]').type('James Doe')
-
-    cy.get('[data-testid="suggestions.editors.suggested"]').type('John Ode')
-    cy.get('[data-testid="suggestions.editors.opposed"]').type('Gina Ode')
-
-    cy.get('[name="meta.notes.0.content"] div[contenteditable="true"]')
-      .click()
-      .type(
-        'This work was supported by the Trust [grant numbers 393,295]; the Natural Environment Research Council [grant number 49493].',
-      )
-    cy.get('[name="meta.notes.1.content"] div[contenteditable="true"]')
-      .click()
-      .type('This is extremely divisive work, choose reviewers with care.')
-
-    cy.get('form button:last').click()
-    cy.get('button[type="submit"]').click()
-
-    cy.visit('/dashboard')
-    cy.contains('A Manuscript For The Ages')
-
-    // 3. Logout
-    cy.get('nav button').click()
-
-    // 4. And login as admin
-    login('admin', 'password')
-
-    cy.get('[data-testid="control-panel"]').click()
-
-    // 5. Assign senior editor
-    // TODO: Find a way to not match by partial class
-    cy.get('[class*="AssignEditor"] [class*="Menu__Root"]:first').click()
-    cy.get(
-      '[class*="AssignEditor"] [class*="Menu__Root"]:first [role="option"]:nth(1)',
-    ).click()
-
-    // 6. Assign handling editor
-    cy.get('[class*="AssignEditor"] [class*="Menu__Root"]:nth(1)').click()
-    cy.get(
-      '[class*="AssignEditor"] [class*="Menu__Root"]:nth(1) [role="option"]:nth(2)',
-    ).click()
-
-    // 7. Logout
-    cy.get('nav button').click()
-
-    // 8. And login as handling editor
-    cy.wait(1000)
-    login('heditor')
-    cy.get('[data-testid="control-panel"]').click()
-
-    // 9. Assign reviewers
-    cy.get('[class*="AssignEditorsReviewers"] a').click()
-
-    cy.get('.Select-control').click()
-    cy.get('.Select-menu[role="listbox"] [role="option"]:nth(3)').click()
-    cy.get('button[type="submit"]').click()
-    cy.get('[class*="Reviewer__"]').should('have.length', 1)
-
-    cy.get('.Select-control').click()
-    cy.get('.Select-menu[role="listbox"] [role="option"]:nth(4)').click()
-    cy.get('button[type="submit"]').click()
-    cy.get('[class*="Reviewer__"]').should('have.length', 2)
-
-    cy.get('.Select-control').click()
-    cy.get('.Select-menu[role="listbox"] [role="option"]:nth(5)').click()
-    cy.get('button[type="submit"]').click()
-    cy.get('[class*="Reviewer__"]').should('have.length', 3)
-
-    // 10. Check that 3 reviewers are invited
-    cy.contains('SimpleJ').click()
-    cy.get('[data-testid="invited"]').contains('3')
-
-    // 11. Logout
-    cy.get('nav button').click()
-
-    doReview(
-      'reviewer1',
-      'Great research into CC bases in the ky289 variant are mutated to TC which results in the truncation of the SAD-1.',
-      'Not too bad.',
-      0,
-    )
-    doReview(
-      'reviewer2',
-      'Mediocre analysis of Iron-Sulfur ClUster assembly enzyme homolog.',
-      'It is so so.',
-      1,
-    )
-    doReview(
-      'reviewer3',
-      'mTOR-Is positively influence the occurrence and course of certain tumors after solid organ transplantation.',
-      'It is not good.',
-      2,
-    )
-
-    // 12. Log in as handling editor
-    login('heditor')
-    cy.get('[data-testid="completed"]').contains('3')
-
-    cy.task('dump', '3reviewscompleted')
-  })
-
-  it('accept a submitted paper', () => {
-    cy.task('restore', '3reviewscompleted')
-    cy.visit('/dashboard')
-    login('heditor')
-    cy.get('[data-testid="completed"]').contains('3')
-
-    cy.get('[data-testid="control-panel"]').click()
-    cy.contains('reviewer1')
-    cy.contains('reviewer2')
-    cy.contains('reviewer3')
-
-    // Write a decision
-    cy.get('[placeholder*="Write/paste"] div[contenteditable="true"]')
-      .focus()
-      .type("Let's do this!")
-      .blur()
-      .wait(1000)
-    cy.get(`[class*=Radio__Label]:nth(0)`)
-      .click()
-      .wait(1000)
-
-    cy.get('button[type=submit]').click()
-    cy.wait(2000)
-    cy.visit('/dashboard')
-    cy.contains('accepted')
-  })
-
-  it('can delete a submission', () => {
-    cy.task('restore', '3reviewscompleted')
-    cy.visit('/dashboard')
-    login('admin')
-    cy.get('button:contains("Delete")').click()
-    cy.visit('/dashboard')
-    cy.contains('Nothing to do at the moment')
-  })
-})
+// // TODO: What's with the wait?
+
+// const login = (username, password = 'password') => {
+//   cy.get('input[name="username"]')
+//     .click()
+//     .wait(200)
+//     .focus()
+//     .type(username)
+//     .blur()
+//   cy.get('input[name="password"]')
+//     .click()
+//     .wait(200)
+//     .focus()
+//     .type(password)
+//     .blur()
+//   cy.get('button[type="submit"]').click()
+//   // cy.wait(1000)
+// }
+
+// const doReview = (username, note, confidential, recommendation) => {
+//   // 1. Login
+//   login(username)
+
+//   // 2. Accept and do the review
+//   cy.get('[data-testid=accept-review]').click()
+//   cy.contains('Do Review').click()
+
+//   cy.get('[placeholder*="Enter your review"] div[contenteditable="true"]')
+//     .focus()
+//     .type(note)
+//     .blur()
+//   cy.wait(1000)
+//   cy.get(
+//     '[placeholder*="Enter a confidential note"] div[contenteditable="true"]',
+//   )
+//     .focus()
+//     .type(confidential)
+//     .blur()
+//   cy.wait(1000)
+//   // 0 == accept, 1 == revise, 2 == reject
+//   cy.get(`[class*=Radio__Label]:nth(${recommendation})`).click()
+//   cy.get('button[type=submit]').click()
+
+//   // 3. Logout
+//   cy.get('nav button').click()
+// }
+
+// describe('PDF submission test', () => {
+//   it('can upload and submit a PDF', () => {
+//     cy.task('db:seed')
+
+//     cy.visit('/dashboard')
+
+//     // 1. Log in as author
+//     login('author')
+
+//     // 2. Submit a PDF
+//     cy.fixture('test-pdf.pdf', 'base64').then(fileContent => {
+//       cy.get('[data-testid="dropzone"]').upload(
+//         {
+//           fileContent,
+//           fileName: 'test-pdf.pdf',
+//           encoding: 'base64',
+//           mimeType: 'application/pdf',
+//         },
+//         { subjectType: 'drag-n-drop' },
+//       )
+//     })
+
+//     cy.get('body').contains('Submission information')
+//     cy.get('[data-testid="meta.title"]').contains('test pdf')
+//     cy.get('[data-testid="meta.title"] div[contenteditable="true"]')
+//       .click()
+//       .type('{selectall}{del}A Manuscript For The Ages')
+
+//     cy.get('[data-testid="meta.abstract"] div[contenteditable="true"]')
+//       .click()
+//       .type(
+//         `{selectall}{del}Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem.`,
+//       )
+
+//     cy.get('[data-testid="meta.keywords"]').type('quantum, machines, nature')
+
+//     // TODO: Find a way to not match by partial class
+//     cy.get('[class*="Menu__Root"]').click()
+//     cy.get('[class*="Menu__Root"] [role="option"]:first').click()
+
+//     // TODO: Find a way to remove the forces
+//     cy.get('[name="meta.articleSections"]:first').click({ force: true })
+//     cy.get('[name="meta.declarations.openData"]:first').click({ force: true })
+//     cy.get('[name="meta.declarations.previouslySubmitted"]:nth(1)').click({
+//       force: true,
+//     })
+//     cy.get('[name="meta.declarations.openPeerReview"]:first').click({
+//       force: true,
+//     })
+//     cy.get('[name="meta.declarations.streamlinedReview"]:nth(1)').click({
+//       force: true,
+//     })
+//     cy.get('[name="meta.declarations.researchNexus"]:nth(1)').click({
+//       force: true,
+//     })
+//     cy.get('[name="meta.declarations.preregistered"]:first').click({
+//       force: true,
+//     })
+
+//     cy.get('[data-testid="suggestions.reviewers.suggested"]').type('Jane Doe')
+//     cy.get('[data-testid="suggestions.reviewers.opposed"]').type('James Doe')
+
+//     cy.get('[data-testid="suggestions.editors.suggested"]').type('John Ode')
+//     cy.get('[data-testid="suggestions.editors.opposed"]').type('Gina Ode')
+
+//     cy.get('[name="meta.notes.0.content"] div[contenteditable="true"]')
+//       .click()
+//       .type(
+//         'This work was supported by the Trust [grant numbers 393,295]; the Natural Environment Research Council [grant number 49493].',
+//       )
+//     cy.get('[name="meta.notes.1.content"] div[contenteditable="true"]')
+//       .click()
+//       .type('This is extremely divisive work, choose reviewers with care.')
+
+//     cy.get('form button:last').click()
+//     cy.get('button[type="submit"]').click()
+
+//     cy.visit('/dashboard')
+//     cy.contains('A Manuscript For The Ages')
+
+//     // 3. Logout
+//     cy.get('nav button').click()
+
+//     // 4. And login as admin
+//     login('admin', 'password')
+
+//     cy.get('[data-testid="control-panel"]').click()
+
+//     // 5. Assign senior editor
+//     // TODO: Find a way to not match by partial class
+//     cy.get('[class*="AssignEditor"] [class*="Menu__Root"]:first').click()
+//     cy.get(
+//       '[class*="AssignEditor"] [class*="Menu__Root"]:first [role="option"]:nth(1)',
+//     ).click()
+
+//     // 6. Assign handling editor
+//     cy.get('[class*="AssignEditor"] [class*="Menu__Root"]:nth(1)').click()
+//     cy.get(
+//       '[class*="AssignEditor"] [class*="Menu__Root"]:nth(1) [role="option"]:nth(2)',
+//     ).click()
+
+//     // 7. Logout
+//     cy.get('nav button').click()
+
+//     // 8. And login as handling editor
+//     cy.wait(1000)
+//     login('heditor')
+//     cy.get('[data-testid="control-panel"]').click()
+
+//     // 9. Assign reviewers
+//     cy.get('[class*="AssignEditorsReviewers"] a').click()
+
+//     cy.get('.Select-control').click()
+//     cy.get('.Select-menu[role="listbox"] [role="option"]:nth(3)').click()
+//     cy.get('button[type="submit"]').click()
+//     cy.get('[class*="Reviewer__"]').should('have.length', 1)
+
+//     cy.get('.Select-control').click()
+//     cy.get('.Select-menu[role="listbox"] [role="option"]:nth(4)').click()
+//     cy.get('button[type="submit"]').click()
+//     cy.get('[class*="Reviewer__"]').should('have.length', 2)
+
+//     cy.get('.Select-control').click()
+//     cy.get('.Select-menu[role="listbox"] [role="option"]:nth(5)').click()
+//     cy.get('button[type="submit"]').click()
+//     cy.get('[class*="Reviewer__"]').should('have.length', 3)
+
+//     // 10. Check that 3 reviewers are invited
+//     cy.contains('SimpleJ').click()
+//     cy.get('[data-testid="invited"]').contains('3')
+
+//     // 11. Logout
+//     cy.get('nav button').click()
+
+//     doReview(
+//       'reviewer1',
+//       'Great research into CC bases in the ky289 variant are mutated to TC which results in the truncation of the SAD-1.',
+//       'Not too bad.',
+//       0,
+//     )
+//     doReview(
+//       'reviewer2',
+//       'Mediocre analysis of Iron-Sulfur ClUster assembly enzyme homolog.',
+//       'It is so so.',
+//       1,
+//     )
+//     doReview(
+//       'reviewer3',
+//       'mTOR-Is positively influence the occurrence and course of certain tumors after solid organ transplantation.',
+//       'It is not good.',
+//       2,
+//     )
+
+//     // 12. Log in as handling editor
+//     login('heditor')
+//     cy.get('[data-testid="completed"]').contains('3')
+
+//     cy.task('dump', '3reviewscompleted')
+//   })
+
+//   it('accept a submitted paper', () => {
+//     cy.task('restore', '3reviewscompleted')
+//     cy.visit('/dashboard')
+//     login('heditor')
+//     cy.get('[data-testid="completed"]').contains('3')
+
+//     cy.get('[data-testid="control-panel"]').click()
+//     cy.contains('reviewer1')
+//     cy.contains('reviewer2')
+//     cy.contains('reviewer3')
+
+//     // Write a decision
+//     cy.get('[placeholder*="Write/paste"] div[contenteditable="true"]')
+//       .focus()
+//       .type("Let's do this!")
+//       .blur()
+//       .wait(1000)
+//     cy.get(`[class*=Radio__Label]:nth(0)`)
+//       .click()
+//       .wait(1000)
+
+//     cy.get('button[type=submit]').click()
+//     cy.wait(2000)
+//     cy.visit('/dashboard')
+//     cy.contains('accepted')
+//   })
+
+//   it('can delete a submission', () => {
+//     cy.task('restore', '3reviewscompleted')
+//     cy.visit('/dashboard')
+//     login('admin')
+//     cy.get('button:contains("Delete")').click()
+//     cy.visit('/dashboard')
+//     cy.contains('Nothing to do at the moment')
+//   })
+// })
diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js
index ecd0420af857cd3c49a38b02e81212bbe10b16a3..2bc079c1db0dc7ed3f50c8d459de4c38bdbff8a5 100644
--- a/cypress/plugins/index.js
+++ b/cypress/plugins/index.js
@@ -19,9 +19,18 @@ const { readFileSync } = require('fs')
 
 const dumpFile = name => path.join(__dirname, '..', 'dumps', `${name}.sql`)
 
+const testUsers = {
+  'Sherry Crofoot': '0000000276459921',
+  'Elaine Barnes': '0000000294294446',
+  'Gale Davis': '0000000159567341',
+  'Joanne Pilger': '0000000318382441',
+  'Emily Clay': '0000000205642016',
+  'Sinead Sullivan': '0000000256415729', // admin
+}
+
 module.exports = (on, config) => {
   on('task', {
-    'db:seed': () => seed(),
+    // 'db:seed': () => seed(),
     dump: name => {
       if (process.env.NEWDUMPS) {
         return execSync(
@@ -30,6 +39,14 @@ module.exports = (on, config) => {
       }
       return true
     },
-    restore: name => seed(readFileSync(dumpFile(name), 'utf-8')),
+    restore: async name => seed(readFileSync(dumpFile(name), 'utf-8')),
+    createToken: async name => {
+      const { User } = require('@pubsweet/models')
+      const authentication = require('pubsweet-server/src/authentication')
+      const user = await User.query()
+        .where({ username: testUsers[name] })
+        .first()
+      return authentication.token.create(user)
+    },
   })
 }
diff --git a/cypress/support/commands.js b/cypress/support/commands.js
index fc10dd90c315d16d2eea13e6b9399a1a46878528..9a0fa26c03700524169b7e4b94de90754412054c 100644
--- a/cypress/support/commands.js
+++ b/cypress/support/commands.js
@@ -25,3 +25,8 @@ import 'cypress-file-upload'
 //
 // -- This will overwrite an existing command --
 // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
+
+Cypress.Commands.add('setToken', token => {
+  console.log('Setting token', token)
+  localStorage.setItem('token', token)
+})
diff --git a/cypress/videos/login_spec.js.mp4 b/cypress/videos/login_spec.js.mp4
index ae0d99de664ee7b7d660df2b04b2ed963971c7c7..a17ab4e7d55424434393a05e02f1aaaa37b7f914 100644
Binary files a/cypress/videos/login_spec.js.mp4 and b/cypress/videos/login_spec.js.mp4 differ
diff --git a/package.json b/package.json
index 0b0c8d9d69f6bfebe3e8b18217efd1475e2a458d..e398f0d58051e11a65c262515b47e60876103e94 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
     "url": "https://gitlab.coko.foundation/simplej/simplej"
   },
   "dependencies": {
+    "@apollo/client": "^3.0.2",
     "@apollo/react-testing": "^3.1.3",
     "@babel/core": "^7.0.0",
     "@guardian/prosemirror-invisibles": "^1.2.1",
@@ -23,11 +24,14 @@
     "@pubsweet/ui": "^12.1.0",
     "apollo-link-context": "^1.0.9",
     "apollo-link-schema": "^1.1.1",
-    "config": "^1.26.2",
+    "apollo-upload-client": "^14.0.1",
+    "config": "^3.3.1",
     "faker": "^4.1.0",
     "font-awesome": "^4.7.0",
     "fs-extra": "^4.0.2",
     "graphql": "^14.0.2",
+    "graphql-middleware": "^4.0.2",
+    "graphql-shield": "^7.3.2",
     "graphql-tools": "^4.0.0",
     "history": "^4.7.2",
     "jimp": "^0.13.0",
@@ -38,7 +42,7 @@
     "prop-types": "^15.5.10",
     "pubsweet": "^5.1.2",
     "pubsweet-client": "^10.0.2",
-    "pubsweet-server": "13.7.2",
+    "pubsweet-server": "13.11.1",
     "react": "^16.3.2",
     "react-dom": "^16.3.2",
     "react-dropzone": "^10.2.2",
@@ -65,6 +69,7 @@
     "xpub-validators": "^0.0.28",
     "xpub-with-context": "^0.2.0",
     "y-protocols": "^1.0.0",
+    "y-websocket": "^1.3.1",
     "yjs": "^13.2.0"
   },
   "devDependencies": {
@@ -90,8 +95,8 @@
     "compression-webpack-plugin": "^3.0.0",
     "copy-webpack-plugin": "^4.0.1",
     "css-loader": "^0.28.4",
-    "cypress": "^4.0.1",
-    "cypress-file-upload": "^3.5.0",
+    "cypress": "^4.11.0",
+    "cypress-file-upload": "^4.0.7",
     "eslint": "^4.12.0",
     "eslint-config-pubsweet": "^0.0.6",
     "eslint-plugin-import": "^2.8.0",
@@ -137,10 +142,12 @@
     "precommit": "lint-staged",
     "reset": "pubsweet setupdb --clobber",
     "server": "pubsweet start:server",
+    "server:test": "node node_modules/pubsweet-server/src/start",
     "client": "pubsweet start:client",
     "start:services": "docker-compose up postgres",
     "start:server-and-client": "start-test server 'http://localhost:3000/healthcheck' client",
-    "test:all": "start-test start:server-and-client 4000 test",
+    "test:server-and-client": "start-test server:test 'http://localhost:3000/healthcheck' client",
+    "test:all": "start-test test:server-and-client 4000 test",
     "test": "cypress run",
     "__cleanNodeModules": "find . -name 'node_modules' -type d -prune -print -exec rm -rf '{}' \\;",
     "build": "NODE_ENV=production pubsweet build",
diff --git a/public/logo-aperture.png b/public/logo-aperture.png
new file mode 100644
index 0000000000000000000000000000000000000000..1edd6c354315d832eb8cc98df19ad749705da6f8
Binary files /dev/null and b/public/logo-aperture.png differ
diff --git a/scripts/clearAndSeed.js b/scripts/clearAndSeed.js
index 93b8738352b0ddc14595069165e0dff7215928d7..3f343a85c7b128ff0863c72bc0a7237cb495e8c6 100644
--- a/scripts/clearAndSeed.js
+++ b/scripts/clearAndSeed.js
@@ -1,6 +1,7 @@
 const logger = require('@pubsweet/logger')
-const { Journal, User } = require('@pubsweet/models')
+// const { Journal, User } = require('@pubsweet/models')
 const { createTables, db } = require('@pubsweet/db-manager')
+const wait = require('waait')
 
 const clearDb = async () => {
   const { rows } = await db.raw(`
@@ -33,60 +34,13 @@ const seed = async dumpSql => {
     await clearDb()
     await db.raw(dumpSql)
     logger.info('Cleared the database and restored from dump')
+    // TODO: This wait is necessary for the database to settle
+    await wait(2000)
     return true
   }
 
   await createTables(true)
 
-  await new User({
-    username: 'admin',
-    password: 'password',
-    email: 'admin@example.com',
-    admin: true,
-  }).save()
-
-  await new User({
-    username: 'author',
-    email: 'john@example.com',
-    password: 'password',
-  }).save()
-
-  await new User({
-    username: 'seditor',
-    email: 'simone@example.com',
-    password: 'password',
-  }).save()
-
-  await new User({
-    username: 'heditor',
-    email: 'hector@example.com',
-    password: 'password',
-  }).save()
-
-  await new User({
-    username: 'reviewer1',
-    email: 'regina@example.com',
-    password: 'password',
-  }).save()
-
-  await new User({
-    username: 'reviewer2',
-    email: 'robert@example.com',
-    password: 'password',
-  }).save()
-
-  await new User({
-    username: 'reviewer3',
-    email: 'remionne@example.com',
-    password: 'password',
-  }).save()
-
-  await new Journal({
-    title: 'My Journal',
-  }).save()
-
-  logger.info('Seeding complete.')
-
   return true
 }
 
diff --git a/server/app.js b/server/app.js
index 69912c4e7b66dff7217b4501c1b0654423bc8f39..daf5ac7cb675e63ed57fc5062a4819dfb53ce93e 100644
--- a/server/app.js
+++ b/server/app.js
@@ -10,7 +10,7 @@ const helmet = require('helmet')
 const cookieParser = require('cookie-parser')
 const bodyParser = require('body-parser')
 const passport = require('passport')
-const gqlApi = require('pubsweet-server/src/graphql/api') // TODO: Fix import
+const gqlApi = require('./graphql')
 // const index = require('./routes/index')
 // const api = require('./routes/api')
 const logger = require('@pubsweet/logger')
@@ -23,7 +23,7 @@ const registerComponents = require('pubsweet-server/src/register-components') //
 // Wax Collab requirements
 const WebSocket = require('ws')
 const wsUtils = require('./wax-collab/server-util.js')
-const cookie = require('cookie')
+// const cookie = require('cookie')
 const EventEmitter = require('events')
 
 const configureApp = app => {
@@ -56,6 +56,8 @@ const configureApp = app => {
   app.use(helmet())
   app.use(express.static(path.resolve('.', '_build')))
 
+  app.use('/public', express.static(path.resolve(__dirname, '../public')))
+
   if (config.has('pubsweet-server.uploads')) {
     app.use(
       '/uploads',
@@ -82,18 +84,6 @@ const configureApp = app => {
   // GraphQL API
   gqlApi(app)
 
-  // SSE update stream
-  // if (_.get('pubsweet-server.sse', config)) {
-  //   sse.setAuthsome(authsome)
-  //   app.get(
-  //     '/updates',
-  //     passport.authenticate('bearer', { session: false }),
-  //     sse.connect,
-  //   )
-
-  //   app.locals.sse = sse
-  // }
-
   // Serve the index page for front end
   // app.use('/', index)
   app.use('/healthcheck', (req, res) => res.send('All good!'))
@@ -119,7 +109,7 @@ const configureApp = app => {
       .json({ message: err.message })
   })
 
-  // Set up a separate websocket for wax collab
+  // Set up a separate websocket for Wax-Collab
   const wss = new WebSocket.Server({ noServer: true })
   wss.on('connection', (conn, req) => wsUtils.setupWSConnection(conn, req))
 
@@ -138,14 +128,14 @@ const configureApp = app => {
       } else {
         let user = null
         if (request.headers.cookie) {
-          const cookies = cookie.parse(request.headers.cookie)
-          const user = cookies.user_identifier
+          // const cookies = cookie.parse(request.headers.cookie)
+          // const user = cookies.user_identifier
         }
-
+        // TODO: Do real auth for Wax-collab
         user = 'test' // shortcut
 
         if (!user) {
-          console.log('Failed to authenticate', user)
+          // console.log('Failed to authenticate', user)
           socket.destroy()
           return
         }
diff --git a/server/auth-orcid/orcid.js b/server/auth-orcid/orcid.js
index d0ef6cb5d2e49ae10bd076a9af84ac2489b02a6c..5f84755aedfba206f47eeb6f13f4ff930614f032 100644
--- a/server/auth-orcid/orcid.js
+++ b/server/auth-orcid/orcid.js
@@ -3,6 +3,7 @@ const OrcidStrategy = require('passport-orcid')
 const config = require('config')
 const authentication = require('pubsweet-server/src/authentication')
 const fetchUserDetails = require('./fetchUserDetails')
+
 const CALLBACK_URL = '/auth/orcid/callback'
 
 module.exports = app => {
@@ -35,6 +36,7 @@ module.exports = app => {
           }
         }
 
+        // TODO: Update the user details on every login, asynchronously
         try {
           if (!user) {
             user = await new User({
diff --git a/server/formbuilder/src/resolvers.js b/server/formbuilder/src/resolvers.js
index 160853d1f638cf3a72f85ec9a0abf46c1d906af3..c9aaf53d8b0af36c9d8074124e972fb74d699cda 100644
--- a/server/formbuilder/src/resolvers.js
+++ b/server/formbuilder/src/resolvers.js
@@ -3,9 +3,8 @@ const fs = require('fs')
 const { readFiles, mkdirp } = require('./util')
 const form = require('../../../app/storage/forms/submit.json')
 
-const writeJson = (path, object) => {
-  return fs.writeFileSync(path, JSON.stringify(object, null, 2))
-}
+const writeJson = (path, object) =>
+  fs.writeFileSync(path, JSON.stringify(object, null, 2))
 
 const mergeFiles = path =>
   readFiles(path).then(files => {
diff --git a/server/graphql.js b/server/graphql.js
new file mode 100644
index 0000000000000000000000000000000000000000..0edd731f92ac7155400e72a181431e5d0868da11
--- /dev/null
+++ b/server/graphql.js
@@ -0,0 +1,74 @@
+const passport = require('passport')
+const { ApolloServer } = require('apollo-server-express')
+const isEmpty = require('lodash/isEmpty')
+const logger = require('@pubsweet/logger')
+const errors = require('@pubsweet/errors')
+const config = require('config')
+const { applyMiddleware } = require('graphql-middleware')
+
+const schema = require('pubsweet-server/src/graphql/schema') // TODO: Fix import
+const loaders = require('pubsweet-server/src/graphql/loaders') // TODO: Fix import
+
+const authBearerAndPublic = passport.authenticate(['bearer', 'anonymous'], {
+  session: false,
+})
+
+const helpers = require('pubsweet-server/src/helpers/authorization')
+
+const hostname = config.has('pubsweet-server.hostname')
+  ? config.get('pubsweet-server.hostname')
+  : 'localhost'
+
+const extraApolloConfig = config.has('pubsweet-server.apollo')
+  ? config.get('pubsweet-server.apollo')
+  : {}
+
+const getUser = async userId => {
+  const { User } = require('@pubsweet/models')
+  return userId ? User.query().findById(userId) : undefined
+}
+
+const permissions = require('../config/permissions')
+
+const api = app => {
+  app.use('/graphql', authBearerAndPublic)
+  const server = new ApolloServer({
+    schema: applyMiddleware(schema, permissions),
+    context: async ({ req, res }) => ({
+      helpers,
+      user: await getUser(req.user),
+      loaders: loaders(),
+      models: require('@pubsweet/models'),
+    }),
+    formatError: err => {
+      const error = isEmpty(err.originalError) ? err : err.originalError
+
+      logger.error(error.message, { error })
+
+      const isPubsweetDefinedError = Object.values(errors).some(
+        pubsweetError => error instanceof pubsweetError,
+      )
+      // err is always a GraphQLError which should be passed to the client
+      if (!isEmpty(err.originalError) && !isPubsweetDefinedError)
+        return {
+          name: 'Server Error',
+          message: 'Something went wrong! Please contact your administrator',
+        }
+
+      return {
+        name: error.name || 'GraphQLError',
+        message: error.message,
+        extensions: {
+          code: err.extensions.code,
+        },
+      }
+    },
+    playground: {
+      subscriptionEndpoint: `ws://${hostname}:3000/subscriptions`,
+    },
+    ...extraApolloConfig,
+  })
+  server.applyMiddleware({ app })
+}
+
+module.exports = api
diff --git a/server/model-manuscript/src/graphql.js b/server/model-manuscript/src/graphql.js
index 9ee042fe075a094368d5c92e8fdccec58bec7e60..e615f43bea6c281801fcd8f1e8f7ae9cd7eadf0a 100644
--- a/server/model-manuscript/src/graphql.js
+++ b/server/model-manuscript/src/graphql.js
@@ -30,22 +30,22 @@ const resolvers = {
         }),
         status: 'new',
         submission,
-        submitterId: ctx.user,
+        submitterId: ctx.user.id,
       }
 
       // eslint-disable-next-line
-      const manuscript = await new ctx.connectors.Manuscript.model(
+      const manuscript = await new ctx.models.Manuscript(
         emptyManuscript,
       ).saveGraph()
 
       // Create two channels: 1. free for all involved, 2. editorial
-      const allChannel = new ctx.connectors.Channel.model({
+      const allChannel = new ctx.models.Channel({
         manuscriptId: manuscript.id,
         topic: 'Manuscript discussion',
         type: 'all',
       }).save()
 
-      const editorialChannel = new ctx.connectors.Channel.model({
+      const editorialChannel = new ctx.models.Channel({
         manuscriptId: manuscript.id,
         topic: 'Editorial discussion',
         type: 'editorial',
@@ -61,7 +61,7 @@ const resolvers = {
         })
         manuscript.files.push(
           // eslint-disable-next-line
-          await new ctx.connectors.File.model(newFile).save(),
+          await new ctx.models.File(newFile).save(),
         )
       })
 
@@ -73,7 +73,7 @@ const resolvers = {
           name: 'Author',
           objectId: manuscript.id,
           objectType: 'Manuscript',
-          members: [{ user: { id: ctx.user } }],
+          members: [{ user: { id: ctx.user.id } }],
         },
         { relate: true },
       )
@@ -84,11 +84,11 @@ const resolvers = {
     },
     async deleteManuscript(_, { id }, ctx) {
       const deleteManuscript = []
-      const manuscript = await ctx.connectors.Manuscript.model.find(id)
+      const manuscript = await ctx.models.Manuscript.find(id)
 
       deleteManuscript.push(manuscript.id)
       if (manuscript.parentId) {
-        const parentManuscripts = await ctx.connectors.Manuscript.model.findByField(
+        const parentManuscripts = await ctx.models.Manuscript.findByField(
           'parent_id',
           manuscript.parentId,
         )
@@ -101,7 +101,7 @@ const resolvers = {
       // Delete Manuscript
       if (deleteManuscript.length > 0) {
         deleteManuscript.forEach(async manuscript => {
-          await ctx.connectors.Manuscript.delete(manuscript, ctx)
+          await ctx.models.Manuscript.query().deleteById(manuscript)
         })
       }
       return id
@@ -143,12 +143,12 @@ const resolvers = {
     },
     async updateManuscript(_, { id, input }, ctx) {
       const data = JSON.parse(input)
-      const manuscript = await ctx.connectors.Manuscript.fetchOne(id, ctx)
+      const manuscript = await ctx.models.Manuscript.findById(id)
       const update = merge({}, manuscript, data)
-      return ctx.connectors.Manuscript.update(id, update, ctx)
+      return ctx.models.Manuscript.update(id, update, ctx)
     },
     async makeDecision(_, { id, decision }, ctx) {
-      const manuscript = await ctx.connectors.Manuscript.fetchOne(id, ctx)
+      const manuscript = await ctx.models.Manuscript.findById(id)
       manuscript.decision = decision
 
       manuscript.status = decision
@@ -178,7 +178,7 @@ const resolvers = {
         },
       ]
       manuscript.decision = ''
-      manuscript.files = await ctx.connectors.File.model.findByObject({
+      manuscript.files = await ctx.models.File.findByObject({
         object: 'Manuscript',
         object_id: manuscript.id,
       })
@@ -190,12 +190,10 @@ const resolvers = {
       return manuscript
     },
     async manuscripts(_, { where }, ctx) {
-      return ctx.connectors.Manuscript.fetchAll(where, ctx, {
-        eager: '[teams, reviews]',
-      })
+      return ctx.models.Manuscript.query().eager('[teams, reviews]')
     },
     async paginatedManuscripts(_, { sort, offset, limit, filter }, ctx) {
-      const query = ctx.connectors.Manuscript.model.query().eager('submitter')
+      const query = ctx.models.Manuscript.query().eager('submitter')
 
       if (filter && filter.status) {
         query.where({ status: filter.status })
@@ -391,24 +389,6 @@ const typeDefs = `
     notesType: String
     content: String
   }
-
-  # type reviewerStatus {
-  #   user: ID!
-  #   status: String
-  # }
-
-  # input reviewerStatusUpdate {
-  #   user: ID!
-  #   status: String
-  # }
-
-  # extend type Team {
-  #   status: [reviewerStatus]
-  # }
-
-  # extend input TeamInput {
-  #   status: [reviewerStatusUpdate]
-  # }
 `
 
 module.exports = {
diff --git a/server/model-manuscript/src/manuscript.js b/server/model-manuscript/src/manuscript.js
index 1377871c62d482d9972ed925790aa47cc44f84ad..129205d139016f9cfd44cca933f491fa077d5956 100644
--- a/server/model-manuscript/src/manuscript.js
+++ b/server/model-manuscript/src/manuscript.js
@@ -58,7 +58,8 @@ class Manuscript extends BaseModel {
   }
 
   async getReviews() {
-    const Review = require('../../review/src/review')
+    // TODO: Use relationships
+    const Review = require('../../model-review/src/review')
 
     const manuscriptReviews = await Review.findByField('manuscript_id', this.id)
 
diff --git a/server/model-message/src/graphql.js b/server/model-message/src/graphql.js
index c5cb8146aa27c575cbbe774774bfd67bbd8a291b..34ac6f7778d261ba08a8216d46d8f39532508bc1 100644
--- a/server/model-message/src/graphql.js
+++ b/server/model-message/src/graphql.js
@@ -43,7 +43,7 @@ const resolvers = {
   Mutation: {
     createMessage: async (_, { content, channelId }, context) => {
       const pubsub = await getPubsub()
-      const userId = context.user
+      const userId = context.user.id
       const savedMessage = await new Message({
         content,
         userId,
diff --git a/server/model-message/src/migrations/1585344885-add-messages.sql b/server/model-message/src/migrations/1585344885-add-messages.sql
index caad7a3ba769d1e8cf3f9988b9e675b75923317a..3ac17266a2fb24ae2d51b92a20a4fecbc292d3dd 100644
--- a/server/model-message/src/migrations/1585344885-add-messages.sql
+++ b/server/model-message/src/migrations/1585344885-add-messages.sql
@@ -1,7 +1,7 @@
 CREATE TABLE messages (
   id UUID PRIMARY KEY,
-  user_id uuid NOT NULL REFERENCES users(id),
-  channel_id uuid NOT NULL REFERENCES channels(id),
+  user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+  channel_id uuid NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
   created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp,
   updated TIMESTAMP WITH TIME ZONE,
   content TEXT
diff --git a/server/model-review/src/resolvers.js b/server/model-review/src/resolvers.js
index ab90a6ecc39cf9fcf15ea91d2aadeaafa155e49c..90b611e5b4d76d6fc766d058016f5618cd776adb 100644
--- a/server/model-review/src/resolvers.js
+++ b/server/model-review/src/resolvers.js
@@ -14,7 +14,7 @@ const resolvers = {
 
         return rvw
       }
-      input.userId = ctx.user
+      input.userId = ctx.user.id
       const review = await new Review(input)
       await review.save()
       review.comments = await review.getComments()
diff --git a/server/model-team/src/graphql.js b/server/model-team/src/graphql.js
index 830133ce8eec65a5bd53b772952c011a632f1a20..0f1b08e636c84e1152f854635976f1877c67c873 100644
--- a/server/model-team/src/graphql.js
+++ b/server/model-team/src/graphql.js
@@ -3,28 +3,32 @@ const eager = '[members.[user, alias]]'
 const resolvers = {
   Query: {
     team(_, { id }, ctx) {
-      return ctx.connectors.Team.fetchOne(id, ctx, { eager })
+      return ctx.models.Team.query()
+        .findById(id)
+        .eager(eager)
     },
     teams(_, { where }, ctx) {
       where = where || {}
-      if (where.users) {
-        const { users } = where
-        delete where.users
-        where._relations = [{ relation: 'users', ids: users }]
-      }
-
-      if (where.alias) {
-        const { alias } = where
-        delete where.alias
-        where._relations = [{ relation: 'aliases', object: alias }]
-      }
-
-      return ctx.connectors.Team.fetchAll(where, ctx, { eager })
+      // if (where.users) {
+      //   const { users } = where
+      //   delete where.users
+      //   where._relations = [{ relation: 'users', ids: users }]
+      // }
+
+      // if (where.alias) {
+      //   const { alias } = where
+      //   delete where.alias
+      //   where._relations = [{ relation: 'aliases', object: alias }]
+      // }
+
+      return ctx.models.Team.query()
+        .where(where)
+        .eager(eager)
     },
   },
   Mutation: {
     deleteTeam(_, { id }, ctx) {
-      return ctx.connectors.Team.delete(id, ctx)
+      return ctx.models.Team.query().deleteById(id)
     },
     createTeam(_, { input }, ctx) {
       const options = {
@@ -33,22 +37,29 @@ const resolvers = {
         allowUpsert: '[members, members.alias]',
         eager: '[members.[user.teams, alias]]',
       }
-      return ctx.connectors.Team.create(input, ctx, options)
+      return ctx.models.Team.query().insertGraphAndFetch(input, options)
     },
     updateTeam(_, { id, input }, ctx) {
-      return ctx.connectors.Team.update(id, input, ctx, {
-        unrelate: false,
-        eager: 'members.user.teams',
-      })
+      return ctx.models.Team.query().upsertGraphAndFetch(
+        {
+          id,
+          ...input,
+        },
+        {
+          unrelate: false,
+          eager: 'members.user.teams',
+        },
+      )
     },
   },
   User: {
     teams: (parent, _, ctx) =>
-      ctx.connectors.User.fetchRelated(parent.id, 'teams', undefined, ctx),
+      ctx.models.User.relatedQuery('teams').for(parent.id),
   },
   Team: {
-    members(team, { where }, ctx) {
-      return ctx.connectors.Team.fetchRelated(team.id, 'members', where, ctx)
+    async members(team, { where }, ctx) {
+      const t = await ctx.models.Team.query().findById(team.id)
+      return t.$relatedQuery('members')
     },
     object(team, vars, ctx) {
       const { objectId, objectType } = team
@@ -56,21 +67,13 @@ const resolvers = {
     },
   },
   TeamMember: {
-    user(teamMember, vars, ctx) {
-      return ctx.connectors.TeamMember.fetchRelated(
-        teamMember.id,
-        'user',
-        undefined,
-        ctx,
-      )
+    async user(teamMember, vars, ctx) {
+      const member = await ctx.models.TeamMember.query().findById(teamMember.id)
+      return member.$relatedQuery('user')
     },
-    alias(teamMember, vars, ctx) {
-      return ctx.connectors.TeamMember.fetchRelated(
-        teamMember.id,
-        'alias',
-        undefined,
-        ctx,
-      )
+    async alias(teamMember, vars, ctx) {
+      const member = await ctx.models.TeamMember.query().findById(teamMember.id)
+      return member.$relatedQuery('alias')
     },
   },
 }
diff --git a/server/model-team/test/1548205275-move-members_test.js b/server/model-team/test/1548205275-move-members_test.js
deleted file mode 100644
index c7755647accd0cf7ee0d4654451c2997969563f1..0000000000000000000000000000000000000000
--- a/server/model-team/test/1548205275-move-members_test.js
+++ /dev/null
@@ -1,50 +0,0 @@
-process.env.NODE_CONFIG = `{"pubsweet":{
-  "components":[
-    "@pubsweet/model-user",
-    "@pubsweet/model-team",
-    "@pubsweet/model-fragment"
-  ]
-}}`
-
-const Team = require('../src/team')
-const { model: User } = require('@pubsweet/model-user')
-const { dbCleaner } = require('pubsweet-server/test')
-const migrate = require('@pubsweet/db-manager/src/commands/migrate')
-
-describe('Members migration', () => {
-  it('has successfuly migrated members from array to relationship', async () => {
-    // Clean database and run up until the migration we're testing
-    await dbCleaner({ to: '1547596236-initial-team-member-migration.js' })
-
-    const member1 = await new User({
-      email: 'some1@example.com',
-      username: 'member1',
-    }).save()
-
-    const member2 = await new User({
-      email: 'some2@example.com',
-      username: 'member2',
-    }).save()
-
-    // Get a team with the previous members array structure
-    let team = await new Team({
-      name: 'Test',
-      role: 'globalSeniorEditor',
-    }).save()
-
-    await Team.raw('UPDATE teams SET members = ?::jsonb WHERE id = ?', [
-      JSON.stringify([member1.id, member2.id]),
-      team.id,
-    ])
-
-    // Do the migration
-    await migrate({ to: '1548205275-move-members.js' })
-
-    // Check that members have migrated to the relationship
-    team = await Team.query()
-      .findById(team.id)
-      .eager('members')
-
-    expect(team.members).toHaveLength(2)
-  })
-})
diff --git a/server/model-team/test/1548205276-simplify-object_test.js b/server/model-team/test/1548205276-simplify-object_test.js
deleted file mode 100644
index 679170d2c52adb85fad4e9363751d994a67bc628..0000000000000000000000000000000000000000
--- a/server/model-team/test/1548205276-simplify-object_test.js
+++ /dev/null
@@ -1,40 +0,0 @@
-process.env.NODE_CONFIG = `{"pubsweet":{
-  "components":[
-    "@pubsweet/model-user",
-    "@pubsweet/model-team",
-    "@pubsweet/model-fragment"
-  ]
-}}`
-
-const Team = require('../src/team')
-const { dbCleaner } = require('pubsweet-server/test')
-const migrate = require('@pubsweet/db-manager/src/commands/migrate')
-
-describe('Migration to simplify object storage', () => {
-  it('successfully migrates from JSONB to separate columns', async () => {
-    // Clean database and run up until the migration we're testing
-    await dbCleaner({ to: '1548205275-move-members.js' })
-
-    // Get a team with the previous members array structure
-    let team = await new Team({
-      name: 'Test',
-      role: 'test',
-    }).save()
-
-    // Using id and type 'team' here just for testing
-    await Team.raw('UPDATE teams SET object = ?::jsonb WHERE id = ?', [
-      JSON.stringify({ objectId: team.id, objectType: 'team' }),
-      team.id,
-    ])
-
-    // Do the migration
-    await migrate({ to: '1548205276-simplify-object.js' })
-
-    // Check that members have migrated to the relationship
-    team = await Team.query().findById(team.id)
-
-    expect(team.objectId).toEqual(team.id)
-    expect(team.objectType).toEqual('team')
-    expect(team.object).toBeUndefined()
-  })
-})
diff --git a/server/model-team/test/helpers/authsome_mode.js b/server/model-team/test/helpers/authsome_mode.js
deleted file mode 100644
index 0f156436b8ab761c0fc37453b3661b238cda1d5b..0000000000000000000000000000000000000000
--- a/server/model-team/test/helpers/authsome_mode.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = async (userId, operation, object, context) => true
diff --git a/server/model-team/test/jest-setup.js b/server/model-team/test/jest-setup.js
deleted file mode 100644
index 7de2beed55c538a4a39fe8495b07dde62f6db5f9..0000000000000000000000000000000000000000
--- a/server/model-team/test/jest-setup.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const path = require('path')
-
-process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
diff --git a/server/model-team/test/team_graphql_test.js b/server/model-team/test/team_graphql_test.js
deleted file mode 100644
index a6cb76d33c9f3dabb071573fb530dd9462a43c00..0000000000000000000000000000000000000000
--- a/server/model-team/test/team_graphql_test.js
+++ /dev/null
@@ -1,400 +0,0 @@
-process.env.NODE_CONFIG = `{"pubsweet":{
-  "components":[
-    "@pubsweet/model-user",
-    "@pubsweet/model-team",
-    "@pubsweet/model-fragment"
-  ]
-}}`
-
-const { model: User } = require('@pubsweet/model-user')
-const { model: Fragment } = require('@pubsweet/model-fragment')
-
-const { dbCleaner, api } = require('pubsweet-server/test')
-
-const { fixtures } = require('@pubsweet/model-user/test')
-const authentication = require('pubsweet-server/src/authentication')
-
-const Team = require('../src/team')
-
-describe('Team queries', () => {
-  let token
-  let user
-
-  const whereQuery = async where => {
-    const { body } = await api.graphql.query(
-      `query($where: TeamWhereInput) {
-          teams(where: $where) {
-            name
-            object {
-              objectId
-              objectType
-            }
-            members {
-              user {
-                id
-              }
-            }
-          }
-        }`,
-      {
-        where,
-      },
-      token,
-    )
-    return body
-  }
-
-  beforeEach(async () => {
-    await dbCleaner()
-    user = await new User(fixtures.user).save()
-    token = authentication.token.create(user)
-  })
-
-  it("lists a user's teams", async () => {
-    await Team.query().upsertGraphAndFetch(
-      {
-        role: 'test',
-        name: 'Test',
-        members: [{ user: { id: user.id } }],
-      },
-      { relate: true, unrelate: true },
-    )
-
-    const { body } = await api.graphql.query(
-      `query {
-        users {
-          id
-          teams {
-            members {
-              user {
-                id
-              }
-            }
-          }
-        }
-      }`,
-      {},
-      token,
-    )
-
-    expect(body.data.users[0].teams[0].members[0].user.id).toEqual(user.id)
-  })
-
-  it('creates a team with members or without', async () => {
-    const fragment = await new Fragment({ fragmentType: 'post' }).save()
-
-    const noMembers = []
-    const yesMembers = [
-      {
-        user: { id: user.id },
-        alias: { email: 'unk@example.com' },
-        status: 'invited',
-      },
-    ]
-
-    const promises = [noMembers, yesMembers].map(async members => {
-      const { body } = await api.graphql.query(
-        `mutation($input: TeamInput) {
-          createTeam(input: $input) {
-            name
-            members {
-              user {
-                id
-              }
-              alias {
-                email
-              }
-              status
-            }
-            object {
-              objectId
-              objectType
-            }
-          }
-        }`,
-        {
-          input: {
-            name: 'My team',
-            role: 'test',
-            members,
-            objectId: fragment.id,
-            objectType: 'fragment',
-          },
-        },
-        token,
-      )
-
-      expect(body).toEqual({
-        data: {
-          createTeam: {
-            name: 'My team',
-            members,
-            object: {
-              objectId: fragment.id,
-              objectType: 'fragment',
-            },
-          },
-        },
-      })
-    })
-    await Promise.all(promises)
-  })
-
-  it('can query a team saved directly', async () => {
-    const team = await new Team({
-      name: 'NoMembers',
-      role: 'test',
-      members: [],
-    }).save()
-
-    const { body } = await api.graphql.query(
-      `query($id: ID) {
-        team(id: $id) {
-          name
-          members {
-            user {
-              id
-            }
-          }
-        }
-      }`,
-      { id: team.id },
-      token,
-    )
-
-    expect(body.data.team).toEqual({
-      name: 'NoMembers',
-      members: [],
-    })
-  })
-
-  it('can update a team and its members', async () => {
-    const team = await new Team({ name: 'Before', role: 'test' }).save()
-    const { body } = await api.graphql.query(
-      `mutation($id: ID, $input: TeamInput) {
-          updateTeam(id: $id, input: $input) {
-            name
-            members {
-              user {
-                id
-              }
-            }
-          }
-        }`,
-      {
-        id: team.id,
-        input: {
-          name: 'After',
-          members: [{ user: { id: user.id } }],
-        },
-      },
-      token,
-    )
-
-    expect(body).toEqual({
-      data: {
-        updateTeam: {
-          name: 'After',
-          members: [{ user: { id: user.id } }],
-        },
-      },
-    })
-  })
-
-  it('can update a team and also remove members', async () => {
-    const otherUser = await new User(fixtures.otherUser).save()
-    const team = await Team.query().upsertGraphAndFetch(
-      {
-        role: 'test',
-        name: 'Test',
-        members: [{ user: { id: user.id } }, { user: { id: otherUser.id } }],
-      },
-      { relate: true, unrelate: true },
-    )
-
-    const { body } = await api.graphql.query(
-      `mutation($id: ID, $input: TeamInput) {
-          updateTeam(id: $id, input: $input) {
-            name
-            members {
-              id
-              user {
-                id
-              }
-            }
-          }
-        }`,
-      {
-        id: team.id,
-        input: {
-          name: 'After',
-          members: [{ id: team.members[0].id }],
-        },
-      },
-      token,
-    )
-
-    expect(body).toEqual({
-      data: {
-        updateTeam: {
-          name: 'After',
-          members: [
-            { id: team.members[0].id, user: { id: team.members[0].user.id } },
-          ],
-        },
-      },
-    })
-
-    // The team should no longer user as a member
-    const updatedTeam = await Team.query()
-      .findById(team.id)
-      .eager('members')
-    expect(updatedTeam.members).toHaveLength(1)
-
-    // But the user should not be deleted
-    expect(await User.query()).toHaveLength(2)
-  })
-
-  it('finds a team', async () => {
-    const team = await new Team({ role: 'test', name: 'Test' }).save()
-
-    const { body } = await api.graphql.query(
-      `query($id: ID) {
-        team(id: $id) {
-          name
-        }
-      }`,
-      { id: team.id },
-      token,
-    )
-    expect(body.data.team.name).toEqual('Test')
-  })
-
-  it('finds a team by role', async () => {
-    await new Team({ role: 'test1', name: 'Test1' }).save()
-    await new Team({ role: 'test', name: 'Test' }).save()
-
-    const body = await whereQuery({
-      role: 'test',
-    })
-
-    expect(body.data.teams).toHaveLength(1)
-    expect(body.data.teams[0].name).toEqual('Test')
-  })
-
-  it('find a team by role and object', async () => {
-    const fragment = await new Fragment({ fragmentType: 'post' }).save()
-
-    await Team.query().upsertGraph(
-      {
-        role: 'test',
-        name: 'Test',
-        objectId: fragment.id,
-        objectType: 'fragment',
-        members: [{ id: user.id }],
-      },
-      { relate: true, unrelate: true },
-    )
-
-    const body = await whereQuery({
-      role: 'test',
-      objectId: fragment.id,
-      objectType: 'fragment',
-    })
-
-    expect(body.data.teams).toHaveLength(1)
-  })
-
-  describe('find a team by role, object, and member', () => {
-    let fragment
-    let user2
-
-    beforeEach(async () => {
-      fragment = await new Fragment({ fragmentType: 'post' }).save()
-      user2 = await new User({
-        email: 'hi@example.com',
-        username: 'test2',
-      }).save()
-
-      await Team.query().upsertGraph(
-        {
-          role: 'test',
-          name: 'Test',
-          objectId: fragment.id,
-          objectType: 'fragment',
-          members: [
-            {
-              user: { id: user.id },
-              alias: {
-                email: 'alias@example.com',
-              },
-            },
-            {
-              user: { id: user2.id },
-            },
-          ],
-        },
-        { relate: true, unrelate: true },
-      )
-    })
-
-    it('finds a team for 1 user (through members)', async () => {
-      const body = await whereQuery({
-        role: 'test',
-        objectId: fragment.id,
-        objectType: 'fragment',
-        users: [user.id],
-      })
-
-      expect(body.data.teams).toHaveLength(1)
-      expect(body.data.teams[0].object).toEqual({
-        objectId: fragment.id,
-        objectType: 'fragment',
-      })
-      expect(body.data.teams[0].members).toHaveLength(2)
-    })
-
-    it('finds a team by alias of a member', async () => {
-      const body = await whereQuery({
-        role: 'test',
-        objectId: fragment.id,
-        objectType: 'fragment',
-        alias: { email: 'alias@example.com' },
-      })
-      expect(body.data.teams).toHaveLength(1)
-    })
-
-    it('finds a team for both members', async () => {
-      const body = await whereQuery({
-        role: 'test',
-        objectId: fragment.id,
-        objectType: 'fragment',
-        users: [user.id, user2.id],
-      })
-
-      expect(body.data.teams).toHaveLength(1)
-    })
-
-    it('does not find a team for non-existent member', async () => {
-      const body = await whereQuery({
-        role: 'test',
-        objectId: fragment.id,
-        objectType: 'fragment',
-        users: ['54513de6-b473-4b39-8f95-bcbb3ae58a2a'],
-      })
-
-      expect(body.data.teams).toHaveLength(0)
-    })
-
-    it('does not find a team if one of the members is wrong', async () => {
-      const body = await whereQuery({
-        role: 'test',
-        objectId: fragment.id,
-        objectType: 'fragment',
-        users: [user.id, user2.id, '54513de6-b473-4b39-8f95-bcbb3ae58a2a'],
-      })
-
-      expect(body.data.teams).toHaveLength(0)
-    })
-  })
-})
diff --git a/server/model-team/test/team_test.js b/server/model-team/test/team_test.js
deleted file mode 100644
index bb6989fda9585059cd07403419076f099f3e3589..0000000000000000000000000000000000000000
--- a/server/model-team/test/team_test.js
+++ /dev/null
@@ -1,128 +0,0 @@
-process.env.NODE_CONFIG = `{"pubsweet":{
-  "components":[
-    "@pubsweet/model-user",
-    "@pubsweet/model-team",
-    "@pubsweet/model-fragment"
-  ]
-}}`
-
-const Team = require('../src/team')
-const { model: User } = require('@pubsweet/model-user')
-const { dbCleaner } = require('pubsweet-server/test')
-
-const createTeamWithMember = async () => {
-  const user = await new User({
-    email: 'some@example.com',
-    username: 'test',
-  }).save()
-
-  const team = await Team.query().upsertGraphAndFetch(
-    {
-      name: 'Test',
-      role: 'testRole',
-      members: [{ user: { id: user.id } }],
-    },
-    { relate: true },
-  )
-
-  return { user, team }
-}
-
-describe('Team', () => {
-  beforeEach(async () => {
-    await dbCleaner()
-  })
-
-  it('has updated set when created', async () => {
-    const team = await new Team({
-      name: 'Test',
-      role: 'globalSeniorEditor',
-    }).save()
-    expect(team.role).toEqual('globalSeniorEditor')
-    const now = new Date().toISOString()
-    expect(team.updated.toISOString()).toHaveLength(now.length)
-  })
-
-  it('can be saved and found and deleted', async () => {
-    const team = await new Team({ name: 'Test', role: 'testRole' }).save()
-    expect(team.name).toEqual('Test')
-
-    const foundTeam = await Team.find(team.id)
-    expect(foundTeam.name).toEqual('Test')
-
-    await foundTeam.delete()
-
-    async function tryToFind() {
-      await Team.find(foundTeam.id)
-    }
-    await expect(tryToFind()).rejects.toThrow('Object not found')
-  })
-
-  it('can have some members', async () => {
-    const newTeam = (await createTeamWithMember()).team
-    const team = await Team.query()
-      .findById(newTeam.id)
-      .eager('members')
-
-    expect(team.members).toHaveLength(1)
-  })
-
-  it('deletes memberships after team is deleted', async () => {
-    const { team, user } = await createTeamWithMember()
-
-    let foundUser = await User.query()
-      .findById(user.id)
-      .eager('teams')
-
-    expect(foundUser.teams).toHaveLength(1)
-
-    await Team.query().deleteById(team.id)
-
-    foundUser = await User.query()
-      .findById(user.id)
-      .eager('teams')
-
-    expect(foundUser.teams).toHaveLength(0)
-  })
-
-  it('creates team and related objects with one call', async () => {
-    const user = await new User({
-      email: 'some@example.com',
-      username: 'test',
-    }).save()
-
-    const team = await Team.query().upsertGraphAndFetch(
-      {
-        role: 'test',
-        name: 'My team',
-        objectId: '5989b23c-356b-4ae9-bee5-bbd11f29028b',
-        objectType: 'fragment',
-        members: [
-          {
-            user: { id: user.id },
-            alias: {
-              email: 'someemail',
-              aff: 'someaff',
-              name: 'somename',
-            },
-            status: 'invited',
-          },
-        ],
-      },
-      {
-        relate: true,
-        unrelate: true,
-      },
-    )
-
-    expect(team.members).toHaveLength(1)
-    expect(team.members[0].id).toBeDefined()
-    expect(team.members[0].alias.id).toBeDefined()
-    expect(team.members[0].user.id).toBe(user.id)
-
-    const userWithTeams = await User.query()
-      .findById(user.id)
-      .eager('teams')
-    expect(userWithTeams.teams[0].id).toBe(team.id)
-  })
-})
diff --git a/server/model-user/src/graphql.js b/server/model-user/src/graphql.js
index 2cc0698de92cfbc0edc5032069d04eae2d7138f8..56565dd4a4645070bf9d86913cd82d012e87b102 100644
--- a/server/model-user/src/graphql.js
+++ b/server/model-user/src/graphql.js
@@ -1,18 +1,16 @@
 const logger = require('@pubsweet/logger')
 const { AuthorizationError, ConflictError } = require('@pubsweet/errors')
 
-const eager = undefined
-
 const resolvers = {
   Query: {
     user(_, { id }, ctx) {
-      return ctx.connectors.User.fetchOne(id, ctx, { eager })
+      return ctx.models.User.query().findById(id)
     },
     async users(_, vars, ctx) {
-      return ctx.connectors.User.model.query()
+      return ctx.models.User.query()
     },
     async paginatedUsers(_, { sort, offset, limit, filter }, ctx) {
-      const query = ctx.connectors.User.model.query()
+      const query = ctx.models.User.query()
 
       if (filter && filter.admin) {
         query.where({ admin: true })
@@ -39,21 +37,23 @@ const resolvers = {
         users,
       }
 
-      // return ctx.connectors.User.fetchAll(where, ctx, { eager })
+      // return ctx.models.User.fetchAll(where, ctx, { eager })
     },
     // Authentication
-    currentUser(_, vars, ctx) {
+    async currentUser(_, vars, ctx) {
       if (!ctx.user) return null
-      return ctx.connectors.User.model.find(ctx.user, { eager })
+      const user = await ctx.models.User.find(ctx.user.id)
+      user._currentRoles = await user.currentRoles()
+      return user
     },
     searchUsers(_, { teamId, query }, ctx) {
       if (teamId) {
-        return ctx.connectors.User.model
+        return ctx.models.User.model
           .query()
           .where({ teamId })
           .where('username', 'ilike', `${query}%`)
       }
-      return ctx.connectors.User.model
+      return ctx.models.User.model
         .query()
         .where('username', 'ilike', `${query}%`)
     },
@@ -63,9 +63,7 @@ const resolvers = {
       const user = {
         username: input.username,
         email: input.email,
-        passwordHash: await ctx.connectors.User.model.hashPassword(
-          input.password,
-        ),
+        passwordHash: await ctx.models.User.hashPassword(input.password),
       }
 
       const identity = {
@@ -77,7 +75,7 @@ const resolvers = {
       user.defaultIdentity = identity
 
       try {
-        const result = await ctx.connectors.User.create(user, ctx, {
+        const result = await ctx.models.User.create(user, ctx, {
           eager: 'defaultIdentity',
         })
 
@@ -93,17 +91,15 @@ const resolvers = {
       }
     },
     deleteUser(_, { id }, ctx) {
-      return ctx.connectors.User.delete(id, ctx)
+      return ctx.models.User.delete(id, ctx)
     },
     async updateUser(_, { id, input }, ctx) {
       if (input.password) {
-        input.passwordHash = await ctx.connectors.User.model.hashPassword(
-          input.password,
-        )
+        input.passwordHash = await ctx.models.User.hashPassword(input.password)
         delete input.password
       }
 
-      return ctx.connectors.User.update(id, input, ctx)
+      return ctx.models.User.update(id, input, ctx)
     },
     // Authentication
     async loginUser(_, { input }, ctx) {
@@ -112,7 +108,7 @@ const resolvers = {
       let isValid = false
       let user
       try {
-        user = await ctx.connectors.User.model.findByUsername(input.username)
+        user = await ctx.models.User.findByUsername(input.username)
         isValid = await user.validPassword(input.password)
       } catch (err) {
         logger.debug(err)
@@ -126,7 +122,7 @@ const resolvers = {
       }
     },
     async updateCurrentUsername(_, { username }, ctx) {
-      const user = await ctx.connectors.User.model.find(ctx.user)
+      const user = await ctx.models.User.find(ctx.user)
       user.username = username
       await user.save()
       return user
@@ -134,16 +130,15 @@ const resolvers = {
   },
   User: {
     async defaultIdentity(parent, args, ctx) {
-      const identity = await ctx.connectors.Identity.model
-        .query()
+      const identity = await ctx.models.Identity.query()
         .where({ userId: parent.id, isDefault: true })
         .first()
       return identity
     },
     async identities(parent, args, ctx) {
-      const identities = await ctx.connectors.Identity.model
-        .query()
-        .where({ userId: parent.id })
+      const identities = await ctx.models.Identity.query().where({
+        userId: parent.id,
+      })
       return identities
     },
   },
@@ -205,9 +200,17 @@ const typeDefs = `
     defaultIdentity: Identity
     profilePicture: String
     online: Boolean
+    _currentRoles: [CurrentRole]
+    _currentGlobalRoles: [String]
+  }
+
+  type CurrentRole {
+    id: ID
+    roles: [String]
   }
 
   interface Identity {
+    id: ID
     name: String
     aff: String # JATS <aff>
     email: String # JATS <aff>
@@ -218,6 +221,7 @@ const typeDefs = `
 
   # local identity (not from ORCID, etc.)
   type LocalIdentity implements Identity {
+    id: ID
     name: String
     email: String
     aff: String
@@ -225,6 +229,7 @@ const typeDefs = `
   }
 
   type ExternalIdentity implements Identity {
+    id: ID
     name: String
     identifier: String
     email: String
diff --git a/server/model-user/src/user.js b/server/model-user/src/user.js
index 468f9d470f6af4a510a59ec609a7cc467bc97136..fd8b6986db9db2826cfd01a66419c5f3f4686e72 100644
--- a/server/model-user/src/user.js
+++ b/server/model-user/src/user.js
@@ -53,6 +53,7 @@ class User extends BaseModel {
             modelClass: TeamMember,
             from: 'team_members.userId',
             to: 'team_members.teamId',
+            extra: ['status'],
           },
           to: 'teams.id',
         },
@@ -78,12 +79,38 @@ class User extends BaseModel {
     }
   }
 
-  // eslint-disable-next-line class-methods-use-this
-  setOwners() {
-    // FIXME: this is overriden to be a no-op, because setOwners() is called by
-    // the API on create for all entity types and setting `owners` on a User is
-    // not allowed. This should instead be solved by having separate code paths
-    // in the API for different entity types.
+  // // eslint-disable-next-line class-methods-use-this
+  // setOwners() {
+  //   // FIXME: this is overriden to be a no-op, because setOwners() is called by
+  //   // the API on create for all entity types and setting `owners` on a User is
+  //   // not allowed. This should instead be solved by having separate code paths
+  //   // in the API for different entity types.
+  // }
+
+  // This gives a view of the teams and team member structure to reflect
+  // the current roles the user is performing. E.g. if they are a member
+  // of a reviewer team and have the status of 'accepted', they will
+  // have a 'accepted:reviewer' role present in the returned object
+  async currentRoles(object) {
+    let teams
+    if (object && object.id) {
+      teams = await this.$relatedQuery('teams').where('objectId', object.id)
+    } else {
+      teams = await this.$relatedQuery('teams')
+    }
+    const roles = {}
+
+    teams.forEach(t => {
+      const role = `${t.status ? `${t.status}:` : ''}${t.role}`
+
+      // If there's an existing role for this object, add to the list
+      if (t.objectId && Array.isArray(roles[t.objectId])) {
+        roles[t.objectId].push(role)
+      } else if (t.objectId) {
+        roles[t.objectId] = [role]
+      }
+    })
+    return Object.keys(roles).map(id => ({ id, roles: roles[id] }))
   }
 
   async save() {
diff --git a/server/model-user/test/1581371297-migrate-users-to-identities_test.js b/server/model-user/test/1581371297-migrate-users-to-identities_test.js
deleted file mode 100644
index 9bf1285525962241664fd7fc94ffa6e7e3796d69..0000000000000000000000000000000000000000
--- a/server/model-user/test/1581371297-migrate-users-to-identities_test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-process.env.NODE_CONFIG = `{"pubsweet":{
-  "components":[
-    "@pubsweet/model-user",
-  ]
-}}`
-
-const { User } = require('@pubsweet/models')
-const { dbCleaner } = require('pubsweet-server/test')
-const migrate = require('@pubsweet/db-manager/src/commands/migrate')
-
-describe('Users to Identities migration', () => {
-  it('has successfuly created new default identities', async () => {
-    await dbCleaner({ to: '1580908536-add-identities.sql' })
-
-    const user1 = await new User({
-      email: 'some1@example.com',
-      username: 'user1',
-      password: 'test1',
-    }).save()
-
-    const user2 = await new User({
-      email: 'some2@example.com',
-      username: 'user2',
-      password: 'test2',
-    }).save()
-
-    // Do the migration
-    await migrate({ to: '1581371297-migrate-users-to-identities.js' })
-
-    const user1after = await User.find(user1.id, {
-      eager: '[identities,defaultIdentity]',
-    })
-    const user2after = await User.find(user2.id, {
-      eager: '[identities,defaultIdentity]',
-    })
-
-    expect(user1after.defaultIdentity).toBeTruthy()
-    expect(user1after.identities).toHaveLength(1)
-    expect(await user1after.validPassword('test1')).toBe(true)
-
-    expect(user2after.defaultIdentity).toBeTruthy()
-    expect(user2after.identities).toHaveLength(1)
-    expect(await user2after.validPassword('test2')).toBe(true)
-  })
-})
diff --git a/server/model-user/test/fixtures.js b/server/model-user/test/fixtures.js
deleted file mode 100644
index b6cc1725827d2e2c04251ddff088931055c12717..0000000000000000000000000000000000000000
--- a/server/model-user/test/fixtures.js
+++ /dev/null
@@ -1,36 +0,0 @@
-module.exports = {
-  user: {
-    type: 'user',
-    username: 'testuser',
-    email: 'test@example.com',
-    password: 'test',
-  },
-
-  updatedUser: {
-    username: 'changeduser',
-    email: 'changed@example.com',
-    password: 'changed',
-  },
-
-  otherUser: {
-    type: 'user',
-    username: 'anotheruser',
-    email: 'another@example.com',
-    password: 'rubgy',
-  },
-
-  localIdentity: {
-    name: 'Someone',
-    aff: 'University of PubSweet',
-    type: 'local',
-  },
-
-  externalIdentity: {
-    type: 'external',
-    identifier: 'orcid',
-    oauth: {
-      accessToken: 'someAccessToken',
-      refreshToken: 'someRefreshToken',
-    },
-  },
-}
diff --git a/server/model-user/test/helpers/authsome_mode.js b/server/model-user/test/helpers/authsome_mode.js
deleted file mode 100644
index 0f156436b8ab761c0fc37453b3661b238cda1d5b..0000000000000000000000000000000000000000
--- a/server/model-user/test/helpers/authsome_mode.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = async (userId, operation, object, context) => true
diff --git a/server/model-user/test/identity_test.js b/server/model-user/test/identity_test.js
deleted file mode 100644
index 18d6aaf004e64146a045b09e42f2d7e052124fb7..0000000000000000000000000000000000000000
--- a/server/model-user/test/identity_test.js
+++ /dev/null
@@ -1,80 +0,0 @@
-const { dbCleaner } = require('pubsweet-server/test')
-const fixtures = require('./fixtures')
-const Identity = require('../src/identity')
-const User = require('../src/user')
-
-describe('Identity', () => {
-  beforeEach(async () => {
-    await dbCleaner()
-  })
-
-  it('can create a user with a default local identity', async () => {
-    const user = await new User(fixtures.user).save()
-    const defaultIdentity = await new Identity({
-      ...fixtures.localIdentity,
-      userId: user.id,
-      isDefault: true,
-    }).save()
-
-    const savedUser = await User.find(user.id, { eager: 'defaultIdentity' })
-    expect(savedUser.defaultIdentity).toEqual(defaultIdentity)
-  })
-
-  it('can create a user with a local and a default oauth identity', async () => {
-    let user = await new User(fixtures.user).save()
-
-    const localIdentity = await new Identity({
-      ...fixtures.localIdentity,
-      userId: user.id,
-    }).save()
-
-    const externalIdentity = await new Identity({
-      ...fixtures.externalIdentity,
-      userId: user.id,
-      isDefault: true,
-    }).save()
-
-    user = await User.find(user.id, { eager: '[identities, defaultIdentity]' })
-
-    expect(user.identities).toContainEqual(localIdentity)
-    expect(user.identities).toContainEqual(externalIdentity)
-    expect(user.defaultIdentity).toEqual(externalIdentity)
-  })
-
-  it('user can not have more than one default identities', async () => {
-    const user = await new User(fixtures.user).save()
-
-    await new Identity({
-      ...fixtures.localIdentity,
-      userId: user.id,
-      isDefault: true,
-    }).save()
-
-    const externalIdentity = new Identity({
-      ...fixtures.externalIdentity,
-      userId: user.id,
-      isDefault: true,
-    }).save()
-
-    await expect(externalIdentity).rejects.toThrow('violates unique constraint')
-  })
-
-  it('can have multiple non-default identities (isDefault = false)', async () => {
-    const user = await new User(fixtures.user).save()
-
-    await new Identity({
-      ...fixtures.localIdentity,
-      userId: user.id,
-      isDefault: false,
-    }).save()
-
-    await new Identity({
-      ...fixtures.externalIdentity,
-      userId: user.id,
-      isDefault: false,
-    }).save()
-
-    const foundUser = await User.find(user.id, { eager: 'identities' })
-    expect(foundUser.identities).toHaveLength(2)
-  })
-})
diff --git a/server/model-user/test/index.js b/server/model-user/test/index.js
deleted file mode 100644
index b471deb5bba58deb1ee350994a8aa45bd3f62bf9..0000000000000000000000000000000000000000
--- a/server/model-user/test/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  fixtures: require('./fixtures'),
-}
diff --git a/server/model-user/test/jest-setup.js b/server/model-user/test/jest-setup.js
deleted file mode 100644
index 7de2beed55c538a4a39fe8495b07dde62f6db5f9..0000000000000000000000000000000000000000
--- a/server/model-user/test/jest-setup.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const path = require('path')
-
-process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
diff --git a/server/model-user/test/user_graphql_test.js b/server/model-user/test/user_graphql_test.js
deleted file mode 100644
index 63400ad898333315af513350c41a136e709d4c67..0000000000000000000000000000000000000000
--- a/server/model-user/test/user_graphql_test.js
+++ /dev/null
@@ -1,133 +0,0 @@
-process.env.NODE_CONFIG = `{"pubsweet":{
-  "components":[
-    "@pubsweet/model-user",
-    "@pubsweet/model-team"
-  ]
-}}`
-
-const User = require('../src/user')
-const { dbCleaner, api } = require('pubsweet-server/test')
-
-const { fixtures } = require('@pubsweet/model-user/test')
-const authentication = require('pubsweet-server/src/authentication')
-
-describe('User mutations', () => {
-  beforeEach(async () => {
-    await dbCleaner()
-  })
-
-  it('a user can sign up', async () => {
-    const { body } = await api.graphql.query(
-      `mutation($input: UserInput) {
-        createUser(input: $input) {
-          username
-          defaultIdentity {
-            ... on Local {
-              email
-            }
-          }
-        }
-      }`,
-      {
-        input: {
-          username: 'hi',
-          email: 'hi@example.com',
-          password: 'hello',
-        },
-      },
-    )
-
-    expect(body).toEqual({
-      data: {
-        createUser: {
-          username: 'hi',
-          defaultIdentity: {
-            email: 'hi@example.com',
-          },
-        },
-      },
-    })
-  })
-
-  it('errors when duplicate username or emails are used', async () => {
-    await api.graphql.query(
-      `mutation($input: UserInput) {
-        createUser(input: $input) {
-          username
-        }
-      }`,
-      {
-        input: {
-          username: 'hi',
-          email: 'hi@example.com',
-          password: 'hello',
-        },
-      },
-    )
-
-    const { body: body2 } = await api.graphql.query(
-      `mutation($input: UserInput) {
-        createUser(input: $input) {
-          username
-        }
-      }`,
-      {
-        input: {
-          username: 'hi',
-          email: 'hi@example.com',
-          password: 'hello',
-        },
-      },
-    )
-
-    expect(body2).toEqual({
-      data: {
-        createUser: null,
-      },
-      errors: [
-        {
-          extensions: {
-            code: 'INTERNAL_SERVER_ERROR',
-          },
-          message: 'User with this username or email already exists',
-          name: 'ConflictError',
-        },
-      ],
-    })
-  })
-
-  it('a user can update a password', async () => {
-    const user = await new User(fixtures.user).save()
-    const token = authentication.token.create(user)
-
-    const { body } = await api.graphql.query(
-      `mutation($id: ID, $input: UserInput) {
-        updateUser(id: $id, input: $input) {
-          username
-        }
-      }`,
-      {
-        id: user.id,
-        input: {
-          username: 'hi',
-          email: 'hi@example.com',
-          password: 'hello2',
-        },
-      },
-      token,
-    )
-
-    expect(body).toEqual({
-      data: {
-        updateUser: {
-          username: 'hi',
-        },
-      },
-    })
-
-    const oldHash = user.passwordHash
-    const newHash = await User.find(user.id).passwordHash
-
-    expect(oldHash).not.toEqual(newHash)
-  })
-})
diff --git a/server/model-user/test/user_test.js b/server/model-user/test/user_test.js
deleted file mode 100644
index d09e9fbd73a7cd324e126feda881adde9e3a78d6..0000000000000000000000000000000000000000
--- a/server/model-user/test/user_test.js
+++ /dev/null
@@ -1,136 +0,0 @@
-const { dbCleaner } = require('pubsweet-server/test')
-const fixtures = require('./fixtures')
-const User = require('../src/user')
-
-describe('User', () => {
-  beforeEach(async () => {
-    await dbCleaner()
-  })
-
-  it('validates passwords correctly after saving to db', async () => {
-    const user = new User(fixtures.user)
-    await user.save()
-
-    const savedUser = await User.findByUsername(user.username)
-    expect(typeof savedUser).toBe('object')
-
-    const shouldBeValid = await savedUser.validPassword(fixtures.user.password)
-    expect(shouldBeValid).toEqual(true)
-
-    const shouldBeInvalid = await savedUser.validPassword('wrongpassword')
-    expect(shouldBeInvalid).toEqual(false)
-  })
-
-  it('raises an error if trying to save a user with a non-unique username', async () => {
-    const user = new User(fixtures.user)
-    const otherUserFixture = fixtures.otherUser
-    otherUserFixture.username = fixtures.user.username
-    const duplicateUser = new User(otherUserFixture)
-
-    await user.save()
-    await expect(duplicateUser.save()).rejects.toThrow(
-      'violates unique constraint',
-    )
-
-    expect.hasAssertions()
-  })
-
-  it('raises an error if trying to save a user with a non-unique email', async () => {
-    const user = new User(fixtures.user)
-    const otherUserFixture = fixtures.otherUser
-    otherUserFixture.email = fixtures.user.email
-    const duplicateUser = new User(otherUserFixture)
-
-    await user.save()
-    await expect(duplicateUser.save()).rejects.toThrow(
-      'violates unique constraint',
-    )
-
-    expect.hasAssertions()
-  })
-
-  it('uses custom JSON serialization', async () => {
-    const user = new User(fixtures.user)
-    await user.save()
-
-    const savedUser = await User.findByUsername(user.username)
-    expect(savedUser).toHaveProperty('username', user.username)
-    expect(savedUser).toHaveProperty('passwordHash')
-
-    const stringifiedUser = JSON.parse(JSON.stringify(savedUser))
-    expect(stringifiedUser).toHaveProperty('username', user.username)
-    expect(stringifiedUser).not.toHaveProperty('passwordHash')
-  })
-
-  it('uses custom JSON serialization in an array', async () => {
-    const users = [
-      { username: 'user1', email: 'user-1@example.com', password: 'foo1' },
-      { username: 'user2', email: 'user-2@example.com', password: 'foo2' },
-      { username: 'user3', email: 'user-3@example.com', password: 'foo3' },
-    ]
-
-    await Promise.all(users.map(user => new User(user).save()))
-
-    const savedUsers = await User.all()
-
-    const savedUser = savedUsers[2]
-    expect(savedUser).toHaveProperty('username')
-    expect(savedUser).toHaveProperty('passwordHash')
-
-    const stringifiedUsers = JSON.parse(JSON.stringify(savedUsers))
-    const stringifiedUser = stringifiedUsers[2]
-
-    expect(stringifiedUser).toHaveProperty('username', savedUser.username)
-    expect(stringifiedUser).not.toHaveProperty('passwordHash')
-  })
-
-  it('finds a list of users', async () => {
-    const users = [
-      { username: 'user1', email: 'user-1@example.com', password: 'foo1' },
-      { username: 'user2', email: 'user-2@example.com', password: 'foo2' },
-      { username: 'user3', email: 'user-3@example.com', password: 'foo3' },
-    ]
-
-    await Promise.all(users.map(user => new User(user).save()))
-
-    const items = await User.findByField('email', 'user-1@example.com')
-
-    expect(items).toHaveLength(1)
-    expect(items[0]).toBeInstanceOf(User)
-  })
-
-  it('finds a single user by field', async () => {
-    const users = [
-      { username: 'user1', email: 'user-1@example.com', password: 'foo1' },
-      { username: 'user2', email: 'user-2@example.com', password: 'foo2' },
-      { username: 'user3', email: 'user-3@example.com', password: 'foo3' },
-    ]
-
-    await Promise.all(users.map(user => new User(user).save()))
-
-    const item = await User.findOneByField('email', 'user-1@example.com')
-
-    expect(item).toBeInstanceOf(User)
-
-    expect(item).toEqual(
-      expect.objectContaining({
-        username: 'user1',
-        email: 'user-1@example.com',
-      }),
-    )
-  })
-
-  it('fails password verification if passwordHash is not present', async () => {
-    const fixtureWithoutPassword = Object.assign({}, fixtures.user)
-    delete fixtureWithoutPassword.password
-
-    const user = await new User(fixtureWithoutPassword).save()
-
-    const validPassword1 = await user.validPassword(undefined)
-    expect(validPassword1).toEqual(false)
-    const validPassword2 = await user.validPassword(null)
-    expect(validPassword2).toEqual(false)
-    const validPassword3 = await user.validPassword('somethingfunky')
-    expect(validPassword3).toEqual(false)
-  })
-})
diff --git a/server/subscriptions.js b/server/subscriptions.js
index f2a234b6bda4cb6893e30699948a3b7d9e713a59..f4f2de1fbfde074e091a91a262ae0d83c7251b7a 100644
--- a/server/subscriptions.js
+++ b/server/subscriptions.js
@@ -11,7 +11,7 @@ const { token } = require('pubsweet-server/src/authentication') // TODO: Fix imp
 
 module.exports = {
   addSubscriptions: server => {
-    const connectors = require('pubsweet-server/src/connectors')
+    const models = require('@pubsweet/models')
     const helpers = require('pubsweet-server/src/helpers/authorization')
 
     const { User } = require('@pubsweet/models')
@@ -31,23 +31,25 @@ module.exports = {
                 reject(new Error('Bad auth token'))
               }
 
-              resolve({ user: id, connectors, helpers })
+              resolve({ userId: id, models, helpers })
             })
           })
-          console.log('I AM ALIVE!')
           // Record a user's online status
-          await User.query()
-            .update({ online: true })
-            .where('id', addTocontext.user)
+          const user = await User.query().updateAndFetchById(
+            addTocontext.userId,
+            { online: true },
+          )
+
+          addTocontext.user = user
           return addTocontext
         },
         onDisconnect: async (webSocket, context) => {
           const initialContext = await context.initPromise
           // Record that a user is no longer online
-          if (initialContext.user) {
+          if (initialContext.user && initialContext.user.id) {
             await User.query()
               .update({ online: false })
-              .where('id', initialContext.user)
+              .where('id', initialContext.user.id)
           }
         },
       },
diff --git a/server/wax-collab/server-util.js b/server/wax-collab/server-util.js
index ea3df4e5f9d2b4e3b877ac92279b5fe0a194269f..f6e4038b37d39061a3c7a0b0e51755c01d1c5114 100644
--- a/server/wax-collab/server-util.js
+++ b/server/wax-collab/server-util.js
@@ -1,3 +1,4 @@
+/* eslint-disable */
 const Y = require('yjs')
 const syncProtocol = require('y-protocols/dist/sync.cjs')
 const awarenessProtocol = require('y-protocols/dist/awareness.cjs')
diff --git a/webpack/webpack.config.js b/webpack/webpack.config.js
index 739716e10f9376ce71e20935a0d93da78921f148..0f9449a6d39e559a60b3ad841f007cafe8077143 100644
--- a/webpack/webpack.config.js
+++ b/webpack/webpack.config.js
@@ -39,6 +39,7 @@ module.exports = webpackEnv => {
         '/graphql': 'http://localhost:3000',
         '/uploads': 'http://locahost:3000',
         '/static/profiles': 'http://localhost:3000',
+        '/public': 'http://localhost:3000',
       },
       historyApiFallback: true,
     },
diff --git a/yarn.lock b/yarn.lock
index 6e987ccce202abb117114de15cc8fcb8f161f0ea..7f7ed6a8d66ffc574717b5fb5ba1eafeca60d319 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,24 @@
 # yarn lockfile v1
 
 
+"@apollo/client@^3.0.2":
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.0.2.tgz#fadb2b39a0e32950baaef2566442cb3f6de74a52"
+  integrity sha512-4ighan5Anlj4tK/tdUHs4Mi1njqXZ7AxRCVolz/H702DjPphAJfm+FRkIadPTmwz+OLO+d+tX+6V1VBshf02rg==
+  dependencies:
+    "@types/zen-observable" "^0.8.0"
+    "@wry/context" "^0.5.2"
+    "@wry/equality" "^0.1.9"
+    fast-json-stable-stringify "^2.0.0"
+    graphql-tag "^2.10.4"
+    hoist-non-react-statics "^3.3.2"
+    optimism "^0.12.1"
+    prop-types "^15.7.2"
+    symbol-observable "^1.2.0"
+    ts-invariant "^0.4.4"
+    tslib "^1.10.0"
+    zen-observable "^0.8.14"
+
 "@apollo/protobufjs@^1.0.3":
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.4.tgz#cf01747a55359066341f31b5ce8db17df44244e0"
@@ -77,406 +95,426 @@
   dependencies:
     apollo-env "^0.6.5"
 
-"@apollographql/graphql-playground-html@1.6.24":
-  version "1.6.24"
-  resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz#3ce939cb127fb8aaa3ffc1e90dff9b8af9f2e3dc"
-  integrity sha512-8GqG48m1XqyXh4mIZrtB5xOhUwSsh1WsrrsaZQOEYYql3YN9DEu9OOSg0ILzXHZo/h2Q74777YE4YzlArQzQEQ==
+"@apollographql/graphql-playground-html@1.6.26":
+  version "1.6.26"
+  resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz#2f7b610392e2a872722912fc342b43cf8d641cb3"
+  integrity sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==
+  dependencies:
+    xss "^1.0.6"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1", "@babel/code-frame@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
+  integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
+  dependencies:
+    "@babel/highlight" "^7.10.4"
 
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.10.1":
+"@babel/code-frame@^7.0.0-beta.35":
   version "7.10.1"
   resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff"
   integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==
   dependencies:
     "@babel/highlight" "^7.10.1"
 
-"@babel/compat-data@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db"
-  integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==
+"@babel/compat-data@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.5.tgz#d38425e67ea96b1480a3f50404d1bf85676301a6"
+  integrity sha512-mPVoWNzIpYJHbWje0if7Ck36bpbtTvIxOi9+6WSK9wjGEXearAqlwBoTQvVjsAY2VIwgcs8V940geY3okzRCEw==
   dependencies:
     browserslist "^4.12.0"
     invariant "^2.2.4"
     semver "^5.5.0"
 
 "@babel/core@^7.0.0":
-  version "7.10.2"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a"
-  integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==
-  dependencies:
-    "@babel/code-frame" "^7.10.1"
-    "@babel/generator" "^7.10.2"
-    "@babel/helper-module-transforms" "^7.10.1"
-    "@babel/helpers" "^7.10.1"
-    "@babel/parser" "^7.10.2"
-    "@babel/template" "^7.10.1"
-    "@babel/traverse" "^7.10.1"
-    "@babel/types" "^7.10.2"
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.5.tgz#1f15e2cca8ad9a1d78a38ddba612f5e7cdbbd330"
+  integrity sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/generator" "^7.10.5"
+    "@babel/helper-module-transforms" "^7.10.5"
+    "@babel/helpers" "^7.10.4"
+    "@babel/parser" "^7.10.5"
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.5"
+    "@babel/types" "^7.10.5"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.1"
     json5 "^2.1.2"
-    lodash "^4.17.13"
+    lodash "^4.17.19"
     resolve "^1.3.2"
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.10.1", "@babel/generator@^7.10.2":
-  version "7.10.2"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9"
-  integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==
+"@babel/generator@^7.10.1", "@babel/generator@^7.10.5":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69"
+  integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==
   dependencies:
-    "@babel/types" "^7.10.2"
+    "@babel/types" "^7.10.5"
     jsesc "^2.5.1"
-    lodash "^4.17.13"
     source-map "^0.5.0"
 
-"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.1":
+"@babel/helper-annotate-as-pure@^7.0.0":
   version "7.10.1"
   resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268"
   integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==
   dependencies:
     "@babel/types" "^7.10.1"
 
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059"
-  integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==
+"@babel/helper-annotate-as-pure@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
+  integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==
   dependencies:
-    "@babel/helper-explode-assignable-expression" "^7.10.1"
-    "@babel/types" "^7.10.1"
+    "@babel/types" "^7.10.4"
 
-"@babel/helper-builder-react-jsx-experimental@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8"
-  integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3"
+  integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.1"
-    "@babel/helper-module-imports" "^7.10.1"
-    "@babel/types" "^7.10.1"
+    "@babel/helper-explode-assignable-expression" "^7.10.4"
+    "@babel/types" "^7.10.4"
 
-"@babel/helper-builder-react-jsx@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz#a327f0cf983af5554701b1215de54a019f09b532"
-  integrity sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==
+"@babel/helper-builder-react-jsx-experimental@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz#f35e956a19955ff08c1258e44a515a6d6248646b"
+  integrity sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.1"
-    "@babel/types" "^7.10.1"
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-module-imports" "^7.10.4"
+    "@babel/types" "^7.10.5"
 
-"@babel/helper-compilation-targets@^7.10.2":
-  version "7.10.2"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285"
-  integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==
+"@babel/helper-builder-react-jsx@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d"
+  integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-compilation-targets@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2"
+  integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==
   dependencies:
-    "@babel/compat-data" "^7.10.1"
+    "@babel/compat-data" "^7.10.4"
     browserslist "^4.12.0"
     invariant "^2.2.4"
     levenary "^1.1.1"
     semver "^5.5.0"
 
-"@babel/helper-create-class-features-plugin@^7.10.1":
-  version "7.10.2"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67"
-  integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==
-  dependencies:
-    "@babel/helper-function-name" "^7.10.1"
-    "@babel/helper-member-expression-to-functions" "^7.10.1"
-    "@babel/helper-optimise-call-expression" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/helper-replace-supers" "^7.10.1"
-    "@babel/helper-split-export-declaration" "^7.10.1"
-
-"@babel/helper-create-regexp-features-plugin@^7.10.1", "@babel/helper-create-regexp-features-plugin@^7.8.3":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd"
-  integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.1"
-    "@babel/helper-regex" "^7.10.1"
+"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
+  integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==
+  dependencies:
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-member-expression-to-functions" "^7.10.5"
+    "@babel/helper-optimise-call-expression" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+
+"@babel/helper-create-regexp-features-plugin@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8"
+  integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-regex" "^7.10.4"
     regexpu-core "^4.7.0"
 
-"@babel/helper-define-map@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d"
-  integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==
-  dependencies:
-    "@babel/helper-function-name" "^7.10.1"
-    "@babel/types" "^7.10.1"
-    lodash "^4.17.13"
-
-"@babel/helper-explode-assignable-expression@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e"
-  integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==
-  dependencies:
-    "@babel/traverse" "^7.10.1"
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-function-name@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4"
-  integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==
-  dependencies:
-    "@babel/helper-get-function-arity" "^7.10.1"
-    "@babel/template" "^7.10.1"
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-get-function-arity@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d"
-  integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==
-  dependencies:
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-hoist-variables@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077"
-  integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==
-  dependencies:
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-member-expression-to-functions@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15"
-  integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==
-  dependencies:
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876"
-  integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==
-  dependencies:
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-module-transforms@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622"
-  integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==
-  dependencies:
-    "@babel/helper-module-imports" "^7.10.1"
-    "@babel/helper-replace-supers" "^7.10.1"
-    "@babel/helper-simple-access" "^7.10.1"
-    "@babel/helper-split-export-declaration" "^7.10.1"
-    "@babel/template" "^7.10.1"
-    "@babel/types" "^7.10.1"
-    lodash "^4.17.13"
-
-"@babel/helper-optimise-call-expression@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543"
-  integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==
-  dependencies:
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127"
-  integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==
-
-"@babel/helper-regex@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96"
-  integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==
-  dependencies:
-    lodash "^4.17.13"
-
-"@babel/helper-remap-async-to-generator@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432"
-  integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.1"
-    "@babel/helper-wrap-function" "^7.10.1"
-    "@babel/template" "^7.10.1"
-    "@babel/traverse" "^7.10.1"
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-replace-supers@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d"
-  integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==
-  dependencies:
-    "@babel/helper-member-expression-to-functions" "^7.10.1"
-    "@babel/helper-optimise-call-expression" "^7.10.1"
-    "@babel/traverse" "^7.10.1"
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-simple-access@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e"
-  integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==
-  dependencies:
-    "@babel/template" "^7.10.1"
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-split-export-declaration@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f"
-  integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==
+"@babel/helper-define-map@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30"
+  integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==
+  dependencies:
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/types" "^7.10.5"
+    lodash "^4.17.19"
+
+"@babel/helper-explode-assignable-expression@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c"
+  integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==
+  dependencies:
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
+  integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
   dependencies:
-    "@babel/types" "^7.10.1"
-
-"@babel/helper-validator-identifier@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5"
-  integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==
-
-"@babel/helper-wrap-function@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9"
-  integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==
-  dependencies:
-    "@babel/helper-function-name" "^7.10.1"
-    "@babel/template" "^7.10.1"
-    "@babel/traverse" "^7.10.1"
-    "@babel/types" "^7.10.1"
-
-"@babel/helpers@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973"
-  integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==
-  dependencies:
-    "@babel/template" "^7.10.1"
-    "@babel/traverse" "^7.10.1"
-    "@babel/types" "^7.10.1"
-
-"@babel/highlight@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0"
-  integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==
-  dependencies:
-    "@babel/helper-validator-identifier" "^7.10.1"
+    "@babel/helper-get-function-arity" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-get-function-arity@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
+  integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-hoist-variables@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e"
+  integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee"
+  integrity sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==
+  dependencies:
+    "@babel/types" "^7.10.5"
+
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
+  integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz#120c271c0b3353673fcdfd8c053db3c544a260d6"
+  integrity sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==
+  dependencies:
+    "@babel/helper-module-imports" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
+    "@babel/helper-simple-access" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.5"
+    lodash "^4.17.19"
+
+"@babel/helper-optimise-call-expression@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
+  integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
+  integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
+
+"@babel/helper-regex@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0"
+  integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==
+  dependencies:
+    lodash "^4.17.19"
+
+"@babel/helper-remap-async-to-generator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5"
+  integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-wrap-function" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-replace-supers@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
+  integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.10.4"
+    "@babel/helper-optimise-call-expression" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-simple-access@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
+  integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
+  dependencies:
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-split-export-declaration@^7.10.1", "@babel/helper-split-export-declaration@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1"
+  integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-validator-identifier@^7.10.1", "@babel/helper-validator-identifier@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
+  integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
+
+"@babel/helper-wrap-function@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
+  integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==
+  dependencies:
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helpers@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044"
+  integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==
+  dependencies:
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/highlight@^7.10.1", "@babel/highlight@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
+  integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.10.4"
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.10.1", "@babel/parser@^7.10.2", "@babel/parser@^7.7.0":
+"@babel/parser@^7.10.1", "@babel/parser@^7.10.4", "@babel/parser@^7.10.5":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b"
+  integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==
+
+"@babel/parser@^7.7.0":
   version "7.10.2"
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0"
   integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==
 
-"@babel/plugin-proposal-async-generator-functions@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55"
-  integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==
+"@babel/plugin-proposal-async-generator-functions@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558"
+  integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/helper-remap-async-to-generator" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-remap-async-to-generator" "^7.10.4"
     "@babel/plugin-syntax-async-generators" "^7.8.0"
 
-"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01"
-  integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==
+"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807"
+  integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-create-class-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/plugin-proposal-decorators@^7.0.0":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz#9373c2d8db45345c6e30452ad77b469758e5c8f7"
-  integrity sha512-xBfteh352MTke2U1NpclzMDmAmCdQ2fBZjhZQQfGTjXw6qcRYMkt528sA1U8o0ThDCSeuETXIj5bOGdxN+5gkw==
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz#42898bba478bc4b1ae242a703a953a7ad350ffb4"
+  integrity sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-syntax-decorators" "^7.10.1"
+    "@babel/helper-create-class-features-plugin" "^7.10.5"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-decorators" "^7.10.4"
 
-"@babel/plugin-proposal-dynamic-import@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0"
-  integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==
+"@babel/plugin-proposal-dynamic-import@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e"
+  integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/plugin-syntax-dynamic-import" "^7.8.0"
 
 "@babel/plugin-proposal-export-namespace-from@^7.0.0":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.1.tgz#512ee069cd866256600bdf89639cf7e1b51fbfe9"
-  integrity sha512-eR4CoYb6mh5y9LWjnb4CyUatuhtZ8pNLXLDi46GkqtF7WPafFqXycHdvF5qWviozZVGRSAmHzdayc8wUReCdjA==
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54"
+  integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
 
 "@babel/plugin-proposal-function-sent@^7.0.0":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.10.1.tgz#e9ffe9df5348e2694d6679f8fd0897acf14326d7"
-  integrity sha512-mpfEbRcwHvDA6k19ZFsGkW4Q+AF7DekafKTTfn2Ihz1cs6/qL+KgAJlcHBY6XnW1OW1zDaNCR0i28Blonl8/Bg==
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.10.4.tgz#05f2daef7b3f09b6c74c9e8a85b430272d206ac4"
+  integrity sha512-aBtve/DhQsVPAGnSDcgt33gF36rO0TK+KtHp9Hwtj3KwH+o1Cii9vfVVYeB9c6Jo1SXOgTRwRD7ljpTS0qbN8w==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/helper-wrap-function" "^7.10.1"
-    "@babel/plugin-syntax-function-sent" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-wrap-function" "^7.10.4"
+    "@babel/plugin-syntax-function-sent" "^7.10.4"
 
-"@babel/plugin-proposal-json-strings@^7.0.0", "@babel/plugin-proposal-json-strings@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09"
-  integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==
+"@babel/plugin-proposal-json-strings@^7.0.0", "@babel/plugin-proposal-json-strings@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db"
+  integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/plugin-syntax-json-strings" "^7.8.0"
 
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78"
-  integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a"
+  integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
 
-"@babel/plugin-proposal-numeric-separator@^7.0.0", "@babel/plugin-proposal-numeric-separator@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123"
-  integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==
+"@babel/plugin-proposal-numeric-separator@^7.0.0", "@babel/plugin-proposal-numeric-separator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06"
+  integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-syntax-numeric-separator" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
 
-"@babel/plugin-proposal-object-rest-spread@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6"
-  integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==
+"@babel/plugin-proposal-object-rest-spread@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz#50129ac216b9a6a55b3853fdd923e74bf553a4c0"
+  integrity sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
-    "@babel/plugin-transform-parameters" "^7.10.1"
+    "@babel/plugin-transform-parameters" "^7.10.4"
 
-"@babel/plugin-proposal-optional-catch-binding@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2"
-  integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==
+"@babel/plugin-proposal-optional-catch-binding@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd"
+  integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
 
-"@babel/plugin-proposal-optional-chaining@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c"
-  integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==
+"@babel/plugin-proposal-optional-chaining@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz#750f1255e930a1f82d8cdde45031f81a0d0adff7"
+  integrity sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
     "@babel/plugin-syntax-optional-chaining" "^7.8.0"
 
-"@babel/plugin-proposal-private-methods@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598"
-  integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==
+"@babel/plugin-proposal-private-methods@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909"
+  integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-create-class-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/plugin-proposal-throw-expressions@^7.0.0":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.10.1.tgz#89bde971b6081bfecff832c811ad76c2337c6970"
-  integrity sha512-wyhTn1ebUbbphDJVVUpg1wikUOIW8Lg93ng0aDGv07+MxINPS4d0ju68JVH06W4oMnZTwgELA5AImrah9RULYA==
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.10.4.tgz#501154a3c1b33cb1ad5b899204481fa2859cd3f3"
+  integrity sha512-m7K9duXeH/rko36i9G9seLOg2AVdeVTn65k8nnTxgozex0hkDSUr6cktJxTO7jElGEpmMz410pTs0Jn8+empxw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-syntax-throw-expressions" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-throw-expressions" "^7.10.4"
 
-"@babel/plugin-proposal-unicode-property-regex@^7.10.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f"
-  integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==
+"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d"
+  integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/plugin-syntax-async-generators@^7.8.0":
   version "7.8.4"
@@ -485,19 +523,19 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-class-properties@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5"
-  integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==
+"@babel/plugin-syntax-class-properties@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c"
+  integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-syntax-decorators@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz#16b869c4beafc9a442565147bda7ce0967bd4f13"
-  integrity sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g==
+"@babel/plugin-syntax-decorators@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c"
+  integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.0":
   version "7.8.3"
@@ -513,19 +551,19 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-syntax-function-sent@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.10.1.tgz#42a03af38dd7f46121c97c67d032da4749792478"
-  integrity sha512-Ze/5A9mFucmT7UyEA8D60YijmclEZQp3kjzbbEImWnyMLmjE/3S5x7lkCr+W7g2wc00nqk1QLsloa4+1EiHULA==
+"@babel/plugin-syntax-function-sent@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.10.4.tgz#b551f38b629e2e20908e53624f96f9ab300f5061"
+  integrity sha512-dwElaRoDQhlVevbgKOlEUTe08QNJo4ZjWw3rqnMbEvH8NRJM+iPN2tTQtzyfNloXD8f3Jdiyf5Pn400B1U3SVA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/plugin-syntax-import-meta@^7.0.0":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz#3e59120ed8b3c2ccc5abb1cfc7aaa3ea01cd36b6"
-  integrity sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ==
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+  integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/plugin-syntax-json-strings@^7.8.0":
   version "7.8.3"
@@ -534,12 +572,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-jsx@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da"
-  integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==
+"@babel/plugin-syntax-jsx@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c"
+  integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
   version "7.8.3"
@@ -548,12 +586,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-numeric-separator@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99"
-  integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+  integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/plugin-syntax-object-rest-spread@^7.8.0":
   version "7.8.3"
@@ -576,393 +614,392 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-throw-expressions@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.10.1.tgz#09a88bacf2ad8af7a465af5e910a61d93136b147"
-  integrity sha512-1ieYCCX6HCEvBefYt1Njja2XFrbThi2pffdfpPeB7WzVwbX/UlVOrPw9WSPQyVoyo+kqO0l/KGRNZyrTKo0bew==
+"@babel/plugin-syntax-throw-expressions@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.10.4.tgz#a588df9fa2203207a3ac7e35f0db3b67bf68eca3"
+  integrity sha512-Yac/4W71+JdAiOV3aLbnUUe2R0NZzNvdy5EqdauFnBQTxIXT58M89lOplIFVELTSus6PxFMjmbi2vXaJDiV/PQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-syntax-top-level-await@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362"
-  integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==
+"@babel/plugin-syntax-top-level-await@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d"
+  integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-arrow-functions@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b"
-  integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==
+"@babel/plugin-transform-arrow-functions@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd"
+  integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-async-to-generator@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062"
-  integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==
+"@babel/plugin-transform-async-to-generator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37"
+  integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==
   dependencies:
-    "@babel/helper-module-imports" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/helper-remap-async-to-generator" "^7.10.1"
+    "@babel/helper-module-imports" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-remap-async-to-generator" "^7.10.4"
 
-"@babel/plugin-transform-block-scoped-functions@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d"
-  integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==
+"@babel/plugin-transform-block-scoped-functions@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8"
+  integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-block-scoping@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e"
-  integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==
+"@babel/plugin-transform-block-scoping@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz#b81b8aafefbfe68f0f65f7ef397b9ece68a6037d"
+  integrity sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    lodash "^4.17.13"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-classes@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f"
-  integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==
+"@babel/plugin-transform-classes@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7"
+  integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.1"
-    "@babel/helper-define-map" "^7.10.1"
-    "@babel/helper-function-name" "^7.10.1"
-    "@babel/helper-optimise-call-expression" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/helper-replace-supers" "^7.10.1"
-    "@babel/helper-split-export-declaration" "^7.10.1"
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-define-map" "^7.10.4"
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-optimise-call-expression" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
     globals "^11.1.0"
 
-"@babel/plugin-transform-computed-properties@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07"
-  integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==
+"@babel/plugin-transform-computed-properties@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb"
+  integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-destructuring@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907"
-  integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==
+"@babel/plugin-transform-destructuring@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5"
+  integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-dotall-regex@^7.10.1", "@babel/plugin-transform-dotall-regex@^7.4.4":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee"
-  integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==
+"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee"
+  integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-duplicate-keys@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9"
-  integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==
+"@babel/plugin-transform-duplicate-keys@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47"
+  integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-exponentiation-operator@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3"
-  integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==
+"@babel/plugin-transform-exponentiation-operator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e"
+  integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==
   dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-for-of@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5"
-  integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==
+"@babel/plugin-transform-for-of@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9"
+  integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-function-name@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d"
-  integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==
+"@babel/plugin-transform-function-name@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7"
+  integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==
   dependencies:
-    "@babel/helper-function-name" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-literals@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a"
-  integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==
+"@babel/plugin-transform-literals@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c"
+  integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-member-expression-literals@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39"
-  integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==
+"@babel/plugin-transform-member-expression-literals@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7"
+  integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-modules-amd@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a"
-  integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==
+"@babel/plugin-transform-modules-amd@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1"
+  integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==
   dependencies:
-    "@babel/helper-module-transforms" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-module-transforms" "^7.10.5"
+    "@babel/helper-plugin-utils" "^7.10.4"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-commonjs@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301"
-  integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==
+"@babel/plugin-transform-modules-commonjs@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0"
+  integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==
   dependencies:
-    "@babel/helper-module-transforms" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/helper-simple-access" "^7.10.1"
+    "@babel/helper-module-transforms" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-simple-access" "^7.10.4"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-systemjs@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6"
-  integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==
+"@babel/plugin-transform-modules-systemjs@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85"
+  integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.10.1"
-    "@babel/helper-module-transforms" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-hoist-variables" "^7.10.4"
+    "@babel/helper-module-transforms" "^7.10.5"
+    "@babel/helper-plugin-utils" "^7.10.4"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-umd@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595"
-  integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==
+"@babel/plugin-transform-modules-umd@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e"
+  integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==
   dependencies:
-    "@babel/helper-module-transforms" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-module-transforms" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c"
-  integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6"
+  integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
+    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
 
-"@babel/plugin-transform-new-target@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324"
-  integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==
+"@babel/plugin-transform-new-target@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888"
+  integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-object-super@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde"
-  integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==
+"@babel/plugin-transform-object-super@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894"
+  integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/helper-replace-supers" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
 
-"@babel/plugin-transform-parameters@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd"
-  integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==
+"@babel/plugin-transform-parameters@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a"
+  integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-get-function-arity" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-property-literals@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d"
-  integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==
+"@babel/plugin-transform-property-literals@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0"
+  integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-react-display-name@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz#e6a33f6d48dfb213dda5e007d0c7ff82b6a3d8ef"
-  integrity sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==
+"@babel/plugin-transform-react-display-name@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d"
+  integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-react-jsx-development@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz#1ac6300d8b28ef381ee48e6fec430cc38047b7f3"
-  integrity sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg==
+"@babel/plugin-transform-react-jsx-development@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz#6ec90f244394604623880e15ebc3c34c356258ba"
+  integrity sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==
   dependencies:
-    "@babel/helper-builder-react-jsx-experimental" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-syntax-jsx" "^7.10.1"
+    "@babel/helper-builder-react-jsx-experimental" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-jsx" "^7.10.4"
 
-"@babel/plugin-transform-react-jsx-self@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821"
-  integrity sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA==
+"@babel/plugin-transform-react-jsx-self@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369"
+  integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-syntax-jsx" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-jsx" "^7.10.4"
 
-"@babel/plugin-transform-react-jsx-source@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz#30db3d4ee3cdebbb26a82a9703673714777a4273"
-  integrity sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==
+"@babel/plugin-transform-react-jsx-source@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4"
+  integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-syntax-jsx" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-jsx" "^7.10.4"
 
-"@babel/plugin-transform-react-jsx@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz#91f544248ba131486decb5d9806da6a6e19a2896"
-  integrity sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==
+"@babel/plugin-transform-react-jsx@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2"
+  integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==
   dependencies:
-    "@babel/helper-builder-react-jsx" "^7.10.1"
-    "@babel/helper-builder-react-jsx-experimental" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-syntax-jsx" "^7.10.1"
+    "@babel/helper-builder-react-jsx" "^7.10.4"
+    "@babel/helper-builder-react-jsx-experimental" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-jsx" "^7.10.4"
 
-"@babel/plugin-transform-react-pure-annotations@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz#f5e7c755d3e7614d4c926e144f501648a5277b70"
-  integrity sha512-mfhoiai083AkeewsBHUpaS/FM1dmUENHBMpS/tugSJ7VXqXO5dCN1Gkint2YvM1Cdv1uhmAKt1ZOuAjceKmlLA==
+"@babel/plugin-transform-react-pure-annotations@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501"
+  integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-regenerator@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490"
-  integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==
+"@babel/plugin-transform-regenerator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63"
+  integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==
   dependencies:
     regenerator-transform "^0.14.2"
 
-"@babel/plugin-transform-reserved-words@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86"
-  integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==
+"@babel/plugin-transform-reserved-words@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd"
+  integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-shorthand-properties@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3"
-  integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==
+"@babel/plugin-transform-shorthand-properties@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6"
+  integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-spread@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8"
-  integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==
+"@babel/plugin-transform-spread@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz#4e2c85ea0d6abaee1b24dcfbbae426fe8d674cff"
+  integrity sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-sticky-regex@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00"
-  integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==
+"@babel/plugin-transform-sticky-regex@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d"
+  integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/helper-regex" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-regex" "^7.10.4"
 
-"@babel/plugin-transform-template-literals@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628"
-  integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==
+"@babel/plugin-transform-template-literals@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c"
+  integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-typeof-symbol@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e"
-  integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==
+"@babel/plugin-transform-typeof-symbol@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc"
+  integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-unicode-escapes@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940"
-  integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==
+"@babel/plugin-transform-unicode-escapes@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007"
+  integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
-"@babel/plugin-transform-unicode-regex@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f"
-  integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==
+"@babel/plugin-transform-unicode-regex@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8"
+  integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
 
 "@babel/polyfill@^7.4.3":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.1.tgz#d56d4c8be8dd6ec4dce2649474e9b707089f739f"
-  integrity sha512-TviueJ4PBW5p48ra8IMtLXVkDucrlOZAIZ+EXqS3Ot4eukHbWiqcn7DcqpA1k5PcKtmJ4Xl9xwdv6yQvvcA+3g==
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.4.tgz#915e5bfe61490ac0199008e35ca9d7d151a8e45a"
+  integrity sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg==
   dependencies:
     core-js "^2.6.5"
     regenerator-runtime "^0.13.4"
 
 "@babel/preset-env@^7.0.0":
-  version "7.10.2"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb"
-  integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==
-  dependencies:
-    "@babel/compat-data" "^7.10.1"
-    "@babel/helper-compilation-targets" "^7.10.2"
-    "@babel/helper-module-imports" "^7.10.1"
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-proposal-async-generator-functions" "^7.10.1"
-    "@babel/plugin-proposal-class-properties" "^7.10.1"
-    "@babel/plugin-proposal-dynamic-import" "^7.10.1"
-    "@babel/plugin-proposal-json-strings" "^7.10.1"
-    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1"
-    "@babel/plugin-proposal-numeric-separator" "^7.10.1"
-    "@babel/plugin-proposal-object-rest-spread" "^7.10.1"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.10.1"
-    "@babel/plugin-proposal-optional-chaining" "^7.10.1"
-    "@babel/plugin-proposal-private-methods" "^7.10.1"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.10.1"
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.4.tgz#fbf57f9a803afd97f4f32e4f798bb62e4b2bef5f"
+  integrity sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==
+  dependencies:
+    "@babel/compat-data" "^7.10.4"
+    "@babel/helper-compilation-targets" "^7.10.4"
+    "@babel/helper-module-imports" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-proposal-async-generator-functions" "^7.10.4"
+    "@babel/plugin-proposal-class-properties" "^7.10.4"
+    "@babel/plugin-proposal-dynamic-import" "^7.10.4"
+    "@babel/plugin-proposal-json-strings" "^7.10.4"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4"
+    "@babel/plugin-proposal-numeric-separator" "^7.10.4"
+    "@babel/plugin-proposal-object-rest-spread" "^7.10.4"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.10.4"
+    "@babel/plugin-proposal-optional-chaining" "^7.10.4"
+    "@babel/plugin-proposal-private-methods" "^7.10.4"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.10.4"
     "@babel/plugin-syntax-async-generators" "^7.8.0"
-    "@babel/plugin-syntax-class-properties" "^7.10.1"
+    "@babel/plugin-syntax-class-properties" "^7.10.4"
     "@babel/plugin-syntax-dynamic-import" "^7.8.0"
     "@babel/plugin-syntax-json-strings" "^7.8.0"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-    "@babel/plugin-syntax-numeric-separator" "^7.10.1"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
     "@babel/plugin-syntax-optional-chaining" "^7.8.0"
-    "@babel/plugin-syntax-top-level-await" "^7.10.1"
-    "@babel/plugin-transform-arrow-functions" "^7.10.1"
-    "@babel/plugin-transform-async-to-generator" "^7.10.1"
-    "@babel/plugin-transform-block-scoped-functions" "^7.10.1"
-    "@babel/plugin-transform-block-scoping" "^7.10.1"
-    "@babel/plugin-transform-classes" "^7.10.1"
-    "@babel/plugin-transform-computed-properties" "^7.10.1"
-    "@babel/plugin-transform-destructuring" "^7.10.1"
-    "@babel/plugin-transform-dotall-regex" "^7.10.1"
-    "@babel/plugin-transform-duplicate-keys" "^7.10.1"
-    "@babel/plugin-transform-exponentiation-operator" "^7.10.1"
-    "@babel/plugin-transform-for-of" "^7.10.1"
-    "@babel/plugin-transform-function-name" "^7.10.1"
-    "@babel/plugin-transform-literals" "^7.10.1"
-    "@babel/plugin-transform-member-expression-literals" "^7.10.1"
-    "@babel/plugin-transform-modules-amd" "^7.10.1"
-    "@babel/plugin-transform-modules-commonjs" "^7.10.1"
-    "@babel/plugin-transform-modules-systemjs" "^7.10.1"
-    "@babel/plugin-transform-modules-umd" "^7.10.1"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
-    "@babel/plugin-transform-new-target" "^7.10.1"
-    "@babel/plugin-transform-object-super" "^7.10.1"
-    "@babel/plugin-transform-parameters" "^7.10.1"
-    "@babel/plugin-transform-property-literals" "^7.10.1"
-    "@babel/plugin-transform-regenerator" "^7.10.1"
-    "@babel/plugin-transform-reserved-words" "^7.10.1"
-    "@babel/plugin-transform-shorthand-properties" "^7.10.1"
-    "@babel/plugin-transform-spread" "^7.10.1"
-    "@babel/plugin-transform-sticky-regex" "^7.10.1"
-    "@babel/plugin-transform-template-literals" "^7.10.1"
-    "@babel/plugin-transform-typeof-symbol" "^7.10.1"
-    "@babel/plugin-transform-unicode-escapes" "^7.10.1"
-    "@babel/plugin-transform-unicode-regex" "^7.10.1"
+    "@babel/plugin-syntax-top-level-await" "^7.10.4"
+    "@babel/plugin-transform-arrow-functions" "^7.10.4"
+    "@babel/plugin-transform-async-to-generator" "^7.10.4"
+    "@babel/plugin-transform-block-scoped-functions" "^7.10.4"
+    "@babel/plugin-transform-block-scoping" "^7.10.4"
+    "@babel/plugin-transform-classes" "^7.10.4"
+    "@babel/plugin-transform-computed-properties" "^7.10.4"
+    "@babel/plugin-transform-destructuring" "^7.10.4"
+    "@babel/plugin-transform-dotall-regex" "^7.10.4"
+    "@babel/plugin-transform-duplicate-keys" "^7.10.4"
+    "@babel/plugin-transform-exponentiation-operator" "^7.10.4"
+    "@babel/plugin-transform-for-of" "^7.10.4"
+    "@babel/plugin-transform-function-name" "^7.10.4"
+    "@babel/plugin-transform-literals" "^7.10.4"
+    "@babel/plugin-transform-member-expression-literals" "^7.10.4"
+    "@babel/plugin-transform-modules-amd" "^7.10.4"
+    "@babel/plugin-transform-modules-commonjs" "^7.10.4"
+    "@babel/plugin-transform-modules-systemjs" "^7.10.4"
+    "@babel/plugin-transform-modules-umd" "^7.10.4"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4"
+    "@babel/plugin-transform-new-target" "^7.10.4"
+    "@babel/plugin-transform-object-super" "^7.10.4"
+    "@babel/plugin-transform-parameters" "^7.10.4"
+    "@babel/plugin-transform-property-literals" "^7.10.4"
+    "@babel/plugin-transform-regenerator" "^7.10.4"
+    "@babel/plugin-transform-reserved-words" "^7.10.4"
+    "@babel/plugin-transform-shorthand-properties" "^7.10.4"
+    "@babel/plugin-transform-spread" "^7.10.4"
+    "@babel/plugin-transform-sticky-regex" "^7.10.4"
+    "@babel/plugin-transform-template-literals" "^7.10.4"
+    "@babel/plugin-transform-typeof-symbol" "^7.10.4"
+    "@babel/plugin-transform-unicode-escapes" "^7.10.4"
+    "@babel/plugin-transform-unicode-regex" "^7.10.4"
     "@babel/preset-modules" "^0.1.3"
-    "@babel/types" "^7.10.2"
+    "@babel/types" "^7.10.4"
     browserslist "^4.12.0"
     core-js-compat "^3.6.2"
     invariant "^2.2.2"
@@ -981,22 +1018,22 @@
     esutils "^2.0.2"
 
 "@babel/preset-react@^7.0.0":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.1.tgz#e2ab8ae9a363ec307b936589f07ed753192de041"
-  integrity sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.10.1"
-    "@babel/plugin-transform-react-display-name" "^7.10.1"
-    "@babel/plugin-transform-react-jsx" "^7.10.1"
-    "@babel/plugin-transform-react-jsx-development" "^7.10.1"
-    "@babel/plugin-transform-react-jsx-self" "^7.10.1"
-    "@babel/plugin-transform-react-jsx-source" "^7.10.1"
-    "@babel/plugin-transform-react-pure-annotations" "^7.10.1"
-
-"@babel/runtime-corejs3@^7.8.3":
-  version "7.10.2"
-  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.2.tgz#3511797ddf9a3d6f3ce46b99cc835184817eaa4e"
-  integrity sha512-+a2M/u7r15o3dV1NEizr9bRi+KUVnrs/qYxF0Z06DAPx/4VCWaz1WA7EcbE+uqGgt39lp5akWGmHsTseIkHkHg==
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf"
+  integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-transform-react-display-name" "^7.10.4"
+    "@babel/plugin-transform-react-jsx" "^7.10.4"
+    "@babel/plugin-transform-react-jsx-development" "^7.10.4"
+    "@babel/plugin-transform-react-jsx-self" "^7.10.4"
+    "@babel/plugin-transform-react-jsx-source" "^7.10.4"
+    "@babel/plugin-transform-react-pure-annotations" "^7.10.4"
+
+"@babel/runtime-corejs3@^7.10.2":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz#a57fe6c13045ca33768a2aa527ead795146febe1"
+  integrity sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A==
   dependencies:
     core-js-pure "^3.0.0"
     regenerator-runtime "^0.13.4"
@@ -1008,23 +1045,30 @@
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
+"@babel/runtime@^7.0.0":
   version "7.10.2"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839"
   integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==
   dependencies:
     regenerator-runtime "^0.13.4"
 
-"@babel/template@^7.10.1":
-  version "7.10.1"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811"
-  integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.6":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c"
+  integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==
   dependencies:
-    "@babel/code-frame" "^7.10.1"
-    "@babel/parser" "^7.10.1"
-    "@babel/types" "^7.10.1"
+    regenerator-runtime "^0.13.4"
 
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.7.0":
+"@babel/template@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
+  integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/parser" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.7.0":
   version "7.10.1"
   resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27"
   integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==
@@ -1039,7 +1083,31 @@
     globals "^11.1.0"
     lodash "^4.17.13"
 
-"@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
+"@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564"
+  integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/generator" "^7.10.5"
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+    "@babel/parser" "^7.10.5"
+    "@babel/types" "^7.10.5"
+    debug "^4.1.0"
+    globals "^11.1.0"
+    lodash "^4.17.19"
+
+"@babel/types@^7.10.1", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.4.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15"
+  integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.10.4"
+    lodash "^4.17.19"
+    to-fast-properties "^2.0.0"
+
+"@babel/types@^7.7.0":
   version "7.10.2"
   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d"
   integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==
@@ -1268,26 +1336,33 @@
   dependencies:
     prosemirror-view "^1.5.1"
 
-"@hapi/address@^2.1.2":
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
-  integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==
+"@hapi/address@^4.0.1":
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.1.0.tgz#d60c5c0d930e77456fdcde2598e77302e2955e1d"
+  integrity sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ==
+  dependencies:
+    "@hapi/hoek" "^9.0.0"
 
-"@hapi/formula@^1.2.0":
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-1.2.0.tgz#994649c7fea1a90b91a0a1e6d983523f680e10cd"
-  integrity sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==
+"@hapi/formula@^2.0.0":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-2.0.0.tgz#edade0619ed58c8e4f164f233cda70211e787128"
+  integrity sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==
 
 "@hapi/hoek@6.x.x":
   version "6.2.4"
   resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-6.2.4.tgz#4b95fbaccbfba90185690890bdf1a2fbbda10595"
   integrity sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==
 
-"@hapi/hoek@^8.2.4", "@hapi/hoek@^8.3.0":
+"@hapi/hoek@^8.3.0":
   version "8.5.1"
   resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06"
   integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==
 
+"@hapi/hoek@^9.0.0":
+  version "9.0.4"
+  resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.0.4.tgz#e80ad4e8e8d2adc6c77d985f698447e8628b6010"
+  integrity sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==
+
 "@hapi/joi@^14.3.0", "@hapi/joi@^14.5.0":
   version "14.5.0"
   resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-14.5.0.tgz#197e06edbd90436150f7f02154a83d0a82753188"
@@ -1298,34 +1373,41 @@
     "@hapi/topo" "3.x.x"
     isemail "3.x.x"
 
-"@hapi/joi@^16.1.8":
-  version "16.1.8"
-  resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.8.tgz#84c1f126269489871ad4e2decc786e0adef06839"
-  integrity sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==
+"@hapi/joi@^17.1.1":
+  version "17.1.1"
+  resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-17.1.1.tgz#9cc8d7e2c2213d1e46708c6260184b447c661350"
+  integrity sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==
   dependencies:
-    "@hapi/address" "^2.1.2"
-    "@hapi/formula" "^1.2.0"
-    "@hapi/hoek" "^8.2.4"
-    "@hapi/pinpoint" "^1.0.2"
-    "@hapi/topo" "^3.1.3"
+    "@hapi/address" "^4.0.1"
+    "@hapi/formula" "^2.0.0"
+    "@hapi/hoek" "^9.0.0"
+    "@hapi/pinpoint" "^2.0.0"
+    "@hapi/topo" "^5.0.0"
 
 "@hapi/marker@1.x.x":
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/@hapi/marker/-/marker-1.0.0.tgz#65b0b2b01d1be06304886ce9b4b77b1bfb21a769"
   integrity sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA==
 
-"@hapi/pinpoint@^1.0.2":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-1.0.2.tgz#025b7a36dbbf4d35bf1acd071c26b20ef41e0d13"
-  integrity sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==
+"@hapi/pinpoint@^2.0.0":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-2.0.0.tgz#805b40d4dbec04fc116a73089494e00f073de8df"
+  integrity sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==
 
-"@hapi/topo@3.x.x", "@hapi/topo@^3.1.3":
+"@hapi/topo@3.x.x":
   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.3.0"
 
+"@hapi/topo@^5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7"
+  integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==
+  dependencies:
+    "@hapi/hoek" "^9.0.0"
+
 "@jimp/bmp@^0.13.0":
   version "0.13.0"
   resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.13.0.tgz#cca2301e56231e7dc20d5aba757fb237b94e2013"
@@ -1683,48 +1765,55 @@
     uuid "^3.3.2"
 
 "@pubsweet/component-send-email@^0.4.2":
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/@pubsweet/component-send-email/-/component-send-email-0.4.2.tgz#22dfdfc2fdd4bf579b6a1cc8e7dfbb6c6b9de4a1"
-  integrity sha512-g8qBnykFhkrQbGImsV6xfoCpPs7GcQo155CfAg5gODZFFHFMtE8lU5Brqmoo0Dls54PtWHpGES1d4PNEm9quvQ==
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/@pubsweet/component-send-email/-/component-send-email-0.4.3.tgz#caf8019f90b1fa490645a93f76725b83a951d7c9"
+  integrity sha512-ST9DxFbRjmWlVaXBFci/i4FFVN7YM6nySznb1jxsndWyvPLk2IhFrPP6iuGJXDEo4uplUnLk6EXkFKUEyPFmow==
   dependencies:
     nodemailer "^4.4.2"
 
-"@pubsweet/db-manager@^3.0.20", "@pubsweet/db-manager@^3.1.10":
-  version "3.1.10"
-  resolved "https://registry.yarnpkg.com/@pubsweet/db-manager/-/db-manager-3.1.10.tgz#a4165be9199fc2d04150ad746d9d328d9ab91c46"
-  integrity sha512-h9jW/IIYlMgV5exqZZdpmgp6L8Ef8+aVHI7c6nNQT2jaJIVR3ZhmgrjNNWnT9faptInoU/VoF6JUz5/vZKIBAg==
+"@pubsweet/db-manager@^3.1.10", "@pubsweet/db-manager@^3.1.11":
+  version "3.1.11"
+  resolved "https://registry.yarnpkg.com/@pubsweet/db-manager/-/db-manager-3.1.11.tgz#d11c3081de5e419edbb7b66546439c4cd24bf762"
+  integrity sha512-/9DR2Hplt1EOu36lAisgGOk89O5IVRUTgggG06WJlHyuLardueTOMXF08YVVfzTRBEnvIlLd1kCwWXQbMNUyoA==
   dependencies:
     "@hapi/joi" "^14.3.0"
-    "@pubsweet/logger" "^0.2.45"
+    "@pubsweet/logger" "^0.2.46"
     fs-extra "^8.1.0"
-    knex "^0.16.3"
+    knex "^0.21.1"
     lodash "^4.17.11"
-    objection "^1.5.3"
+    objection "^2.1.3"
     pg "^7.8.0"
     tmp-promise "^2.0.0"
     umzug "^2.1.0"
 
-"@pubsweet/errors@^2.0.24", "@pubsweet/errors@^2.0.32", "@pubsweet/errors@^2.0.35":
+"@pubsweet/errors@^2.0.32":
   version "2.0.35"
   resolved "https://registry.yarnpkg.com/@pubsweet/errors/-/errors-2.0.35.tgz#40a0c231cf5a7ab4aeafd6d20835a092fd55fcec"
   integrity sha512-u3eR2lFDydyIVZkxkfXUHhfw0i7usOSVlPmBlcr547qGADPJ8HB4lMTSFoq20Ks7Vij3xeW1Vu6r2Mfqo3uRhQ==
   dependencies:
     http-status-codes "^1.3.0"
 
+"@pubsweet/errors@^2.0.35", "@pubsweet/errors@^2.0.36":
+  version "2.0.36"
+  resolved "https://registry.yarnpkg.com/@pubsweet/errors/-/errors-2.0.36.tgz#afa254f26578468b6d1f8839ba6310e2fd7c6177"
+  integrity sha512-7qKSBCywp2v9yyf118ZK5A8GPuhVNGugRiUaYw/mxx5I5cZAP8xvUSnaIQMY4g+aaty6eYa5XOLUxZwpwA9IFA==
+  dependencies:
+    http-status-codes "^1.3.0"
+
 "@pubsweet/job-xsweet@^2.0.3":
-  version "2.1.10"
-  resolved "https://registry.yarnpkg.com/@pubsweet/job-xsweet/-/job-xsweet-2.1.10.tgz#7f29f8ec944813f1403a5fa1550bcf4babf0fcc6"
-  integrity sha512-qIsIWOXTAOc5eGrzXx/ZlRh4du2pO9TvSgbbXJiM0m7L4WPsCkN/86uRA7E1GrE+QbOeTjoJvqhrwTBbtDAEqQ==
+  version "2.1.11"
+  resolved "https://registry.yarnpkg.com/@pubsweet/job-xsweet/-/job-xsweet-2.1.11.tgz#a667f29912ce28df2a5929871cd1f4b4f2dcbb0a"
+  integrity sha512-db4121/EYXCV3we0b7l5YHgTq499U0VJxpzo9KE5v9CgDjzgYFOMIs0RwzergvOuQHdfJojGGzcl+meaEwZlWg==
   dependencies:
-    "@pubsweet/db-manager" "^3.1.10"
-    "@pubsweet/logger" "^0.2.45"
+    "@pubsweet/db-manager" "^3.1.11"
+    "@pubsweet/logger" "^0.2.46"
     express-fileupload v1.1.1-alpha.2
     node-wait-for-it "^0.2.0"
-    pubsweet-server "^13.11.0"
+    pubsweet-server "^13.11.1"
     tmp-promise "^2.0.0"
     waait "^1.0.5"
 
-"@pubsweet/logger@^0.2.34", "@pubsweet/logger@^0.2.42", "@pubsweet/logger@^0.2.45":
+"@pubsweet/logger@^0.2.42":
   version "0.2.45"
   resolved "https://registry.yarnpkg.com/@pubsweet/logger/-/logger-0.2.45.tgz#dbf176a5816e4c5fbc4ba0fed5c996fa2e24c288"
   integrity sha512-9s4cb+3vgPGQT6JUbDaiX3Q0KSU2vFDB+jMAj96RlIn88PUVa6dHBJBb1V7SMlPQ493S9dfOJ3lFJQhh+HNA5Q==
@@ -1732,6 +1821,14 @@
     "@hapi/joi" "^14.5.0"
     config "^3.0.1"
 
+"@pubsweet/logger@^0.2.45", "@pubsweet/logger@^0.2.46":
+  version "0.2.46"
+  resolved "https://registry.yarnpkg.com/@pubsweet/logger/-/logger-0.2.46.tgz#46a7c7918b678982ac3f613664accbf6a515c608"
+  integrity sha512-bBR0eAY2Cf1P+bL21561po8vDKhyqYnziHmGjW3M4LTOWW+AGaZsRGqZgymsemC814lJCnSTuxxJZ+tPa8TPjw==
+  dependencies:
+    "@hapi/joi" "^14.5.0"
+    config "^3.0.1"
+
 "@pubsweet/model-user@^5.1.4":
   version "5.1.12"
   resolved "https://registry.yarnpkg.com/@pubsweet/model-user/-/model-user-5.1.12.tgz#2c54102f6cb3a7dea2b11b98ed141a059abfbecd"
@@ -1743,21 +1840,21 @@
     "@pubsweet/models" "^0.3.7"
     bcrypt "^3.0.6"
 
-"@pubsweet/models@^0.2.21":
-  version "0.2.21"
-  resolved "https://registry.yarnpkg.com/@pubsweet/models/-/models-0.2.21.tgz#ef412424f051ddab2dca19678bf85a4f5ebf4b69"
-  integrity sha512-TYPo1DGZ03k+u9cgdgK+hdr4VbP0ewyfj7fKiJu3wUjNX1pBJJ8zra3G04Okgq5yfa8rQQsIiyns0OjraSZLxg==
+"@pubsweet/models@^0.3.11":
+  version "0.3.11"
+  resolved "https://registry.yarnpkg.com/@pubsweet/models/-/models-0.3.11.tgz#65658468d83360a1a0293f88941590c58b74ecf7"
+  integrity sha512-9SvVItqghaFowmNrr0SVlm8ecgGMQlgu39gZbGgbqmPSZpNUJtGEyM0xXJK1qpfOYmfzQqlwnKrtjmAU+jaQjg==
   dependencies:
-    "@pubsweet/logger" "^0.2.34"
+    "@pubsweet/logger" "^0.2.46"
 
-"@pubsweet/models@^0.3.10", "@pubsweet/models@^0.3.7":
+"@pubsweet/models@^0.3.7":
   version "0.3.10"
   resolved "https://registry.yarnpkg.com/@pubsweet/models/-/models-0.3.10.tgz#3994a05a1ca846290dc225aad118856555f65f2f"
   integrity sha512-hJrplJOC0ck6zok3sKj6muyL+RsR5VbEdSCTOXrI59T/dLbs6O76kPC4BPYVyaiCQiGFwcnl60OtpohbxsfPXQ==
   dependencies:
     "@pubsweet/logger" "^0.2.45"
 
-"@pubsweet/ui-toolkit@^2.2.13", "@pubsweet/ui-toolkit@^2.3.1":
+"@pubsweet/ui-toolkit@^2.2.13":
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/@pubsweet/ui-toolkit/-/ui-toolkit-2.3.1.tgz#0a3506a4b9eaeb9b54811982dc44cb87ca9892bf"
   integrity sha512-RFtkqCm/SItUEZPuBMM34WHFmiUhGs4EmreNMlNJg1TQnG9d6iirqy911oLEfJYtvR/fbxgeQFbtRle2yre64w==
@@ -1766,7 +1863,16 @@
     lodash "^4.17.4"
     styled-components "^4.1.1"
 
-"@pubsweet/ui@12.5.0", "@pubsweet/ui@^12.1.0", "@pubsweet/ui@^12.5.0":
+"@pubsweet/ui-toolkit@^2.3.1", "@pubsweet/ui-toolkit@^2.3.2":
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/@pubsweet/ui-toolkit/-/ui-toolkit-2.3.2.tgz#44b9b97b399027ef90bf0c30768475284f437fb4"
+  integrity sha512-VJ9zZI1uDOCicmuJV7uv98kK0J5hGpJKIeXpOSrgPgFw3dDFRjuuLa4W8L5aFa+FG42ZDZEj2CaOnfuZyB4HGA==
+  dependencies:
+    color "^3.0.0"
+    lodash "^4.17.4"
+    styled-components "^4.1.1"
+
+"@pubsweet/ui@12.5.0", "@pubsweet/ui@^12.6.0":
   version "12.5.0"
   resolved "https://registry.yarnpkg.com/@pubsweet/ui/-/ui-12.5.0.tgz#56882c88dd50885cf1871c8dcb95f77692ea0b86"
   integrity sha512-De6xVEPYGTV+CZrGUQWSFQzXexcdoO7LGyRdvDp9dDlfDNTO36U1Ltkpj5m0WomAj5NshkqQVqZfhBG1IxsKDw==
@@ -1789,6 +1895,29 @@
     recompose "^0.30.0"
     styled-components "^4.1.1"
 
+"@pubsweet/ui@^12.1.0":
+  version "12.6.0"
+  resolved "https://registry.yarnpkg.com/@pubsweet/ui/-/ui-12.6.0.tgz#52f304b3ac4824fe48a310177769549d019e270c"
+  integrity sha512-QYng7wVCB1ZoJ2AGVvNvf/BizgzEA60cgJXeeUiRykk0AQFqdpF+V/Skh7A8nwdl21knz6Xgoa84BbDQhNBSWQ==
+  dependencies:
+    "@pubsweet/ui-toolkit" "^2.3.2"
+    enzyme "^3.7.0"
+    enzyme-adapter-react-16 "^1.12.1"
+    formik "^1.4.2"
+    invariant "^2.2.3"
+    lodash "^4.17.4"
+    moment "^2.22.1"
+    prop-types "^15.5.10"
+    react "^16.9.0"
+    react-dom "^16.9.0"
+    react-feather "^1.0.8"
+    react-router-dom "^5.0.0"
+    react-select "^3.0.8"
+    react-tag-autocomplete "^5.5.0"
+    react-uid "^2.2.0"
+    recompose "^0.30.0"
+    styled-components "^4.1.1"
+
 "@samverschueren/stream-to-observable@^0.3.0":
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
@@ -1845,24 +1974,19 @@
   dependencies:
     "@types/express" "*"
 
-"@types/events@*":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
-  integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
-
 "@types/express-serve-static-core@*":
-  version "4.17.7"
-  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz#dfe61f870eb549dc6d7e12050901847c7d7e915b"
-  integrity sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==
+  version "4.17.8"
+  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.8.tgz#b8f7b714138536742da222839892e203df569d1c"
+  integrity sha512-1SJZ+R3Q/7mLkOD9ewCBDYD2k0WyZQtWYqF/2VvoNN2/uhI49J9CDN4OAm+wGMA0DbArA4ef27xl4+JwMtGggw==
   dependencies:
     "@types/node" "*"
     "@types/qs" "*"
     "@types/range-parser" "*"
 
 "@types/express@*":
-  version "4.17.6"
-  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e"
-  integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==
+  version "4.17.7"
+  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59"
+  integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==
   dependencies:
     "@types/body-parser" "*"
     "@types/express-serve-static-core" "*"
@@ -1887,11 +2011,10 @@
     "@types/node" "*"
 
 "@types/glob@^7.1.1":
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
-  integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
+  integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
   dependencies:
-    "@types/events" "*"
     "@types/minimatch" "*"
     "@types/node" "*"
 
@@ -1915,6 +2038,11 @@
   resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
   integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
 
+"@types/json5@^0.0.29":
+  version "0.0.29"
+  resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+  integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
 "@types/keygrip@*":
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
@@ -1964,14 +2092,14 @@
     form-data "^3.0.0"
 
 "@types/node@*", "@types/node@>=6":
-  version "14.0.9"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.9.tgz#43896ab87fc82bda1dfd600cdf44a0c8a64e11d2"
-  integrity sha512-0sCTiXKXELOBxvZLN4krQ0FPOAA7ij+6WwvD0k/PHd9/KAkr4dXel5J9fh6F4x1FwAQILqAWkmpeuS6mjf1iKA==
+  version "14.0.24"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.24.tgz#b0f86f58564fa02a28b68f8b55d4cdec42e3b9d6"
+  integrity sha512-btt/oNOiDWcSuI721MdL8VQGnjsKjlTMdrKyTcLCKeQp/n4AAMFJ961wMbp+09y8WuGPClDEv07RIItdXKIXAA==
 
 "@types/node@^10.1.0":
-  version "10.17.24"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.24.tgz#c57511e3a19c4b5e9692bb2995c40a3a52167944"
-  integrity sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA==
+  version "10.17.27"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.27.tgz#391cb391c75646c8ad2a7b6ed3bbcee52d1bdf19"
+  integrity sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==
 
 "@types/parse-json@^4.0.0":
   version "4.0.0"
@@ -2007,12 +2135,17 @@
   integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==
 
 "@types/ws@^7.0.0":
-  version "7.2.4"
-  resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.4.tgz#b3859f7b9c243b220efac9716ec42c716a72969d"
-  integrity sha512-9S6Ask71vujkVyeEXKxjBSUV8ZUB0mjL5la4IncBoheu04bDaYyUKErh1BQcY9+WzOUOiKqz/OnpJHYckbMfNg==
+  version "7.2.6"
+  resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.6.tgz#516cbfb818310f87b43940460e065eb912a4178d"
+  integrity sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==
   dependencies:
     "@types/node" "*"
 
+"@types/yup@0.29.3":
+  version "0.29.3"
+  resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.29.3.tgz#5a85024796bffe0eb01601bfc180fe218356dba4"
+  integrity sha512-XxZFKnxzTfm+DR8MMBA35UUXfUPmjPpi8HJ90VZg7q/LIbtiOhVGJ26gNnATcflcpnIyf2Qm9A+oEhswaqoDpA==
+
 "@types/zen-observable@^0.8.0":
   version "0.8.0"
   resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
@@ -2171,6 +2304,13 @@
     "@types/node" ">=6"
     tslib "^1.9.3"
 
+"@wry/context@^0.5.2":
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.5.2.tgz#f2a5d5ab9227343aa74c81e06533c1ef84598ec7"
+  integrity sha512-B/JLuRZ/vbEKHRUiGj6xiMojST1kHhu4WcreLfNN7q9DqQFrb97cWgf/kiYsPSUCAMVN0HzfFc8XjJdzgZzfjw==
+  dependencies:
+    tslib "^1.9.3"
+
 "@wry/equality@^0.1.2", "@wry/equality@^0.1.9":
   version "0.1.11"
   resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
@@ -2198,6 +2338,28 @@ abbrev@1:
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
   integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
 
+abstract-leveldown@^6.2.1:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+  integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+  dependencies:
+    buffer "^5.5.0"
+    immediate "^3.2.3"
+    level-concat-iterator "~2.0.0"
+    level-supports "~1.0.0"
+    xtend "~4.0.0"
+
+abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3:
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
+  integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
+  dependencies:
+    buffer "^5.5.0"
+    immediate "^3.2.3"
+    level-concat-iterator "~2.0.0"
+    level-supports "~1.0.0"
+    xtend "~4.0.0"
+
 accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
   version "1.3.7"
   resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@@ -2260,20 +2422,19 @@ aggregate-error@^3.0.0:
     indent-string "^4.0.0"
 
 airbnb-prop-types@^2.15.0:
-  version "2.15.0"
-  resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz#5287820043af1eb469f5b0af0d6f70da6c52aaef"
-  integrity sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2"
+  integrity sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==
   dependencies:
-    array.prototype.find "^2.1.0"
-    function.prototype.name "^1.1.1"
-    has "^1.0.3"
-    is-regex "^1.0.4"
-    object-is "^1.0.1"
+    array.prototype.find "^2.1.1"
+    function.prototype.name "^1.1.2"
+    is-regex "^1.1.0"
+    object-is "^1.1.2"
     object.assign "^4.1.0"
-    object.entries "^1.1.0"
+    object.entries "^1.1.2"
     prop-types "^15.7.2"
     prop-types-exact "^1.2.0"
-    react-is "^16.9.0"
+    react-is "^16.13.1"
 
 ajv-errors@^1.0.0:
   version "1.0.1"
@@ -2285,11 +2446,16 @@ ajv-keywords@^2.1.0:
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
   integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=
 
-ajv-keywords@^3.0.0, ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
+ajv-keywords@^3.0.0:
   version "3.4.1"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
   integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
 
+ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957"
+  integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==
+
 ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0:
   version "5.5.2"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
@@ -2300,7 +2466,7 @@ ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0:
     fast-json-stable-stringify "^2.0.0"
     json-schema-traverse "^0.3.0"
 
-ajv@^6.0.1, ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5:
+ajv@^6.0.1, ajv@^6.12.2:
   version "6.12.2"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
   integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
@@ -2310,6 +2476,16 @@ ajv@^6.0.1, ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5:
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5:
+  version "6.12.3"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706"
+  integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
 alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
@@ -2396,13 +2572,13 @@ anymatch@~3.1.1:
     normalize-path "^3.0.0"
     picomatch "^2.0.4"
 
-apollo-cache-control@^0.11.0:
-  version "0.11.0"
-  resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.11.0.tgz#7075492d04c5424e7c6769380b503e8f75b39d61"
-  integrity sha512-dmRnQ9AXGw2SHahVGLzB/p4UW/taFBAJxifxubp8hqY5p9qdlSu4MPRq8zvV2ULMYf50rBtZyC4C+dZLqmHuHQ==
+apollo-cache-control@^0.11.1:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.11.1.tgz#3bce0924ae7322a8b9f7ca1e2fb036d1fc9f1df5"
+  integrity sha512-6iHa8TkcKt4rx5SKRzDNjUIpCQX+7/FlZwD7vRh9JDnM4VH8SWhpj8fUR3CiEY8Kuc4ChXnOY8bCcMju5KPnIQ==
   dependencies:
-    apollo-server-env "^2.4.4"
-    apollo-server-plugin-base "^0.9.0"
+    apollo-server-env "^2.4.5"
+    apollo-server-plugin-base "^0.9.1"
 
 apollo-cache-inmemory@^1.5.1:
   version "1.6.6"
@@ -2437,33 +2613,33 @@ apollo-client@^2.6.4:
     tslib "^1.10.0"
     zen-observable "^0.8.0"
 
-apollo-datasource@^0.7.1:
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.1.tgz#0b06da999ace50b7f5fe509f2a03f7de97974334"
-  integrity sha512-h++/jQAY7GA+4TBM+7ezvctFmmGNLrAPf51KsagZj+NkT9qvxp585rdsuatynVbSl59toPK2EuVmc6ilmQHf+g==
+apollo-datasource@^0.7.2:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.2.tgz#1662ee93453a9b89af6f73ce561bde46b41ebf31"
+  integrity sha512-ibnW+s4BMp4K2AgzLEtvzkjg7dJgCaw9M5b5N0YKNmeRZRnl/I/qBTQae648FsRKgMwTbRQIvBhQ0URUFAqFOw==
   dependencies:
-    apollo-server-caching "^0.5.1"
-    apollo-server-env "^2.4.4"
+    apollo-server-caching "^0.5.2"
+    apollo-server-env "^2.4.5"
 
-apollo-engine-reporting-protobuf@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.1.tgz#b6e66e6e382f9bcdc2ac8ed168b047eb1470c1a8"
-  integrity sha512-TSfr9iAaInV8dhXkesdcmqsthRkVcJkzznmiM+1Ob/GScK7r6hBYCjVDt2613EHAg9SUzTOltIKlGD+N+GJRUw==
+apollo-engine-reporting-protobuf@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.2.tgz#b01812508a1c583328a8dc603769bc63b8895e7e"
+  integrity sha512-4wm9FR3B7UvJxcK/69rOiS5CAJPEYKufeRWb257ZLfX7NGFTMqvbc1hu4q8Ch7swB26rTpkzfsftLED9DqH9qg==
   dependencies:
     "@apollo/protobufjs" "^1.0.3"
 
-apollo-engine-reporting@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-2.0.0.tgz#af007b4a8a481fa97baef0eac51a7824f1ec3310"
-  integrity sha512-FvNwORsh3nxEfvQqd2xbd468a0q/R3kYar/Bk6YQdBX5qwqUhqmOcOSxLFk8Zb77HpwHij5CPpPWJb53TU1zcA==
-  dependencies:
-    apollo-engine-reporting-protobuf "^0.5.1"
-    apollo-graphql "^0.4.0"
-    apollo-server-caching "^0.5.1"
-    apollo-server-env "^2.4.4"
-    apollo-server-errors "^2.4.1"
-    apollo-server-plugin-base "^0.9.0"
-    apollo-server-types "^0.5.0"
+apollo-engine-reporting@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-2.3.0.tgz#3bb59f81aaf6b967ed098896a4a60a053b4eed5a"
+  integrity sha512-SbcPLFuUZcRqDEZ6mSs8uHM9Ftr8yyt2IEu0JA8c3LNBmYXSLM7MHqFe80SVcosYSTBgtMz8mLJO8orhYoSYZw==
+  dependencies:
+    apollo-engine-reporting-protobuf "^0.5.2"
+    apollo-graphql "^0.5.0"
+    apollo-server-caching "^0.5.2"
+    apollo-server-env "^2.4.5"
+    apollo-server-errors "^2.4.2"
+    apollo-server-plugin-base "^0.9.1"
+    apollo-server-types "^0.5.1"
     async-retry "^1.2.1"
     uuid "^8.0.0"
 
@@ -2477,10 +2653,10 @@ apollo-env@^0.6.5:
     node-fetch "^2.2.0"
     sha.js "^2.4.11"
 
-apollo-graphql@^0.4.0:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.4.4.tgz#25f456b28a4419bb6a42071f8a56e19e15bb80be"
-  integrity sha512-i012iRKT5nfsOaNMx4MTwHw2jrlyaF1zikpejxsGHsKIf3OngGvGh3pyw20bEmwj413OrNQpRxvvIz5A7W/8xw==
+apollo-graphql@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.5.0.tgz#7e9152093211b58352aa6504d8d39ec7241d6872"
+  integrity sha512-YSdF/BKPbsnQpxWpmCE53pBJX44aaoif31Y22I/qKpB6ZSGzYijV5YBoCL5Q15H2oA/v/02Oazh9lbp4ek3eig==
   dependencies:
     apollo-env "^0.6.5"
     lodash.sortby "^4.7.0"
@@ -2528,33 +2704,33 @@ apollo-link@^1.0.0, apollo-link@^1.2.11, apollo-link@^1.2.12, apollo-link@^1.2.1
     tslib "^1.9.3"
     zen-observable-ts "^0.8.21"
 
-apollo-server-caching@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.1.tgz#5cd0536ad5473abb667cc82b59bc56b96fb35db6"
-  integrity sha512-L7LHZ3k9Ao5OSf2WStvQhxdsNVplRQi7kCAPfqf9Z3GBEnQ2uaL0EgO0hSmtVHfXTbk5CTRziMT1Pe87bXrFIw==
+apollo-server-caching@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz#bef5d5e0d48473a454927a66b7bb947a0b6eb13e"
+  integrity sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==
   dependencies:
     lru-cache "^5.0.0"
 
-apollo-server-core@^2.14.1:
-  version "2.14.1"
-  resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.14.1.tgz#d930c62bfbe36e40fa5fce707aa3bfbfe3d1393b"
-  integrity sha512-Uk/jJwLtm+5YvExghNoq9V2ZHJRXPfaVOt4cIyo+mcjWG6YymHhMg5h9pR/auz9HMI8NP7ykmfo/bsTR1qutWQ==
+apollo-server-core@^2.16.0:
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.16.0.tgz#56b367db49f97b7da03b29cef89b63d9ed14ee0c"
+  integrity sha512-mnvg2cPvsQtjFXIqIhEAbPqGyiSXDSbiBgNQ8rY8g7r2eRMhHKZePqGF03gP1/w87yVaSDRAZBDk6o+jiBXjVQ==
   dependencies:
     "@apollographql/apollo-tools" "^0.4.3"
-    "@apollographql/graphql-playground-html" "1.6.24"
+    "@apollographql/graphql-playground-html" "1.6.26"
     "@types/graphql-upload" "^8.0.0"
     "@types/ws" "^7.0.0"
-    apollo-cache-control "^0.11.0"
-    apollo-datasource "^0.7.1"
-    apollo-engine-reporting "^2.0.0"
-    apollo-server-caching "^0.5.1"
-    apollo-server-env "^2.4.4"
-    apollo-server-errors "^2.4.1"
-    apollo-server-plugin-base "^0.9.0"
-    apollo-server-types "^0.5.0"
-    apollo-tracing "^0.11.0"
+    apollo-cache-control "^0.11.1"
+    apollo-datasource "^0.7.2"
+    apollo-engine-reporting "^2.3.0"
+    apollo-server-caching "^0.5.2"
+    apollo-server-env "^2.4.5"
+    apollo-server-errors "^2.4.2"
+    apollo-server-plugin-base "^0.9.1"
+    apollo-server-types "^0.5.1"
+    apollo-tracing "^0.11.1"
     fast-json-stable-stringify "^2.0.0"
-    graphql-extensions "^0.12.2"
+    graphql-extensions "^0.12.4"
     graphql-tag "^2.9.2"
     graphql-tools "^4.0.0"
     graphql-upload "^8.0.2"
@@ -2563,32 +2739,32 @@ apollo-server-core@^2.14.1:
     subscriptions-transport-ws "^0.9.11"
     ws "^6.0.0"
 
-apollo-server-env@^2.4.4:
-  version "2.4.4"
-  resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.4.tgz#12d2d0896dcb184478cba066c7a683ab18689ca1"
-  integrity sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg==
+apollo-server-env@^2.4.5:
+  version "2.4.5"
+  resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.5.tgz#73730b4f0439094a2272a9d0caa4079d4b661d5f"
+  integrity sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==
   dependencies:
     node-fetch "^2.1.2"
     util.promisify "^1.0.0"
 
-apollo-server-errors@^2.4.1:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.1.tgz#16ad49de6c9134bfb2b7dede9842e73bb239dbe2"
-  integrity sha512-7oEd6pUxqyWYUbQ9TA8tM0NU/3aGtXSEibo6+txUkuHe7QaxfZ2wHRp+pfT1LC1K3RXYjKj61/C2xEO19s3Kdg==
+apollo-server-errors@^2.4.2:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz#1128738a1d14da989f58420896d70524784eabe5"
+  integrity sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ==
 
 apollo-server-express@^2.4.8:
-  version "2.14.1"
-  resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.14.1.tgz#2dd282b3d72348059c3dfc387c23e4af25fa5b78"
-  integrity sha512-Ee1Oc+lzKfHh3BkDNRJL4s7Nnx+Nkmz606TBDi0ETSuNjJqXBNDbDM/YLS3LP7zJ5Oa37U7py72x8rrkPiZZNg==
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.16.0.tgz#3474a7f7eb868a2a847a364839147f8d7f26454a"
+  integrity sha512-mBIvKcF8gApj7wbmqe0A4Tsy+Pw66mI6cmtD912bG59KhUBveSCZ21dDlRSvnXUyK+GOo2ItwcUEtmks+Z2Pqw==
   dependencies:
-    "@apollographql/graphql-playground-html" "1.6.24"
+    "@apollographql/graphql-playground-html" "1.6.26"
     "@types/accepts" "^1.3.5"
     "@types/body-parser" "1.19.0"
     "@types/cors" "^2.8.4"
     "@types/express" "4.17.4"
     accepts "^1.3.5"
-    apollo-server-core "^2.14.1"
-    apollo-server-types "^0.5.0"
+    apollo-server-core "^2.16.0"
+    apollo-server-types "^0.5.1"
     body-parser "^1.18.3"
     cors "^2.8.4"
     express "^4.17.1"
@@ -2598,29 +2774,29 @@ apollo-server-express@^2.4.8:
     subscriptions-transport-ws "^0.9.16"
     type-is "^1.6.16"
 
-apollo-server-plugin-base@^0.9.0:
-  version "0.9.0"
-  resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.9.0.tgz#777f720a1ee827a66b8c159073ca30645f8bc625"
-  integrity sha512-LWcPrsy2+xqwlNseh/QaGa/MPNopS8c4qGgh0g0cAn0lZBRrJ9Yab7dq+iQ6vdUBwIhUWYN6s9dwUWCZw2SL8g==
+apollo-server-plugin-base@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.9.1.tgz#a62ae9ab4e89790fd4cc5d123bb616da34e8e5fb"
+  integrity sha512-kvrX4Z3FdpjrZdHkyl5iY2A1Wvp4b6KQp00DeZqss7GyyKNUBKr80/7RQgBLEw7EWM7WB19j459xM/TjvW0FKQ==
   dependencies:
-    apollo-server-types "^0.5.0"
+    apollo-server-types "^0.5.1"
 
-apollo-server-types@^0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.5.0.tgz#51f39c5fa610ece8b07f1fbcf63c47d4ac150340"
-  integrity sha512-zhtsqqqfdeoJQAfc41Sy6WnnBVxKNgZ34BKXf/Q+kXmw7rbZ/B5SG3SJMvj1iFsbzZxILmWdUsE9aD20lEr0bg==
+apollo-server-types@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.5.1.tgz#091c09652894d6532db9ba873574443adabf85b9"
+  integrity sha512-my2cPw+DAb2qVnIuBcsRKGyS28uIc2vjFxa1NpRoJZe9gK0BWUBk7wzXnIzWy3HZ5Er11e/40MPTUesNfMYNVA==
   dependencies:
-    apollo-engine-reporting-protobuf "^0.5.1"
-    apollo-server-caching "^0.5.1"
-    apollo-server-env "^2.4.4"
+    apollo-engine-reporting-protobuf "^0.5.2"
+    apollo-server-caching "^0.5.2"
+    apollo-server-env "^2.4.5"
 
-apollo-tracing@^0.11.0:
-  version "0.11.0"
-  resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.11.0.tgz#8821eb60692f77c06660fb6bc147446f600aecfe"
-  integrity sha512-I9IFb/8lkBW8ZwOAi4LEojfT7dMfUSkpnV8LHQI8Rcj0HtzL9HObQ3woBmzyGHdGHLFuD/6/VHyFD67SesSrJg==
+apollo-tracing@^0.11.1:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.11.1.tgz#3e3a4ce4b21e57dcc57b10bbd539db243b752606"
+  integrity sha512-l7g+uILw7v32GA46IRXIx5XXbZhFI96BhSqrGK9yyvfq+NMcvVZrj3kIhRImPGhAjMdV+5biA/jztabElAbDjg==
   dependencies:
-    apollo-server-env "^2.4.4"
-    apollo-server-plugin-base "^0.9.0"
+    apollo-server-env "^2.4.5"
+    apollo-server-plugin-base "^0.9.1"
 
 apollo-upload-client@^11.0.0:
   version "11.0.0"
@@ -2632,6 +2808,15 @@ apollo-upload-client@^11.0.0:
     apollo-link-http-common "^0.2.14"
     extract-files "^5.0.1"
 
+apollo-upload-client@^14.0.1:
+  version "14.0.1"
+  resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-14.0.1.tgz#62ca85c4e45d48c2e73cabcdd7cc639492dacb4b"
+  integrity sha512-2Ebh5LQukHpGNebAWRdf9i3t91mJbZAyEG7WVrw9Mx3bxKIQ+4iYmBz3XV+pK8lqs8332i4k3D46hGdXDc5/gg==
+  dependencies:
+    "@apollo/client" "^3.0.2"
+    "@babel/runtime" "^7.10.5"
+    extract-files "^8.1.0"
+
 apollo-utilities@1.3.4, apollo-utilities@^1.0.1, apollo-utilities@^1.2.1, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4:
   version "1.3.4"
   resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf"
@@ -2664,10 +2849,10 @@ aproba@^1.0.3, aproba@^1.1.1:
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
   integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
 
-arch@2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e"
-  integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==
+arch@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf"
+  integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==
 
 are-we-there-yet@~1.1.2:
   version "1.1.5"
@@ -2684,13 +2869,13 @@ argparse@^1.0.7:
   dependencies:
     sprintf-js "~1.0.2"
 
-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=
+aria-query@^4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b"
+  integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==
   dependencies:
-    ast-types-flow "0.0.7"
-    commander "^2.11.0"
+    "@babel/runtime" "^7.10.2"
+    "@babel/runtime-corejs3" "^7.10.2"
 
 arr-diff@^2.0.0:
   version "2.0.0"
@@ -2744,7 +2929,7 @@ array-flatten@^2.1.0:
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
   integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
 
-array-includes@^3.0.3, array-includes@^3.1.1:
+array-includes@^3.1.1:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
   integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
@@ -2780,21 +2965,30 @@ array-unique@^0.3.2:
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
   integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
 
-array.prototype.find@^2.1.0:
+array.prototype.find@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c"
   integrity sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==
   dependencies:
     define-properties "^1.1.3"
-    es-abstract "^1.17.4"
+    es-abstract "^1.17.4"
+
+array.prototype.flat@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
+  integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
 
-array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3:
+array.prototype.flatmap@^1.2.3:
   version "1.2.3"
-  resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
-  integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
+  resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443"
+  integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
 
 arrify@^1.0.1:
   version "1.0.1"
@@ -2840,7 +3034,7 @@ assign-symbols@^1.0.0:
   resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
   integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
 
-ast-types-flow@0.0.7, ast-types-flow@^0.0.7:
+ast-types-flow@^0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
   integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0=
@@ -2884,7 +3078,7 @@ async@^2.1.4, async@^2.4.1, async@^2.6.2:
   dependencies:
     lodash "^4.17.14"
 
-async@^3.1.0:
+async@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
   integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
@@ -2960,10 +3154,22 @@ aws4@^1.8.0:
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2"
   integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==
 
-axobject-query@^2.0.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799"
-  integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==
+axe-core@^3.5.4:
+  version "3.5.5"
+  resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.5.5.tgz#84315073b53fa3c0c51676c588d59da09a192227"
+  integrity sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==
+
+axios@^0.19.2:
+  version "0.19.2"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
+  integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
+  dependencies:
+    follow-redirects "1.5.10"
+
+axobject-query@^2.1.2:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
+  integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==
 
 babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
   version "6.26.0"
@@ -3550,9 +3756,9 @@ binary-extensions@^1.0.0:
   integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
 
 binary-extensions@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
-  integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
+  integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
 
 bindings@^1.5.0:
   version "1.5.0"
@@ -3765,14 +3971,14 @@ browserslist@^2.11.3:
     electron-to-chromium "^1.3.30"
 
 browserslist@^4.12.0, browserslist@^4.8.5:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d"
-  integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==
+  version "4.13.0"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.13.0.tgz#42556cba011e1b0a2775b611cba6a8eca18e940d"
+  integrity sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==
   dependencies:
-    caniuse-lite "^1.0.30001043"
-    electron-to-chromium "^1.3.413"
-    node-releases "^1.1.53"
-    pkg-up "^2.0.0"
+    caniuse-lite "^1.0.30001093"
+    electron-to-chromium "^1.3.488"
+    escalade "^3.0.1"
+    node-releases "^1.1.58"
 
 bser@2.1.1:
   version "2.1.1"
@@ -3825,7 +4031,7 @@ buffer@^4.3.0:
     ieee754 "^1.1.4"
     isarray "^1.0.0"
 
-buffer@^5.2.0:
+buffer@^5.2.0, buffer@^5.5.0, buffer@^5.6.0:
   version "5.6.0"
   resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
   integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
@@ -3977,14 +4183,6 @@ camel-case@3.0.x:
     no-case "^2.2.0"
     upper-case "^1.1.1"
 
-camelcase-keys@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
-  integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
-  dependencies:
-    camelcase "^2.0.0"
-    map-obj "^1.0.0"
-
 camelcase-keys@^4.0.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
@@ -3994,11 +4192,6 @@ camelcase-keys@^4.0.0:
     map-obj "^2.0.0"
     quick-lru "^1.0.0"
 
-camelcase@^2.0.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
-  integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
-
 camelcase@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
@@ -4029,11 +4222,16 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
   resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001076.tgz#bbd4b054164a81506f75c28acdc72261712ddb96"
   integrity sha512-xakM7JFFxRXDZc5OJa97zBp0tRlW1NUgvLxLD0i9TUQ76wbHUAbpbFNb35uDOAur2eLqvHmoArqHXGMUoiK+oA==
 
-caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30001043:
+caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805:
   version "1.0.30001066"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001066.tgz#0a8a58a10108f2b9bf38e7b65c237b12fd9c5f04"
   integrity sha512-Gfj/WAastBtfxLws0RCh2sDbTK/8rJuSeZMecrSkNGYxPcv7EzblmDGfWQCFEQcSqYE2BRgQiJh8HOD07N5hIw==
 
+caniuse-lite@^1.0.30001093:
+  version "1.0.30001105"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001105.tgz#d2cb0b31e5cf2f3ce845033b61c5c01566549abf"
+  integrity sha512-JupOe6+dGMr7E20siZHIZQwYqrllxotAhiaej96y6x00b/48rPt42o+SzOSCPbrpsDWvRja40Hwrj0g0q6LZJg==
+
 capture-exit@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f"
@@ -4164,9 +4362,9 @@ chokidar@^2.1.8:
     fsevents "^1.2.7"
 
 chokidar@^3.4.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8"
-  integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
+  integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
   dependencies:
     anymatch "~3.1.1"
     braces "~3.0.2"
@@ -4436,6 +4634,11 @@ colorette@1.0.7:
   resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.0.7.tgz#7adf43c445ee63a541b4a4aef7d13f03df1e0cc0"
   integrity sha512-KeK4klsvAgdODAjFPm6QLzvStizJqlxMBtVo4KQMCgk5tt/tf9rAzxmxLHNRynJg3tJjkKGKbHx3j4HLox27Lw==
 
+colorette@1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
+  integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
+
 colormin@^1.0.5:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
@@ -4477,16 +4680,21 @@ commander@2.17.x:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
   integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
 
-commander@4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83"
-  integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==
+commander@4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+  integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
 
-commander@^2.11.0, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.9.0, commander@~2.20.3:
+commander@^2.11.0, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3, commander@^2.9.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@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+  integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+
 commander@~2.13.0:
   version "2.13.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
@@ -4559,14 +4767,7 @@ concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@
     readable-stream "^2.2.2"
     typedarray "^0.0.6"
 
-config@^1.26.2:
-  version "1.31.0"
-  resolved "https://registry.yarnpkg.com/config/-/config-1.31.0.tgz#ab08aeba6536015d220cd0afe14b3e0501082542"
-  integrity sha512-Ep/l9Rd1J9IPueztJfpbOqVzuKHQh4ZODMNt9xqTYdBBNRXbV4oTu34kCkkfdRVcDq0ohtpaeXGgb+c0LQxFRA==
-  dependencies:
-    json5 "^1.0.1"
-
-config@^3.0.1:
+config@^3.0.1, config@^3.3.1:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/config/-/config-3.3.1.tgz#b6a70e2908a43b98ed20be7e367edf0cc8ed5a19"
   integrity sha512-+2/KaaaAzdwUBE3jgZON11L1ggLLhpf2FsGrfqYFHZW22ySGv/HqYIXrBwKKvn+XZh1UBUjHwAcrfsSkSygT+Q==
@@ -4808,7 +5009,16 @@ create-react-context@^0.1.5:
   resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.1.6.tgz#0f425931d907741127acc6e31acb4f9015dd9fdc"
   integrity sha512-eCnYYEUEc5i32LHwpE/W7NlddOB9oHwsPaWtWzYtflNkkwa3IfindIcoXdVWs12zCbwaMCavKNu84EXogVIWHw==
 
-cross-spawn@6.0.5, cross-spawn@^6.0.0:
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
   version "6.0.5"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
   integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@@ -4819,15 +5029,6 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
-cross-spawn@^5.0.1, cross-spawn@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
-  integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
-  dependencies:
-    lru-cache "^4.0.1"
-    shebang-command "^1.2.0"
-    which "^1.2.9"
-
 cross-spawn@^7.0.0:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -4927,6 +5128,11 @@ cssesc@^3.0.0:
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
   integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
 
+cssfilter@0.0.10:
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae"
+  integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=
+
 cssnano@^3.10.0:
   version "3.10.0"
   resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
@@ -4985,11 +5191,16 @@ cssstyle@^1.0.0:
   dependencies:
     cssom "0.3.x"
 
-csstype@^2.5.2, csstype@^2.5.7, csstype@^2.6.7:
+csstype@^2.5.2:
   version "2.6.10"
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b"
   integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==
 
+csstype@^2.5.7, csstype@^2.6.7:
+  version "2.6.11"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5"
+  integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw==
+
 currently-unhandled@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -5007,44 +5218,46 @@ cyclist@^1.0.1:
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
   integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
 
-cypress-file-upload@^3.5.0:
-  version "3.5.3"
-  resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-3.5.3.tgz#cd706485de3fb2cbd4a8c2dd90fe96d537bb4311"
-  integrity sha512-S/czzqAj1BYz6Xxnfpx2aSc6hXsj76fd8/iuycJ2RxoxCcQMliw8eQV0ugzVlkzr1GD5dKGviNFGYqv3nRJ+Tg==
+cypress-file-upload@^4.0.7:
+  version "4.0.7"
+  resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-4.0.7.tgz#1136139bb3c660b9c39a69f231ac1da7785acaae"
+  integrity sha512-rFFmnoZ2bWyWFpSV09AhkSUgYEiVy70pcQ6nf/mGTMTrVHvKCCCIfRu3TbgVYHbgBq+0hqjfjQrtz4IbgH7qZA==
+  dependencies:
+    mime "^2.4.4"
 
-cypress@^4.0.1:
-  version "4.7.0"
-  resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.7.0.tgz#3ea29bddaf9a1faeaa5b8d54b60a84ed1cafa83d"
-  integrity sha512-Vav6wUFhPRlImIND/2lOQlUnAWzgCC/iXyJlJjX9nJOJul5LC1vUpf/m8Oiae870PFPyT0ZLLwPHKTXZNdXmHw==
+cypress@^4.11.0:
+  version "4.11.0"
+  resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.11.0.tgz#054b0b85fd3aea793f186249ee1216126d5f0a7e"
+  integrity sha512-6Yd598+KPATM+dU1Ig0g2hbA+R/o1MAKt0xIejw4nZBVLSplCouBzqeKve6XsxGU6n4HMSt/+QYsWfFcoQeSEw==
   dependencies:
     "@cypress/listr-verbose-renderer" "0.4.1"
     "@cypress/request" "2.88.5"
     "@cypress/xvfb" "1.2.4"
     "@types/sinonjs__fake-timers" "6.0.1"
     "@types/sizzle" "2.3.2"
-    arch "2.1.1"
+    arch "2.1.2"
     bluebird "3.7.2"
     cachedir "2.3.0"
     chalk "2.4.2"
     check-more-types "2.24.0"
     cli-table3 "0.5.1"
-    commander "4.1.0"
+    commander "4.1.1"
     common-tags "1.8.0"
     debug "4.1.1"
-    eventemitter2 "4.1.2"
+    eventemitter2 "6.4.2"
     execa "1.0.0"
     executable "4.1.1"
     extract-zip "1.7.0"
     fs-extra "8.1.0"
-    getos "3.1.4"
+    getos "3.2.1"
     is-ci "2.0.0"
-    is-installed-globally "0.1.0"
+    is-installed-globally "0.3.2"
     lazy-ass "1.6.0"
     listr "0.14.3"
-    lodash "4.17.15"
+    lodash "4.17.19"
     log-symbols "3.0.0"
     minimist "1.2.5"
-    moment "2.24.0"
+    moment "2.26.0"
     ospath "1.2.2"
     pretty-bytes "5.3.0"
     ramda "0.26.1"
@@ -5055,7 +5268,7 @@ cypress@^4.0.1:
     url "0.11.0"
     yauzl "2.10.0"
 
-damerau-levenshtein@^1.0.4:
+damerau-levenshtein@^1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791"
   integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==
@@ -5091,13 +5304,15 @@ date-fns@^1.27.2:
   resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
   integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
 
-dateformat@~1.0.4-1.2.3:
-  version "1.0.12"
-  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
-  integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=
-  dependencies:
-    get-stdin "^4.0.1"
-    meow "^3.3.0"
+dateformat@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
+  integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
+
+db-errors@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/db-errors/-/db-errors-0.2.3.tgz#a6a38952e00b20e790f2695a6446b3c65497ffa2"
+  integrity sha512-OOgqgDuCavHXjYSJoV2yGhv6SeG8nk42aoCSoyXLZUH7VwFG27rxbavU1z+VrZbZjphw5UkDQwUlD21MwZpUng==
 
 debounce@^1.0.0:
   version "1.2.0"
@@ -5118,6 +5333,13 @@ debug@4.1.1, debug@^4.1.0, debug@^4.1.1:
   dependencies:
     ms "^2.1.1"
 
+debug@=3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
+  dependencies:
+    ms "2.0.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"
@@ -5215,6 +5437,14 @@ default-require-extensions@^1.0.0:
   dependencies:
     strip-bom "^2.0.0"
 
+deferred-leveldown@~5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
+  integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
+  dependencies:
+    abstract-leveldown "~6.2.1"
+    inherits "^2.0.3"
+
 define-properties@^1.1.2, define-properties@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -5386,11 +5616,6 @@ dns-packet@^1.3.1:
     ip "^1.1.0"
     safe-buffer "^5.0.1"
 
-dns-prefetch-control@0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz#73988161841f3dcc81f47686d539a2c702c88624"
-  integrity sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==
-
 dns-txt@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
@@ -5574,20 +5799,25 @@ ejs@^2.6.1:
   resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
   integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 
-electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.413:
+electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30:
   version "1.3.456"
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.456.tgz#5125bce136b04a8e39473696509e83038f679cbd"
   integrity sha512-jaVZ9+8HG2qvEN7c9r5EVguvhtevITJou4L10XuqoiZUoXIMF5qLG1pB9raP3WFcME4exDZRq1b6qyCA+u5Vew==
 
+electron-to-chromium@^1.3.488:
+  version "1.3.503"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.503.tgz#3b2fc07b7e3ea0262c395984579ddabee1c9e0cd"
+  integrity sha512-Rh4+JP+5a+HeCg+77/BOLKzA6pLf8WZMd+DqiduEWCPyvSdY6KWzfkZXa2JRxrLO/aaB1YjTXenQdamZYzWfUw==
+
 elegant-spinner@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
   integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=
 
 elliptic@^6.0.0, elliptic@^6.5.2:
-  version "6.5.2"
-  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
-  integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==
+  version "6.5.3"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
+  integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
   dependencies:
     bn.js "^4.4.0"
     brorand "^1.0.1"
@@ -5597,11 +5827,16 @@ elliptic@^6.0.0, elliptic@^6.5.2:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.0"
 
-emoji-regex@^7.0.1, emoji-regex@^7.0.2:
+emoji-regex@^7.0.1:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
   integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
 
+emoji-regex@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4"
+  integrity sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==
+
 emojis-list@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
@@ -5625,12 +5860,22 @@ encodeurl@~1.0.2:
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
   integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
 
+encoding-down@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
+  integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
+  dependencies:
+    abstract-leveldown "^6.2.1"
+    inherits "^2.0.3"
+    level-codec "^9.0.0"
+    level-errors "^2.0.0"
+
 encoding@^0.1.11:
-  version "0.1.12"
-  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
-  integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
+  version "0.1.13"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+  integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
   dependencies:
-    iconv-lite "~0.4.13"
+    iconv-lite "^0.6.2"
 
 end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   version "1.4.4"
@@ -5639,19 +5884,10 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   dependencies:
     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==
-  dependencies:
-    graceful-fs "^4.1.2"
-    memory-fs "^0.4.0"
-    tapable "^1.0.0"
-
-enhanced-resolve@^4.1.0:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66"
-  integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==
+enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126"
+  integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==
   dependencies:
     graceful-fs "^4.1.2"
     memory-fs "^0.5.0"
@@ -5663,9 +5899,9 @@ entities@^1.1.1, entities@~1.1.1:
   integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
 
 entities@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436"
-  integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f"
+  integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==
 
 enzyme-adapter-react-16@^1.12.1:
   version "1.15.2"
@@ -5730,7 +5966,7 @@ enzyme@^3.7.0:
     rst-selector-parser "^2.2.3"
     string.prototype.trim "^1.2.1"
 
-errno@^0.1.3, errno@~0.1.7:
+errno@^0.1.3, errno@~0.1.1, errno@~0.1.7:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
   integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
@@ -5745,21 +5981,21 @@ error-ex@^1.2.0, error-ex@^1.3.1:
     is-arrayish "^0.2.1"
 
 es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5:
-  version "1.17.5"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
-  integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
+  version "1.17.6"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a"
+  integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==
   dependencies:
     es-to-primitive "^1.2.1"
     function-bind "^1.1.1"
     has "^1.0.3"
     has-symbols "^1.0.1"
-    is-callable "^1.1.5"
-    is-regex "^1.0.5"
+    is-callable "^1.2.0"
+    is-regex "^1.1.0"
     object-inspect "^1.7.0"
     object-keys "^1.1.1"
     object.assign "^4.1.0"
-    string.prototype.trimleft "^2.1.1"
-    string.prototype.trimright "^2.1.1"
+    string.prototype.trimend "^1.0.1"
+    string.prototype.trimstart "^1.0.1"
 
 es-get-iterator@^1.1.0:
   version "1.1.0"
@@ -5788,6 +6024,11 @@ es6-object-assign@^1.1.0:
   resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
   integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=
 
+escalade@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4"
+  integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==
+
 escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -5858,15 +6099,15 @@ eslint-config-standard@^10.2.1:
   resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591"
   integrity sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=
 
-eslint-import-resolver-node@^0.3.2:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404"
-  integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==
+eslint-import-resolver-node@^0.3.3:
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717"
+  integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==
   dependencies:
     debug "^2.6.9"
     resolve "^1.13.1"
 
-eslint-module-utils@^2.4.1:
+eslint-module-utils@^2.6.0:
   version "2.6.0"
   resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
   integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
@@ -5875,22 +6116,23 @@ eslint-module-utils@^2.4.1:
     pkg-dir "^2.0.0"
 
 eslint-plugin-import@^2.8.0:
-  version "2.20.2"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d"
-  integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==
+  version "2.22.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e"
+  integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==
   dependencies:
-    array-includes "^3.0.3"
-    array.prototype.flat "^1.2.1"
+    array-includes "^3.1.1"
+    array.prototype.flat "^1.2.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.1"
+    eslint-import-resolver-node "^0.3.3"
+    eslint-module-utils "^2.6.0"
     has "^1.0.3"
     minimatch "^3.0.4"
-    object.values "^1.1.0"
+    object.values "^1.1.1"
     read-pkg-up "^2.0.0"
-    resolve "^1.12.0"
+    resolve "^1.17.0"
+    tsconfig-paths "^3.9.0"
 
 eslint-plugin-jest@^21.4.0:
   version "21.27.2"
@@ -5898,19 +6140,21 @@ eslint-plugin-jest@^21.4.0:
   integrity sha512-0E4OIgBJVlAmf1KfYFtZ3gYxgUzC5Eb3Jzmrc9ikI1OY+/cM8Kh72Ti7KfpeHNeD3HJNf9SmEfmvQLIz44Hrhw==
 
 eslint-plugin-jsx-a11y@^6.0.2:
-  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==
+  version "6.3.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz#99ef7e97f567cc6a5b8dd5ab95a94a67058a2660"
+  integrity sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==
   dependencies:
-    "@babel/runtime" "^7.4.5"
-    aria-query "^3.0.0"
-    array-includes "^3.0.3"
+    "@babel/runtime" "^7.10.2"
+    aria-query "^4.2.2"
+    array-includes "^3.1.1"
     ast-types-flow "^0.0.7"
-    axobject-query "^2.0.2"
-    damerau-levenshtein "^1.0.4"
-    emoji-regex "^7.0.2"
+    axe-core "^3.5.4"
+    axobject-query "^2.1.2"
+    damerau-levenshtein "^1.0.6"
+    emoji-regex "^9.0.0"
     has "^1.0.3"
-    jsx-ast-utils "^2.2.1"
+    jsx-ast-utils "^2.4.1"
+    language-tags "^1.0.5"
 
 eslint-plugin-node@^5.2.1:
   version "5.2.1"
@@ -5936,21 +6180,21 @@ eslint-plugin-promise@^3.6.0:
   integrity sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==
 
 eslint-plugin-react@^7.4.0:
-  version "7.20.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3"
-  integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA==
+  version "7.20.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.3.tgz#0590525e7eb83890ce71f73c2cf836284ad8c2f1"
+  integrity sha512-txbo090buDeyV0ugF3YMWrzLIUqpYTsWSDZV9xLSmExE1P/Kmgg9++PD931r+KEWS66O1c9R4srLVVHmeHpoAg==
   dependencies:
     array-includes "^3.1.1"
+    array.prototype.flatmap "^1.2.3"
     doctrine "^2.1.0"
     has "^1.0.3"
-    jsx-ast-utils "^2.2.3"
-    object.entries "^1.1.1"
+    jsx-ast-utils "^2.4.1"
+    object.entries "^1.1.2"
     object.fromentries "^2.0.2"
     object.values "^1.1.1"
     prop-types "^15.7.2"
-    resolve "^1.15.1"
+    resolve "^1.17.0"
     string.prototype.matchall "^4.0.2"
-    xregexp "^4.3.0"
 
 eslint-plugin-standard@^3.0.1:
   version "3.1.0"
@@ -6027,6 +6271,11 @@ eslint@^4.12.0:
     table "4.0.2"
     text-table "~0.2.0"
 
+esm@^3.2.25:
+  version "3.2.25"
+  resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
+  integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
+
 espree@^3.5.4:
   version "3.5.4"
   resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
@@ -6104,10 +6353,10 @@ eventemitter2@0.4.14:
   resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
   integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=
 
-eventemitter2@4.1.2:
-  version "4.1.2"
-  resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-4.1.2.tgz#0e1a8477af821a6ef3995b311bf74c23a5247f15"
-  integrity sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU=
+eventemitter2@6.4.2:
+  version "6.4.2"
+  resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.2.tgz#f31f8b99d45245f0edbc5b00797830ff3b388970"
+  integrity sha512-r/Pwupa5RIzxIHbEKCkNXqpEQIIT4uQDxmP4G/Lug/NokVUWj0joz/WzWl3OxRpC5kDrH/WdiUJoR+IrwvXJEw==
 
 eventemitter3@^3.1.0:
   version "3.1.2"
@@ -6264,11 +6513,6 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
   dependencies:
     homedir-polyfill "^1.0.1"
 
-expect-ct@0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.2.0.tgz#3a54741b6ed34cc7a93305c605f63cd268a54a62"
-  integrity sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==
-
 expect@^22.4.0:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674"
@@ -6381,6 +6625,11 @@ extract-files@^5.0.1:
   resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-5.0.1.tgz#c9492a8410be643e260a376f0151361993d5f659"
   integrity sha512-qRW6y9eKF0VbCyOoOEtFhzJ3uykAw8GKwQVXyAIqwocyEWW4m+v+evec34RwtUkkxxHh7NKBLJ6AnXM8W4dH5w==
 
+extract-files@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-8.1.0.tgz#46a0690d0fe77411a2e3804852adeaa65cd59288"
+  integrity sha512-PTGtfthZK79WUMk+avLmwx3NGdU8+iVFXC2NMGxKsn0MnihOG2lvumj+AZo8CTwTrwjXDgZ5tztbRlEdRjBonQ==
+
 extract-text-webpack-plugin@^3.0.0:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7"
@@ -6427,9 +6676,9 @@ fast-deep-equal@^1.0.0:
   integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
 
 fast-deep-equal@^3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
-  integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
 
 fast-diff@^1.1.1:
   version "1.2.0"
@@ -6678,7 +6927,7 @@ find-up@^4.0.0:
     locate-path "^5.0.0"
     path-exists "^4.0.0"
 
-findup-sync@3.0.0, findup-sync@^3.0.0:
+findup-sync@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
   integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
@@ -6727,12 +6976,22 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.3"
     readable-stream "^2.3.6"
 
-follow-redirects@^1.0.0:
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb"
-  integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==
+fn-name@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-3.0.0.tgz#0596707f635929634d791f452309ab41558e3c5c"
+  integrity sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA==
+
+follow-redirects@1.5.10:
+  version "1.5.10"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
+  integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
   dependencies:
-    debug "^3.0.0"
+    debug "=3.1.0"
+
+follow-redirects@^1.0.0:
+  version "1.12.1"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6"
+  integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==
 
 font-awesome@^4.7.0:
   version "4.7.0"
@@ -6842,11 +7101,6 @@ fragment-cache@^0.2.1:
   dependencies:
     map-cache "^0.2.2"
 
-frameguard@3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/frameguard/-/frameguard-3.1.0.tgz#bd1442cca1d67dc346a6751559b6d04502103a22"
-  integrity sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==
-
 fresh@0.5.2:
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
@@ -6888,15 +7142,6 @@ fs-extra@^4.0.2:
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
-fs-extra@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
-  integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
-  dependencies:
-    graceful-fs "^4.1.2"
-    jsonfile "^4.0.0"
-    universalify "^0.1.0"
-
 fs-minipass@^1.2.5:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
@@ -6944,7 +7189,7 @@ function-bind@^1.1.1:
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 
-function.prototype.name@^1.1.1, function.prototype.name@^1.1.2:
+function.prototype.name@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45"
   integrity sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==
@@ -6997,11 +7242,6 @@ get-own-enumerable-property-symbols@^3.0.0:
   resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
   integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
 
-get-stdin@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
-  integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
-
 get-stdin@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
@@ -7036,12 +7276,17 @@ getopts@2.2.3:
   resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.3.tgz#11d229775e2ec2067ed8be6fcc39d9b4bf39cf7d"
   integrity sha512-viEcb8TpgeG05+Nqo5EzZ8QR0hxdyrYDp6ZSTZqe2M/h53Bk036NmqG38Vhf5RGirC/Of9Xql+v66B2gp256SQ==
 
-getos@3.1.4:
-  version "3.1.4"
-  resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.4.tgz#29cdf240ed10a70c049add7b6f8cb08c81876faf"
-  integrity sha512-UORPzguEB/7UG5hqiZai8f0vQ7hzynMQyJLxStoQ8dPGAcmgsfXOPA4iE/fGtweHYkK+z4zc9V0g+CIFRf5HYw==
+getopts@2.2.5:
+  version "2.2.5"
+  resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b"
+  integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==
+
+getos@3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5"
+  integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==
   dependencies:
-    async "^3.1.0"
+    async "^3.2.0"
 
 getpass@^0.1.1:
   version "0.1.7"
@@ -7100,19 +7345,12 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-global-dirs@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
-  integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
-  dependencies:
-    ini "^1.3.4"
-
-global-modules@2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
-  integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+global-dirs@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
+  integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==
   dependencies:
-    global-prefix "^3.0.0"
+    ini "^1.3.5"
 
 global-modules@^1.0.0:
   version "1.0.0"
@@ -7123,6 +7361,13 @@ global-modules@^1.0.0:
     is-windows "^1.0.1"
     resolve-dir "^1.0.0"
 
+global-modules@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+  integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+  dependencies:
+    global-prefix "^3.0.0"
+
 global-prefix@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
@@ -7209,14 +7454,21 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
   integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
 
-graphql-extensions@^0.12.2:
-  version "0.12.2"
-  resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.12.2.tgz#f22210e812939b7caa2127589f30e6a1c671540f"
-  integrity sha512-vFaZua5aLiCOOzxfY5qzHZ6S52BCqW7VVOwzvV52Wb5edRm3dn6u+1MR9yYyEqUHSf8LvdhEojYlOkKiaQ4ghA==
+graphql-extensions@^0.12.4:
+  version "0.12.4"
+  resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.12.4.tgz#c0aa49a20f983a2da641526d1e505996bd2b4188"
+  integrity sha512-GnR4LiWk3s2bGOqIh6V1JgnSXw2RCH4NOgbCFEWvB6JqWHXTlXnLZ8bRSkCiD4pltv7RHUPWqN/sGh8R6Ae/ag==
   dependencies:
     "@apollographql/apollo-tools" "^0.4.3"
-    apollo-server-env "^2.4.4"
-    apollo-server-types "^0.5.0"
+    apollo-server-env "^2.4.5"
+    apollo-server-types "^0.5.1"
+
+graphql-middleware@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/graphql-middleware/-/graphql-middleware-4.0.2.tgz#eb589bf428e1795e48cd6a3cfeeba0807b996ebd"
+  integrity sha512-ESVDvMXeN00S1BNsjNS18uExcR16J8zbT31CuKcpyeBa7IMbidG0Pnqnu5P1wKkJLmPmKOfCljWlhXpD/Fawqg==
+  dependencies:
+    graphql-tools "^4.0.5"
 
 graphql-postgres-subscriptions@^1.0.4:
   version "1.0.5"
@@ -7228,6 +7480,15 @@ graphql-postgres-subscriptions@^1.0.4:
     pg "^7.4.1"
     pg-ipc "^1.0.4"
 
+graphql-shield@^7.3.2:
+  version "7.3.2"
+  resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-7.3.2.tgz#ecb8e2f2533a7dc5c1a67d79a928807014c9fa0d"
+  integrity sha512-LxFgVqY6hYa1mAO8BvRyS3vk9XkZsOOrpHrM35/wMNXqhF0pnJbdF788KSqMcxvdAL/dQYcTRhE8Mjgj7nacpQ==
+  dependencies:
+    "@types/yup" "0.29.3"
+    object-hash "^2.0.3"
+    yup "^0.29.0"
+
 graphql-subscriptions@^0.5.8:
   version "0.5.8"
   resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.5.8.tgz#13a6143c546bce390404657dc73ca501def30aa7"
@@ -7242,12 +7503,12 @@ graphql-subscriptions@^1.0.0:
   dependencies:
     iterall "^1.2.1"
 
-graphql-tag@^2.10.1, graphql-tag@^2.9.2:
-  version "2.10.3"
-  resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03"
-  integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA==
+graphql-tag@^2.10.1, graphql-tag@^2.10.4, graphql-tag@^2.9.2:
+  version "2.10.4"
+  resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.4.tgz#2f301a98219be8b178a6453bb7e33b79b66d8f83"
+  integrity sha512-O7vG5BT3w6Sotc26ybcvLKNTdfr4GfsIVMD+LdYqXCeJIYPRyp8BIsDOUtxw7S1PYvRw5vH3278J2EDezR6mfA==
 
-graphql-tools@^4.0.0, graphql-tools@^4.0.4:
+graphql-tools@^4.0.0, graphql-tools@^4.0.5:
   version "4.0.8"
   resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30"
   integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==
@@ -7269,9 +7530,9 @@ graphql-upload@^8.0.2:
     object-path "^0.11.4"
 
 graphql@^14.0.2, graphql@^14.2.1, graphql@^14.5.3:
-  version "14.6.0"
-  resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.6.0.tgz#57822297111e874ea12f5cd4419616930cd83e49"
-  integrity sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==
+  version "14.7.0"
+  resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72"
+  integrity sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==
   dependencies:
     iterall "^1.2.2"
 
@@ -7426,22 +7687,18 @@ helmet-csp@2.10.0:
     dasherize "2.0.0"
 
 helmet@^3.8.1:
-  version "3.22.0"
-  resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.22.0.tgz#3a6f11d931799145f0aff15dbc563cff9e13131f"
-  integrity sha512-Xrqicn2nm1ZIUxP3YGuTBmbDL04neKsIT583Sjh0FkiwKDXYCMUqGqC88w3NUvVXtA75JyR2Jn6jw6ZEMOD+ZA==
+  version "3.23.3"
+  resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.23.3.tgz#5ba30209c5f73ded4ab65746a3a11bedd4579ab7"
+  integrity sha512-U3MeYdzPJQhtvqAVBPntVgAvNSOJyagwZwyKsFdyRa8TV3pOKVFljalPOCxbw5Wwf2kncGhmP0qHjyazIdNdSA==
   dependencies:
     depd "2.0.0"
-    dns-prefetch-control "0.2.0"
     dont-sniff-mimetype "1.1.0"
-    expect-ct "0.2.0"
     feature-policy "0.3.0"
-    frameguard "3.1.0"
     helmet-crossdomain "0.4.0"
     helmet-csp "2.10.0"
     hide-powered-by "1.1.0"
     hpkp "2.0.0"
     hsts "2.2.0"
-    ienoopen "1.1.0"
     nocache "2.1.0"
     referrer-policy "1.2.0"
     x-xss-protection "1.3.0"
@@ -7477,17 +7734,12 @@ hoek@4.x.x:
   resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
   integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==
 
-hoek@6.x.x:
-  version "6.1.3"
-  resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c"
-  integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==
-
 hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0:
   version "2.5.5"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
   integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==
 
-hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
+hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
   integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -7651,14 +7903,14 @@ http-errors@1.7.2:
     statuses ">= 1.5.0 < 2"
     toidentifier "1.0.0"
 
-http-errors@^1.7.3, http-errors@~1.7.2:
-  version "1.7.3"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
-  integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+http-errors@^1.7.3:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507"
+  integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==
   dependencies:
     depd "~1.1.2"
     inherits "2.0.4"
-    setprototypeof "1.1.1"
+    setprototypeof "1.2.0"
     statuses ">= 1.5.0 < 2"
     toidentifier "1.0.0"
 
@@ -7672,6 +7924,17 @@ http-errors@~1.6.2:
     setprototypeof "1.1.0"
     statuses ">= 1.4.0 < 2"
 
+http-errors@~1.7.2:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+  integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.4"
+    setprototypeof "1.1.1"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
 http-parser-js@>=0.5.1:
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77"
@@ -7739,13 +8002,20 @@ i@0.3.x:
   resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d"
   integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=
 
-iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
+iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
+iconv-lite@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01"
+  integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3.0.0"
+
 icss-replace-symbols@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -7768,11 +8038,6 @@ ieee754@^1.1.4:
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
   integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
 
-ienoopen@1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.1.0.tgz#411e5d530c982287dbdc3bb31e7a9c9e32630974"
-  integrity sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==
-
 iferr@^0.1.5:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
@@ -7795,6 +8060,11 @@ image-q@^1.1.1:
   resolved "https://registry.yarnpkg.com/image-q/-/image-q-1.1.1.tgz#fc84099664460b90ca862d9300b6bfbbbfbf8056"
   integrity sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=
 
+immediate@^3.2.3:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
+  integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
+
 import-fresh@^3.1.0:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
@@ -7803,14 +8073,6 @@ import-fresh@^3.1.0:
     parent-module "^1.0.0"
     resolve-from "^4.0.0"
 
-import-local@2.0.0, import-local@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
-  integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
-  dependencies:
-    pkg-dir "^3.0.0"
-    resolve-cwd "^2.0.0"
-
 import-local@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
@@ -7819,6 +8081,14 @@ import-local@^1.0.0:
     pkg-dir "^2.0.0"
     resolve-cwd "^2.0.0"
 
+import-local@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+  integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
+  dependencies:
+    pkg-dir "^3.0.0"
+    resolve-cwd "^2.0.0"
+
 imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@@ -7864,7 +8134,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -7921,15 +8191,15 @@ internal-slot@^1.0.2:
     has "^1.0.3"
     side-channel "^1.0.2"
 
-interpret@1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
-  integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
+interpret@^1.2.0, interpret@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+  integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
 
-interpret@^1.2.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.3.0.tgz#6f637617cf307760be422ab9f4d13cc8a35eca1a"
-  integrity sha512-RDVhhDkycLoSQtE9o0vpK/vOccVDsCbWVzRxArGYnlQLcihPl2loFbPyiH7CM0m2/ijOJU3+PZbnBPaB6NJ1MA==
+interpret@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+  integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
 
 invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4:
   version "2.2.4"
@@ -7953,11 +8223,6 @@ invert-kv@^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"
-  integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
-
 ip-regex@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
@@ -8067,10 +8332,10 @@ is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.1:
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
   integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
 
-is-callable@^1.1.4, is-callable@^1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
-  integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
+is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
+  integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==
 
 is-ci@2.0.0:
   version "2.0.0"
@@ -8220,13 +8485,13 @@ is-hexadecimal@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
   integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
 
-is-installed-globally@0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
-  integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
+is-installed-globally@0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
+  integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
   dependencies:
-    global-dirs "^0.1.0"
-    is-path-inside "^1.0.0"
+    global-dirs "^2.0.1"
+    is-path-inside "^3.0.1"
 
 is-map@^2.0.1:
   version "2.0.1"
@@ -8291,13 +8556,6 @@ is-path-in-cwd@^2.0.0:
   dependencies:
     is-path-inside "^2.1.0"
 
-is-path-inside@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
-  integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
-  dependencies:
-    path-is-inside "^1.0.1"
-
 is-path-inside@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
@@ -8305,6 +8563,11 @@ is-path-inside@^2.1.0:
   dependencies:
     path-is-inside "^1.0.2"
 
+is-path-inside@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
+  integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
+
 is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
@@ -8332,12 +8595,12 @@ is-promise@^2.1.0:
   resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
   integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
 
-is-regex@^1.0.4, is-regex@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
-  integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff"
+  integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==
   dependencies:
-    has "^1.0.3"
+    has-symbols "^1.0.1"
 
 is-regexp@^1.0.0:
   version "1.0.0"
@@ -8515,9 +8778,9 @@ isomorphic-fetch@^2.1.1:
     whatwg-fetch ">=0.10.0"
 
 isomorphic.js@^0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.1.3.tgz#b2956e14be3bc10efb5fe80e6b5bebc16e1deeca"
-  integrity sha512-pabBRLDwYefSsNS+qCazJ97o7P5xDTrNoxSYFTM09JlZTxPrOEPGKekwqUy3/Np4C4PHnVUXHYsZPOix0jELsA==
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.1.4.tgz#6cc878773b0d895261a1b022e6863d564fcccd28"
+  integrity sha512-t9zbgkjE7f9f2M6OSW49YEq0lUrSdAllBbWFUZoeck/rnnFae6UlhmDtXWs48VJY3ZpryCoZsRiAiKD44hPIGQ==
 
 isstream@0.1.x, isstream@~0.1.2:
   version "0.1.2"
@@ -8926,15 +9189,6 @@ joi@^10.0.6:
     items "2.x.x"
     topo "2.x.x"
 
-joi@^14.3.0:
-  version "14.3.1"
-  resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c"
-  integrity sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==
-  dependencies:
-    hoek "6.x.x"
-    isemail "3.x.x"
-    topo "3.x.x"
-
 jpeg-js@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.0.tgz#39adab7245b6d11e918ba5d4b49263ff2fc6a2f9"
@@ -9130,10 +9384,10 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
-jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.3.0.tgz#edd727794ea284d7fda575015ed1b0cde0289ab6"
-  integrity sha512-3HNoc7nZ1hpZIKB3hJ7BlFRkzCx2BynRtfSwbkqZdpRdvAPsGMnzclPwrvDBS7/lalHTj21NwIeaEpysHBOudg==
+jsx-ast-utils@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e"
+  integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==
   dependencies:
     array-includes "^3.1.1"
     object.assign "^4.1.0"
@@ -9207,34 +9461,142 @@ knex@^0.16.3:
     uuid "^3.3.2"
     v8flags "^3.1.2"
 
+knex@^0.21.1:
+  version "0.21.2"
+  resolved "https://registry.yarnpkg.com/knex/-/knex-0.21.2.tgz#716e2f515aa55575eb812b4c7f58e532a3de6a12"
+  integrity sha512-hNp9f3yXCHtMrhV2pVsuCNYmPlgXhyqviMQGLBd9zdF03ZqCO9MPng0oYhNMgIs+vDr55VC6tjEbF1OQ1La7Kg==
+  dependencies:
+    colorette "1.2.1"
+    commander "^5.1.0"
+    debug "4.1.1"
+    esm "^3.2.25"
+    getopts "2.2.5"
+    inherits "~2.0.4"
+    interpret "^2.2.0"
+    liftoff "3.1.0"
+    lodash "^4.17.19"
+    mkdirp "^1.0.4"
+    pg-connection-string "2.3.0"
+    tarn "^3.0.0"
+    tildify "2.0.0"
+    uuid "^7.0.3"
+    v8flags "^3.2.0"
+
 known-css-properties@^0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.5.0.tgz#6ff66943ed4a5b55657ee095779a91f4536f8084"
   integrity sha512-LOS0CoS8zcZnB1EjLw4LLqDXw8nvt3AGH5dXLQP3D9O1nLLA+9GC5GnPl5mmF+JiQAtSX4VyZC7KvEtcA4kUtA==
 
-lazy-ass@1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513"
-  integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM=
+language-subtag-registry@~0.3.2:
+  version "0.3.20"
+  resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz#a00a37121894f224f763268e431c55556b0c0755"
+  integrity sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==
+
+language-tags@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a"
+  integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=
+  dependencies:
+    language-subtag-registry "~0.3.2"
+
+lazy-ass@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513"
+  integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM=
+
+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"
+
+left-pad@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
+  integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==
+
+level-codec@^9.0.0:
+  version "9.0.2"
+  resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
+  integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+  dependencies:
+    buffer "^5.6.0"
+
+level-concat-iterator@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
+  integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
+  integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+  dependencies:
+    errno "~0.1.1"
+
+level-iterator-stream@~4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
+  integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
+  dependencies:
+    inherits "^2.0.4"
+    readable-stream "^3.4.0"
+    xtend "^4.0.2"
+
+level-js@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/level-js/-/level-js-5.0.2.tgz#5e280b8f93abd9ef3a305b13faf0b5397c969b55"
+  integrity sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==
+  dependencies:
+    abstract-leveldown "~6.2.3"
+    buffer "^5.5.0"
+    inherits "^2.0.3"
+    ltgt "^2.1.2"
+
+level-packager@^5.1.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
+  integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
+  dependencies:
+    encoding-down "^6.3.0"
+    levelup "^4.3.2"
+
+level-supports@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
+  integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
+  dependencies:
+    xtend "^4.0.2"
 
-lcid@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
-  integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+level@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6"
+  integrity sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==
   dependencies:
-    invert-kv "^1.0.0"
+    level-js "^5.0.0"
+    level-packager "^5.1.0"
+    leveldown "^5.4.0"
 
-lcid@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
-  integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
+leveldown@^5.4.0:
+  version "5.6.0"
+  resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98"
+  integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==
   dependencies:
-    invert-kv "^2.0.0"
+    abstract-leveldown "~6.2.1"
+    napi-macros "~2.0.0"
+    node-gyp-build "~4.1.0"
 
-left-pad@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
-  integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==
+levelup@^4.3.2:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
+  integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
+  dependencies:
+    deferred-leveldown "~5.3.0"
+    level-errors "~2.0.0"
+    level-iterator-stream "~4.0.0"
+    level-supports "~1.0.0"
+    xtend "~4.0.0"
 
 leven@^2.1.0:
   version "2.1.0"
@@ -9261,13 +9623,20 @@ levn@^0.3.0, levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
-lib0@^0.2.27, lib0@^0.2.28:
+lib0@^0.2.28:
   version "0.2.28"
   resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.28.tgz#bb0c9af79b260ebf3a7b359af622e1d8c5dc52fd"
   integrity sha512-3gB5Ow5B/iL5jSEDgNIlkylX5loHrGeTajZXcCFEE8svVhYBVAn9Rt0uw+86bpbw64tFN8gkZ+BSivv8C0ZWdQ==
   dependencies:
     isomorphic.js "^0.1.3"
 
+lib0@^0.2.31, lib0@^0.2.32:
+  version "0.2.32"
+  resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.32.tgz#ec4572d84c00355a8d998b83eb950cf9da9c2792"
+  integrity sha512-cHHKhHTojtvFSsthTk+CKuD17jMHIxuZxYpTzXj9TeQLPNoGNDPl6ax+J6eFETVe3ZvPMh3V0nGfJgGo6QgSvA==
+  dependencies:
+    isomorphic.js "^0.1.3"
+
 liftoff@3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3"
@@ -9453,15 +9822,6 @@ loader-runner@^2.4.0:
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
   integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
 
-loader-utils@1.2.3:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
-  integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
-  dependencies:
-    big.js "^5.2.2"
-    emojis-list "^2.0.0"
-    json5 "^1.0.1"
-
 loader-utils@^0.2.16:
   version "0.2.17"
   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
@@ -9504,7 +9864,7 @@ locate-path@^5.0.0:
   dependencies:
     p-locate "^4.1.0"
 
-lodash-es@^4.17.14:
+lodash-es@^4.17.11, lodash-es@^4.17.14:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
   integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
@@ -9606,7 +9966,12 @@ lodash.uniq@^4.5.0:
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
   integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
 
-lodash@4.17.15, lodash@^4, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1:
+lodash@4.17.19, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4:
+  version "4.17.19"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
+  integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
+
+lodash@^4, lodash@^4.17.3, lodash@^4.3.0:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -9699,6 +10064,11 @@ lru-cache@^5.0.0, lru-cache@^5.1.1:
   dependencies:
     yallist "^3.0.2"
 
+ltgt@^2.1.2:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+  integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
 make-dir@^1.0.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@@ -9735,19 +10105,12 @@ makeerror@1.0.x:
   dependencies:
     tmpl "1.0.x"
 
-map-age-cleaner@^0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
-  integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
-  dependencies:
-    p-defer "^1.0.0"
-
 map-cache@^0.2.0, map-cache@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
   integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
 
-map-obj@^1.0.0, map-obj@^1.0.1:
+map-obj@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
   integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
@@ -9838,21 +10201,12 @@ mem@^1.1.0:
   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"
-  integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
-  dependencies:
-    map-age-cleaner "^0.1.1"
-    mimic-fn "^2.0.0"
-    p-is-promise "^2.0.0"
-
 memoize-one@^5.0.0:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
   integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==
 
-memory-fs@^0.4.0, 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=
@@ -9868,22 +10222,6 @@ memory-fs@^0.5.0:
     errno "^0.1.3"
     readable-stream "^2.0.1"
 
-meow@^3.3.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
-  integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
-  dependencies:
-    camelcase-keys "^2.0.0"
-    decamelize "^1.1.2"
-    loud-rejection "^1.0.0"
-    map-obj "^1.0.1"
-    minimist "^1.1.3"
-    normalize-package-data "^2.3.4"
-    object-assign "^4.0.1"
-    read-pkg-up "^1.0.1"
-    redent "^1.0.0"
-    trim-newlines "^1.0.0"
-
 meow@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975"
@@ -10006,7 +10344,7 @@ mimic-fn@^1.0.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
   integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
 
-mimic-fn@^2.0.0, mimic-fn@^2.1.0:
+mimic-fn@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
@@ -10169,16 +10507,21 @@ mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp
   dependencies:
     minimist "^1.2.5"
 
-moment@2.24.0:
-  version "2.24.0"
-  resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
-  integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
+mkdirp@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
-moment@^2.18.1, moment@^2.22.1:
+moment@2.26.0:
   version "2.26.0"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a"
   integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==
 
+moment@^2.18.1, moment@^2.22.1:
+  version "2.27.0"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d"
+  integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==
+
 moo@^0.5.0:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4"
@@ -10286,6 +10629,11 @@ nanomatch@^1.2.9:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
+napi-macros@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b"
+  integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==
+
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -10311,9 +10659,9 @@ ncp@1.0.x:
   integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=
 
 nearley@^2.7.10:
-  version "2.19.3"
-  resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.3.tgz#ae3b040e27616b5348102c436d1719209476a5a1"
-  integrity sha512-FpAy1PmTsUpOtgxr23g4jRNvJHYzZEW2PixXeSzksLR/ykPfwKhAodc2+9wQhY+JneWLcvkDw6q7FJIsIdF/aQ==
+  version "2.19.5"
+  resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.5.tgz#6be78e4942eeb9a043b17c563413111d4ad849b7"
+  integrity sha512-qoh1ZXXl0Kpn40tFhmgvffUAlbpRMcjLUagNVnT1JmliUIsB4tFabmCNhD97+tkf9FZ/SLhhYzNow0V3GitzDg==
   dependencies:
     commander "^2.19.0"
     moo "^0.5.0"
@@ -10335,7 +10683,12 @@ negotiator@0.6.2:
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
   integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
 
-neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
+neo-async@^2.5.0, neo-async@^2.6.1:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+neo-async@^2.6.0:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
   integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
@@ -10358,11 +10711,11 @@ nocache@2.1.0:
   integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==
 
 node-dev@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/node-dev/-/node-dev-4.0.0.tgz#c03a492c517ed3153693f9082e46c304c522a48d"
-  integrity sha512-XwaUAv2bb7Y9bhCT8dsel5XquRQczG5z4QYhh2otdUMuhRAgtDjFxZEKK4Tsa57vL2ye8ojfLIAZOTBx+Ui9zw==
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/node-dev/-/node-dev-4.3.0.tgz#de98164a86bbb6dbd7378e23f3d6638041d4a81f"
+  integrity sha512-rKXIUEHCETQWwNu0t0mK2fPxHjdtR0BFH35LjXsGq0e0gJf7z8Lgor348h8WqTVl7P5YWgNu5ZtarOV2uKvlVg==
   dependencies:
-    dateformat "~1.0.4-1.2.3"
+    dateformat "^3.0.3"
     dynamic-dedupe "^0.3.0"
     filewatcher "~3.0.0"
     minimist "^1.1.3"
@@ -10387,6 +10740,11 @@ 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-build@~4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
+  integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
+
 node-int64@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
@@ -10448,10 +10806,10 @@ node-pre-gyp@0.14.0:
     semver "^5.3.0"
     tar "^4.4.2"
 
-node-releases@^1.1.53:
-  version "1.1.57"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.57.tgz#f6754ce225fad0611e61228df3e09232e017ea19"
-  integrity sha512-ZQmnWS7adi61A9JsllJ2gdj2PauElcjnOwTp2O011iGzoakTxUsDGSe+6vD7wXbKdqhSFymC0OSx35aAMhrSdw==
+node-releases@^1.1.58:
+  version "1.1.59"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.59.tgz#4d648330641cec704bff10f8e4fe28e453ab8e8e"
+  integrity sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw==
 
 node-wait-for-it@^0.2.0:
   version "0.2.0"
@@ -10632,10 +10990,15 @@ object-copy@^0.1.0:
     define-property "^0.2.5"
     kind-of "^3.0.3"
 
+object-hash@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea"
+  integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==
+
 object-inspect@^1.7.0:
-  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==
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
+  integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
 
 object-is@^1.0.1, object-is@^1.0.2, object-is@^1.1.2:
   version "1.1.2"
@@ -10682,7 +11045,7 @@ object.defaults@^1.1.0:
     for-own "^1.0.0"
     isobject "^3.0.0"
 
-object.entries@^1.1.0, object.entries@^1.1.1:
+object.entries@^1.1.1, object.entries@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
   integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
@@ -10732,7 +11095,7 @@ object.pick@^1.2.0, object.pick@^1.3.0:
   dependencies:
     isobject "^3.0.1"
 
-object.values@^1.1.0, object.values@^1.1.1:
+object.values@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
   integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
@@ -10751,6 +11114,14 @@ objection@^1.5.3:
     bluebird "^3.5.5"
     lodash "^4.17.11"
 
+objection@^2.1.3:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/objection/-/objection-2.2.1.tgz#d0d4ae91bf97c89301d1390bf76c8bf4ab237e56"
+  integrity sha512-VY/OGLlLpHwIHck9/HC9meSpjE9w2b4ufxDu/igVCowyDajmcU3AwRmaqKQP8MhMCLPZKSj8gqIAQ5m5zpV5YA==
+  dependencies:
+    ajv "^6.12.0"
+    db-errors "^0.2.3"
+
 obuf@^1.0.0, obuf@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
@@ -10818,6 +11189,13 @@ optimism@^0.10.0:
   dependencies:
     "@wry/context" "^0.4.0"
 
+optimism@^0.12.1:
+  version "0.12.1"
+  resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.12.1.tgz#933f9467b9aef0e601655adb9638f893e486ad02"
+  integrity sha512-t8I7HM1dw0SECitBYAqFOVHoBAHEQBTeKjIL9y9ImHzAVkdyPK4ifTgM4VJRDtTUY4r/u5Eqxs4XcGPHaoPkeQ==
+  dependencies:
+    "@wry/context" "^0.5.2"
+
 optimist@0.2:
   version "0.2.8"
   resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.2.8.tgz#e981ab7e268b457948593b55674c099a815cac31"
@@ -10886,15 +11264,6 @@ os-locale@^2.0.0:
     lcid "^1.0.0"
     mem "^1.1.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==
-  dependencies:
-    execa "^1.0.0"
-    lcid "^2.0.0"
-    mem "^4.0.0"
-
 os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@@ -10913,11 +11282,6 @@ ospath@1.2.2:
   resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b"
   integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=
 
-p-defer@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
-  integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
-
 p-finally@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
@@ -10928,11 +11292,6 @@ p-finally@^2.0.0:
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561"
   integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==
 
-p-is-promise@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
-  integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
-
 p-limit@^1.0.0, p-limit@^1.1.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@@ -11244,7 +11603,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+path-is-inside@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
   integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
@@ -11329,9 +11688,9 @@ pause@0.0.1:
   integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
 
 pbkdf2@^3.0.3:
-  version "3.0.17"
-  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
-  integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
+  integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
   dependencies:
     create-hash "^1.1.2"
     create-hmac "^1.1.4"
@@ -11368,6 +11727,11 @@ pg-connection-string@2.0.0:
   resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.0.0.tgz#3eefe5997e06d94821e4d502e42b6a1c73f8df82"
   integrity sha1-Pu/lmX4G2Ugh5NUC5CtqHHP434I=
 
+pg-connection-string@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.3.0.tgz#c13fcb84c298d0bfa9ba12b40dd6c23d946f55d6"
+  integrity sha512-ukMTJXLI7/hZIwTW7hGMZJ0Lj0S2XQBCJ4Shv4y1zgQ/vqVea+FLhzywvPj0ujSuofu+yA4MYHGZPTsgjBgJ+w==
+
 pg-int8@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
@@ -11485,13 +11849,6 @@ pkg-dir@^4.1.0:
   dependencies:
     find-up "^4.0.0"
 
-pkg-up@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
-  integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
-  dependencies:
-    find-up "^2.1.0"
-
 pkginfo@0.3.x:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
@@ -11513,9 +11870,9 @@ pngjs@^3.0.0, pngjs@^3.3.3:
   integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
 
 portfinder@^1.0.26:
-  version "1.0.26"
-  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70"
-  integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==
+  version "1.0.27"
+  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.27.tgz#a41333c116b5e5f3d380f9745ac2f35084c4c758"
+  integrity sha512-bJ3U3MThKnyJ9Dx1Idtm5pQmxXqw08+XOHhi/Lie8OF1OlhVaBFhsntAIhkZYjfDcCzszSr0w1yCbccThhzgxQ==
   dependencies:
     async "^2.6.2"
     debug "^3.1.1"
@@ -11981,11 +12338,6 @@ promise-inflight@^1.0.1:
   resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
   integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
 
-promise-queue@^2.2.3:
-  version "2.2.5"
-  resolved "https://registry.yarnpkg.com/promise-queue/-/promise-queue-2.2.5.tgz#2f6f5f7c0f6d08109e967659c79b88a9ed5e93b4"
-  integrity sha1-L29ffA9tCBCelnZZx5uIqe1ek7Q=
-
 promise@^7.1.1:
   version "7.3.1"
   resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
@@ -11993,7 +12345,7 @@ promise@^7.1.1:
   dependencies:
     asap "~2.0.3"
 
-prompt@^1.0.0, prompt@flatiron/prompt#1c95d1d8d333b5fbc13fa5f0619f3dcf0d514f87:
+prompt@flatiron/prompt#1c95d1d8d333b5fbc13fa5f0619f3dcf0d514f87:
   version "1.0.0"
   resolved "https://codeload.github.com/flatiron/prompt/tar.gz/1c95d1d8d333b5fbc13fa5f0619f3dcf0d514f87"
   dependencies:
@@ -12021,6 +12373,11 @@ prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0,
     object-assign "^4.1.1"
     react-is "^16.8.1"
 
+property-expr@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.2.tgz#fff2a43919135553a3bc2fdd94bdb841965b2330"
+  integrity sha512-bc/5ggaYZxNkFKj374aLbEDqVADdYaLcFo8XBkishUWbaAdjlphaBFns9TvRA2pUseVL/wMFmui9X3IdNDU37g==
+
 prosemirror-commands@^1.0.1, prosemirror-commands@^1.1.3:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.4.tgz#991563e67623acab4f8c510fad1570f8b4693780"
@@ -12092,13 +12449,20 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.3:
     prosemirror-state "^1.0.0"
     w3c-keyname "^2.2.0"
 
-prosemirror-model@>=1.0.0, prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.2.0, prosemirror-model@^1.8.1, prosemirror-model@^1.9.1:
+prosemirror-model@>=1.0.0, prosemirror-model@^1.8.1, prosemirror-model@^1.9.1:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.10.0.tgz#bb1101732bccacf336e23a36a8b045b865025fa2"
   integrity sha512-xTMbbO2q4abs5lJdeRvk/SrftNfZlMdvChKziTiK+OKtP8LkQI8uw39u4S5zqyflrmW3Or6+qnyFPf1p4v2u1g==
   dependencies:
     orderedmap "^1.1.0"
 
+prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.2.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.11.0.tgz#dc36cdb3ad6442b9f6325c7d89170c624f9dc520"
+  integrity sha512-GqoAz/mIYjdv8gVYJ8mWFKpHoTxn/lXq4tXJ6bTVxs+rem2LzMYXrNVXfucGtfsgqsJlRIgng/ByG9j7Q8XDrg==
+  dependencies:
+    orderedmap "^1.1.0"
+
 prosemirror-schema-basic@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.1.2.tgz#4bde5c339c845e0d08ec8fe473064e372ca51ae3"
@@ -12144,7 +12508,14 @@ prosemirror-tables@^1.1.0:
     prosemirror-transform "^1.2.1"
     prosemirror-view "^1.13.3"
 
-prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.3:
+prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.2.7.tgz#ba0e291a3cb43e6b633b779d93f53d01f5dad570"
+  integrity sha512-/107Lo2zeDgXuJBxb8s/clNu0Z2W8Gv3MKmkuSS/68Mcr7LBaUnN/Hj2g+GUxEJ7MpExCzFs65GrsNo2K9rxUQ==
+  dependencies:
+    prosemirror-model "^1.0.0"
+
+prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.3:
   version "1.2.5"
   resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.2.5.tgz#7a3e2c61fcdbaf1d0844a2a3bc34fc3524e9809c"
   integrity sha512-eqeIaxWtUfOnpA1ERrXCuSIMzqIJtL9Qrs5uJMCjY5RMSaH5o4pc390SAjn/IDPeIlw6auh0hCCXs3wRvGnQug==
@@ -12156,7 +12527,16 @@ prosemirror-utils@^0.9.6:
   resolved "https://registry.yarnpkg.com/prosemirror-utils/-/prosemirror-utils-0.9.6.tgz#3d97bd85897e3b535555867dc95a51399116a973"
   integrity sha512-UC+j9hQQ1POYfMc5p7UFxBTptRiGPR7Kkmbl3jVvU8VgQbkI89tR/GK+3QYC8n+VvBZrtAoCrJItNhWSxX3slA==
 
-prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.11, prosemirror-view@^1.13.3:
+prosemirror-view@^1.0.0, prosemirror-view@^1.1.0:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.15.2.tgz#3f07881d11f18c033467591bbaec26b569bbc22c"
+  integrity sha512-0wftmMDVD8VXj2HZgv6Rg//+tgJC0lpV9LkYlCiAkDLKsf4yW3Ozs5td1ZXqsyoqvX0ga/k5g2EyLbqOMmC1+w==
+  dependencies:
+    prosemirror-model "^1.1.0"
+    prosemirror-state "^1.0.0"
+    prosemirror-transform "^1.1.0"
+
+prosemirror-view@^1.13.11, prosemirror-view@^1.13.3:
   version "1.14.11"
   resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.14.11.tgz#cb1fa9910ac5c834fd8bb15598d4ed6609465a5c"
   integrity sha512-zcd6saORBuYkn2bVh9Nqu0BfSPE4xl2ct3VpWTu/BUShs/8hlIpckxz/9+NwcDqgYc+AgBgo/XcL0HNcLdxvjw==
@@ -12224,15 +12604,15 @@ public-encrypt@^4.0.0:
     safe-buffer "^5.1.2"
 
 pubsweet-client@^10.0.2:
-  version "10.2.4"
-  resolved "https://registry.yarnpkg.com/pubsweet-client/-/pubsweet-client-10.2.4.tgz#e00ab8eb9534b5259fa0037929bf0b444e0ef9b2"
-  integrity sha512-BLOSPCsM6OB5XaKzKXZHmcaygWUUTfCvB/Id8uGRHTh0N7PkyC2ifbaS8zRLiyXMWCLj2MoQGCkglSf4fVTcEg==
+  version "10.2.5"
+  resolved "https://registry.yarnpkg.com/pubsweet-client/-/pubsweet-client-10.2.5.tgz#3f22f70bfb182a8cf7fff9bdba11c4ae699a8939"
+  integrity sha512-wIhx4BuufNGNBw54T47aVOfo//pKoEcrvixItsYesXDKh2cWjRTSOkx53nY+W9u4AvRTSse3fh3vA2sHF+ct4g==
   dependencies:
     "@apollo/react-common" "^3.1.3"
     "@apollo/react-components" "^3.1.3"
     "@apollo/react-hoc" "^3.1.3"
-    "@pubsweet/ui" "^12.5.0"
-    "@pubsweet/ui-toolkit" "^2.3.1"
+    "@pubsweet/ui" "^12.6.0"
+    "@pubsweet/ui-toolkit" "^2.3.2"
     apollo-cache-inmemory "^1.5.1"
     apollo-client "^2.6.4"
     apollo-link "^1.2.11"
@@ -12252,61 +12632,15 @@ pubsweet-client@^10.0.2:
     styled-normalize "^8.0.6"
     subscriptions-transport-ws "^0.9.12"
 
-pubsweet-server@13.7.2:
-  version "13.7.2"
-  resolved "https://registry.yarnpkg.com/pubsweet-server/-/pubsweet-server-13.7.2.tgz#4ce9f1b9e1b8b0814ba82e7a41be1224f8a66098"
-  integrity sha512-ArNwZ9YF8TJycqun7z6bn3CaVzvntGgQCS862RqRhDBAq5N1QPqfRS3fI0B8EHNedWeSdB8BCpIx866w7wSpPA==
-  dependencies:
-    "@pubsweet/db-manager" "^3.0.20"
-    "@pubsweet/errors" "^2.0.24"
-    "@pubsweet/logger" "^0.2.34"
-    "@pubsweet/models" "^0.2.21"
-    apollo-server-express "^2.4.8"
-    authsome "^0.1.0"
-    bluebird "^3.5.1"
-    body-parser "^1.15.2"
-    colors "^1.1.2"
-    config "^3.0.1"
-    cookie-parser "^1.4.3"
-    dataloader "^1.4.0"
-    dotenv "^4.0.0"
-    express "^4.16.1"
-    fs-extra "^7.0.1"
-    graphql "^14.2.1"
-    graphql-postgres-subscriptions "^1.0.4"
-    graphql-tools "^4.0.4"
-    helmet "^3.8.1"
-    http-status-codes "^1.0.6"
-    joi "^14.3.0"
-    jsonwebtoken "^8.4.0"
-    lodash "^4.0.0"
-    minimist "^1.2.0"
-    morgan "^1.8.2"
-    multer "^1.1.0"
-    objection "^1.5.3"
-    passport "^0.4.0"
-    passport-anonymous "^1.0.1"
-    passport-http-bearer "^1.0.1"
-    passport-local "^1.0.0"
-    pg "^7.4.1"
-    pg-boss "^3.1.2"
-    promise-queue "^2.2.3"
-    prompt "^1.0.0"
-    pubsweet-sse "^1.0.28"
-    subscriptions-transport-ws "^0.9.12"
-    uuid "^3.0.1"
-    waait "^1.0.2"
-    winston "^2.2.0"
-
-pubsweet-server@^13.11.0:
-  version "13.11.0"
-  resolved "https://registry.yarnpkg.com/pubsweet-server/-/pubsweet-server-13.11.0.tgz#5ac8c892248843e5e6d55b178884b6d50d74aa38"
-  integrity sha512-aReJWCt7T/LDifz7Fkw/HV+TMEMHLQmCU8UhOkxNZ4hl5hUe3qnfZ2YaB/wIWg90kiAf/w88e8K+jq+dA0DMMw==
+pubsweet-server@13.11.1, pubsweet-server@^13.11.1:
+  version "13.11.1"
+  resolved "https://registry.yarnpkg.com/pubsweet-server/-/pubsweet-server-13.11.1.tgz#8ebed92e8cfddee3aa65543473896f0cc66062e2"
+  integrity sha512-MT6KincsVjgYjd3FtNqQd2AcuM39vM9Ebe6AlhFUJVhgNmIuFAXrg3p/pjxDxkCWKDs/oI9V8brldndzvU29UQ==
   dependencies:
-    "@pubsweet/db-manager" "^3.1.10"
-    "@pubsweet/errors" "^2.0.35"
-    "@pubsweet/logger" "^0.2.45"
-    "@pubsweet/models" "^0.3.10"
+    "@pubsweet/db-manager" "^3.1.11"
+    "@pubsweet/errors" "^2.0.36"
+    "@pubsweet/logger" "^0.2.46"
+    "@pubsweet/models" "^0.3.11"
     apollo-server-express "^2.4.8"
     authsome "^0.1.0"
     body-parser "^1.15.2"
@@ -12324,29 +12658,29 @@ pubsweet-server@^13.11.0:
     lodash "^4.0.0"
     morgan "^1.8.2"
     multer "^1.1.0"
-    objection "^1.5.3"
+    objection "^2.1.3"
     passport "^0.4.0"
     passport-anonymous "^1.0.1"
     passport-http-bearer "^1.0.1"
     passport-local "^1.0.0"
     pg "^7.4.1"
     pg-boss "^3.1.2"
-    pubsweet-sse "^1.0.39"
+    pubsweet-sse "^1.0.40"
     subscriptions-transport-ws "^0.9.12"
     waait "^1.0.2"
 
-pubsweet-sse@^1.0.28, pubsweet-sse@^1.0.39:
-  version "1.0.39"
-  resolved "https://registry.yarnpkg.com/pubsweet-sse/-/pubsweet-sse-1.0.39.tgz#aa2f17401cc71f6844b279907b1e5f7486f2f0ef"
-  integrity sha512-jZM0JAm8Uj3vPz/WQpU/lSgZQmnM3xcLL0NEclyD/Wgs2QU2fxtZ7yA+/dhgH/YYoCiyim3lkdMpyDt8g072+g==
+pubsweet-sse@^1.0.40:
+  version "1.0.40"
+  resolved "https://registry.yarnpkg.com/pubsweet-sse/-/pubsweet-sse-1.0.40.tgz#93736085ca472ba28b11d08a212a5b96dfaab314"
+  integrity sha512-1hVcG3D4wxMyA979pllqIIBrnK8i9BilEvF1xsIu20zTh053eA5bMbJXxR5mm8OUGNqXdqqoz8LsZuJqR43XNQ==
 
 pubsweet@^5.1.2:
-  version "5.1.13"
-  resolved "https://registry.yarnpkg.com/pubsweet/-/pubsweet-5.1.13.tgz#7b5be20f2dd82052c4d6337808940918c7be7a33"
-  integrity sha512-B2zvhjqvuxR91yQKwxzBzk0MZL7bsIJjlU7fZUinSgzvlfEOCSlCuOil18Q/RYm+b1p0+xFbTPS0RYHhXJITJA==
+  version "5.1.14"
+  resolved "https://registry.yarnpkg.com/pubsweet/-/pubsweet-5.1.14.tgz#a4f8756e72b3a8c63b24344d52e72d7bdd3a5180"
+  integrity sha512-f8L4/099/fTU26fCmhBlv/QxhvAmutyNOJ7FfpYLVcXiJ7sWdWhtTwAHvI3mLMbIEXWbFhBCMIS9GH4OqDQHwg==
   dependencies:
-    "@pubsweet/db-manager" "^3.1.10"
-    "@pubsweet/logger" "^0.2.45"
+    "@pubsweet/db-manager" "^3.1.11"
+    "@pubsweet/logger" "^0.2.46"
     colors "^1.1.2"
     commander "^2.20.0"
     config "^3.0.1"
@@ -12357,7 +12691,7 @@ pubsweet@^5.1.2:
     lodash "^4.17.11"
     node-dev "^4.0.0"
     prompt flatiron/prompt#1c95d1d8d333b5fbc13fa5f0619f3dcf0d514f87
-    pubsweet-server "^13.11.0"
+    pubsweet-server "^13.11.1"
     webpack "^4.29.5"
     webpack-dev-middleware "^3.6.0"
     webpack-dev-server "^3.9.0"
@@ -12495,7 +12829,7 @@ randomatic@^3.0.0:
     kind-of "^6.0.0"
     math-random "^1.0.1"
 
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
   integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
@@ -12619,9 +12953,9 @@ react-html-parser@^2.0.2:
     htmlparser2 "^3.9.0"
 
 react-image@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/react-image/-/react-image-4.0.1.tgz#e85a9c5ca11c84c59098dc0db3f5fabb05aacc50"
-  integrity sha512-B80I1UQU6XHJ5ZrQrmD6ADc5GrBlpXRsmcgBgwwJnfYflynkZ5NBrLBR+yt3zlDp6qlelxrBnF0ChpOwdgYiEA==
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/react-image/-/react-image-4.0.3.tgz#6fa722877660b67295298a914bff1ed87ad2cf83"
+  integrity sha512-19MUK9u1qaw9xys8XEsVkSpVhHctEBUeYFvrLTe1PN+4w5Co13AN2WA7xtBshPM6SthsOj77SlDrEAeOaJpf7g==
 
 react-input-autosize@^2.1.2, react-input-autosize@^2.2.2:
   version "2.2.2"
@@ -12630,7 +12964,7 @@ react-input-autosize@^2.1.2, react-input-autosize@^2.2.2:
   dependencies:
     prop-types "^15.5.8"
 
-react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6, react-is@^16.9.0:
+react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6:
   version "16.13.1"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
   integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -12664,13 +12998,12 @@ react-markdown@^4.3.1:
     xtend "^4.0.1"
 
 react-mentions@^3.3.1:
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/react-mentions/-/react-mentions-3.3.1.tgz#b9e111443403de6a8c7e7f363d6d10939f0615f4"
-  integrity sha512-/UOZXTgK2rvuyjj8T0wVb4AsAjcKahwG6PtweSdbZAWbwmkaGkm49Yu725D6Xyw73h4qZhvzIeIY0K8ichfAHg==
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/react-mentions/-/react-mentions-3.3.2.tgz#6dca1e5f80813f3397b000519badb6ae30f31547"
+  integrity sha512-JEuJMnjXOoLo+gkT59ZscZ9ulV7O333cu81pKiWutuX0CCyoedJTxPDlVJAxoaDSUwsMgOmb3GmuiwafWYdizg==
   dependencies:
     "@babel/runtime" "7.4.5"
     invariant "^2.2.4"
-    lodash "^4.5.1"
     prop-types "^15.5.8"
     substyle "^6.3.1"
 
@@ -12889,7 +13222,7 @@ readable-stream@1.1.x:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0:
+readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
   integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -12940,14 +13273,6 @@ recompose@^0.30.0:
     react-lifecycles-compat "^3.0.2"
     symbol-observable "^1.0.4"
 
-redent@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
-  integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
-  dependencies:
-    indent-string "^2.1.0"
-    strip-indent "^1.0.1"
-
 redent@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
@@ -12995,27 +13320,31 @@ regenerate-unicode-properties@^8.2.0:
     regenerate "^1.4.0"
 
 regenerate@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
-  integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f"
+  integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==
 
 regenerator-runtime@^0.11.0:
   version "0.11.1"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
   integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
 
-regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4:
+regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4:
+  version "0.13.6"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.6.tgz#d236043c46ffab2968c1ef651803d8acdea8ed65"
+  integrity sha512-GmwlGiazQEbOwQWDdbbaP10i15pGtScYWLbMZuu+RKRz0cZ+g8IUONazBnaZqe7j1670IV1HgE4/8iy7CQPf4Q==
+
+regenerator-runtime@^0.13.3:
   version "0.13.5"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
   integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
 
 regenerator-transform@^0.14.2:
-  version "0.14.4"
-  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7"
-  integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
+  integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
   dependencies:
     "@babel/runtime" "^7.8.4"
-    private "^0.1.8"
 
 regex-cache@^0.4.2:
   version "0.4.4"
@@ -13197,7 +13526,7 @@ request-promise-core@1.1.3:
   dependencies:
     lodash "^4.17.15"
 
-request-promise-native@^1.0.5, request-promise-native@^1.0.8:
+request-promise-native@^1.0.5:
   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==
@@ -13206,7 +13535,7 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.8:
     stealthy-require "^1.1.1"
     tough-cookie "^2.3.3"
 
-request@^2.87.0, request@^2.88.0:
+request@^2.87.0:
   version "2.88.2"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
   integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
@@ -13315,7 +13644,7 @@ resolve@1.1.7:
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
   integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
 
-resolve@^1.0.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.3.3:
+resolve@^1.0.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.3.3:
   version "1.17.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
   integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
@@ -13424,13 +13753,20 @@ rxjs@^5.0.0-beta.11:
   dependencies:
     symbol-observable "1.0.1"
 
-rxjs@^6.3.3, rxjs@^6.5.4:
+rxjs@^6.3.3:
   version "6.5.5"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
   integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
   dependencies:
     tslib "^1.9.0"
 
+rxjs@^6.5.5:
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84"
+  integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==
+  dependencies:
+    tslib "^1.9.0"
+
 safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -13448,7 +13784,7 @@ safe-regex@^1.1.0:
   dependencies:
     ret "~0.1.10"
 
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -13600,6 +13936,13 @@ serialize-javascript@^2.1.2:
   resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
   integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
 
+serialize-javascript@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
+  integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
+  dependencies:
+    randombytes "^2.1.0"
+
 serve-index@^1.9.1:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
@@ -13653,6 +13996,11 @@ setprototypeof@1.1.1:
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
   integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
 
+setprototypeof@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+  integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
 sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
   version "2.4.11"
   resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
@@ -13990,9 +14338,9 @@ staged-git-files@0.0.4:
   integrity sha1-15fhtVHKemOd7AI33G60u5vhfTU=
 
 start-server-and-test@^1.10.6:
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.11.0.tgz#1b1a83d062b0028ee6e296bb4e0231f2d8b2f4af"
-  integrity sha512-FhkJFYL/lvbd0tKWvbxWNWjtFtq3Zpa09QDjA8EUH88AsgNL4hkAAKYNmbac+fFM8/GIZoJ1Mj4mm3SMI0X1bA==
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.11.2.tgz#9144b7b6f25197148f159f261ae80119afbb17d5"
+  integrity sha512-rk1zS5WQvdbc8slE5hPtzfji1dFSnBAfm+vSjToZNrBvozHJvuAG80xE5u8N4tQjg3Ej1Crjc19J++r28HGJgg==
   dependencies:
     bluebird "3.7.2"
     check-more-types "2.24.0"
@@ -14000,7 +14348,7 @@ start-server-and-test@^1.10.6:
     execa "3.4.0"
     lazy-ass "1.6.0"
     ps-tree "1.2.0"
-    wait-on "4.0.0"
+    wait-on "5.1.0"
 
 state-toggle@^1.0.0:
   version "1.0.3"
@@ -14147,7 +14495,7 @@ string.prototype.trim@^1.2.1:
     es-abstract "^1.17.0-next.1"
     function-bind "^1.1.1"
 
-string.prototype.trimend@^1.0.0:
+string.prototype.trimend@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
   integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
@@ -14155,25 +14503,7 @@ string.prototype.trimend@^1.0.0:
     define-properties "^1.1.3"
     es-abstract "^1.17.5"
 
-string.prototype.trimleft@^2.1.1:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc"
-  integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
-  dependencies:
-    define-properties "^1.1.3"
-    es-abstract "^1.17.5"
-    string.prototype.trimstart "^1.0.0"
-
-string.prototype.trimright@^2.1.1:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3"
-  integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
-  dependencies:
-    define-properties "^1.1.3"
-    es-abstract "^1.17.5"
-    string.prototype.trimend "^1.0.0"
-
-string.prototype.trimstart@^1.0.0:
+string.prototype.trimstart@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
   integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
@@ -14262,13 +14592,6 @@ strip-final-newline@^2.0.0:
   resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
   integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
 
-strip-indent@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
-  integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
-  dependencies:
-    get-stdin "^4.0.1"
-
 strip-indent@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
@@ -14407,9 +14730,9 @@ stylis@^3.5.0:
   integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==
 
 subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.12, subscriptions-transport-ws@^0.9.16:
-  version "0.9.16"
-  resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz#90a422f0771d9c32069294c08608af2d47f596ec"
-  integrity sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw==
+  version "0.9.17"
+  resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.17.tgz#e30e40f0caae0d2781903c01a8cb51b6e2682098"
+  integrity sha512-hNHi2N80PBz4T0V0QhnnsMGvG3XDFDS9mS6BhZ3R12T6EBywC8d/uJscsga0cVO4DKtXCkCRrWm2sOYrbOdhEA==
   dependencies:
     backo2 "^1.0.2"
     eventemitter3 "^3.1.0"
@@ -14458,13 +14781,6 @@ supertest@^3.0.0:
     methods "^1.1.2"
     superagent "^3.8.3"
 
-supports-color@6.1.0, supports-color@^6.1.0:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
-  integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
-  dependencies:
-    has-flag "^3.0.0"
-
 supports-color@7.1.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
@@ -14491,6 +14807,13 @@ supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0:
   dependencies:
     has-flag "^3.0.0"
 
+supports-color@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+  integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+  dependencies:
+    has-flag "^3.0.0"
+
 svg-tags@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
@@ -14514,7 +14837,7 @@ symbol-observable@1.0.1:
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
   integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
 
-symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0:
+symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
   integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
@@ -14524,6 +14847,11 @@ symbol-tree@^3.2.2:
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
   integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 
+synchronous-promise@^2.0.10:
+  version "2.0.13"
+  resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.13.tgz#9d8c165ddee69c5a6542862b405bc50095926702"
+  integrity sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA==
+
 table@4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
@@ -14571,25 +14899,30 @@ tarn@^1.1.5:
   resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d"
   integrity sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g==
 
+tarn@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.0.tgz#a4082405216c0cce182b8b4cb2639c52c1e870d4"
+  integrity sha512-PKUnlDFODZueoA8owLehl8vLcgtA8u4dRuVbZc92tspDYZixjJL6TqYOmryf/PfP/EBX+2rgNcrj96NO+RPkdQ==
+
 terser-webpack-plugin@^1.4.3:
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
-  integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==
+  version "1.4.4"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f"
+  integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==
   dependencies:
     cacache "^12.0.2"
     find-cache-dir "^2.1.0"
     is-wsl "^1.1.0"
     schema-utils "^1.0.0"
-    serialize-javascript "^2.1.2"
+    serialize-javascript "^3.1.0"
     source-map "^0.6.1"
     terser "^4.1.2"
     webpack-sources "^1.4.0"
     worker-farm "^1.7.0"
 
 terser@^4.1.2:
-  version "4.7.0"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006"
-  integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==
+  version "4.8.0"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+  integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
   dependencies:
     commander "^2.20.0"
     source-map "~0.6.1"
@@ -14646,6 +14979,11 @@ tildify@1.2.0:
   dependencies:
     os-homedir "^1.0.0"
 
+tildify@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a"
+  integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==
+
 timers-browserify@^2.0.4:
   version "2.0.11"
   resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
@@ -14758,18 +15096,16 @@ topo@2.x.x:
   dependencies:
     hoek "4.x.x"
 
-topo@3.x.x:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c"
-  integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==
-  dependencies:
-    hoek "6.x.x"
-
 toposort@^1.0.0:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
   integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
 
+toposort@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
+  integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=
+
 touch@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/touch/-/touch-2.0.2.tgz#ca0b2a3ae3211246a61b16ba9e6cbf1596287164"
@@ -14792,11 +15128,6 @@ tr46@^1.0.1:
   dependencies:
     punycode "^2.1.0"
 
-trim-newlines@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
-  integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
-
 trim-newlines@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
@@ -14834,6 +15165,16 @@ ts-invariant@^0.4.0, ts-invariant@^0.4.4:
   dependencies:
     tslib "^1.9.3"
 
+tsconfig-paths@^3.9.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
+  integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
+  dependencies:
+    "@types/json5" "^0.0.29"
+    json5 "^1.0.1"
+    minimist "^1.2.0"
+    strip-bom "^3.0.0"
+
 tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3:
   version "1.13.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
@@ -15230,7 +15571,7 @@ utils-merge@1.0.1, utils-merge@1.x.x:
   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.2.1, uuid@^3.3.2, uuid@^3.4.0:
+uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2, uuid@^3.4.0:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
   integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
@@ -15241,16 +15582,16 @@ uuid@^7.0.3:
   integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
 
 uuid@^8.0.0:
-  version "8.1.0"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d"
-  integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==
+  version "8.2.0"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e"
+  integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q==
 
-v8-compile-cache@2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe"
-  integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==
+v8-compile-cache@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745"
+  integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==
 
-v8flags@^3.1.2:
+v8flags@^3.1.2, v8flags@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"
   integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==
@@ -15333,17 +15674,16 @@ waait@^1.0.2, waait@^1.0.5:
   resolved "https://registry.yarnpkg.com/waait/-/waait-1.0.5.tgz#6a3c7aaa88bd0a1a545e9d47890b9595bebf9aa7"
   integrity sha512-wp+unA4CpqxvBUKHHv8D86fK4jWByHAWyhEXXVHfVUZfK+16ylpj7hjQ58Z8j9ntu8XNukRQT8Fi5qbyJ8rkyw==
 
-wait-on@4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-4.0.0.tgz#4d7e4485ca759968897fd3b0cc50720c0b4ca959"
-  integrity sha512-QrW3J8LzS5ADPfD9Rx5S6KJck66xkqyiFKQs9jmUTkIhiEOmkzU7WRZc+MjsnmkrgjitS2xQ4bb13hnlQnKBUQ==
+wait-on@5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.1.0.tgz#b697f21c6fea0908b9c7ad6ed56ace4736768b66"
+  integrity sha512-JM0kgaE+V0nCDvSl72iM05W8NDt2E2M56WC5mzR7M+T+k6xjt2yYpyom+xA8RasSunFGzbxIpAXbVzXqtweAnA==
   dependencies:
-    "@hapi/joi" "^16.1.8"
-    lodash "^4.17.15"
-    minimist "^1.2.0"
-    request "^2.88.0"
-    request-promise-native "^1.0.8"
-    rxjs "^6.5.4"
+    "@hapi/joi" "^17.1.1"
+    axios "^0.19.2"
+    lodash "^4.17.19"
+    minimist "^1.2.5"
+    rxjs "^6.5.5"
 
 walker@~1.0.5:
   version "1.0.7"
@@ -15523,21 +15863,21 @@ webpack-bundle-analyzer@^3.8.0:
     ws "^6.0.0"
 
 webpack-cli@^3.3.9:
-  version "3.3.11"
-  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631"
-  integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==
+  version "3.3.12"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a"
+  integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==
   dependencies:
-    chalk "2.4.2"
-    cross-spawn "6.0.5"
-    enhanced-resolve "4.1.0"
-    findup-sync "3.0.0"
-    global-modules "2.0.0"
-    import-local "2.0.0"
-    interpret "1.2.0"
-    loader-utils "1.2.3"
-    supports-color "6.1.0"
-    v8-compile-cache "2.0.3"
-    yargs "13.2.4"
+    chalk "^2.4.2"
+    cross-spawn "^6.0.5"
+    enhanced-resolve "^4.1.1"
+    findup-sync "^3.0.0"
+    global-modules "^2.0.0"
+    import-local "^2.0.0"
+    interpret "^1.4.0"
+    loader-utils "^1.4.0"
+    supports-color "^6.1.0"
+    v8-compile-cache "^2.1.1"
+    yargs "^13.3.2"
 
 webpack-dev-middleware@^3.6.0, webpack-dev-middleware@^3.7.1, webpack-dev-middleware@^3.7.2:
   version "3.7.2"
@@ -15661,9 +16001,9 @@ websocket-driver@>=0.5.1:
     websocket-extensions ">=0.1.1"
 
 websocket-extensions@>=0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
-  integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
+  integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
 
 whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
   version "1.0.5"
@@ -15673,9 +16013,9 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
     iconv-lite "0.4.24"
 
 whatwg-fetch@>=0.10.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
-  integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz#8e134f701f0a4ab5fda82626f113e2b647fd16dc"
+  integrity sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w==
 
 whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0:
   version "2.3.0"
@@ -15789,10 +16129,10 @@ winston@0.8.x:
     pkginfo "0.3.x"
     stack-trace "0.0.x"
 
-winston@2.x, winston@^2.2.0, winston@^2.4.0:
-  version "2.4.4"
-  resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.4.tgz#a01e4d1d0a103cf4eada6fc1f886b3110d71c34b"
-  integrity sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==
+winston@2.x, winston@^2.4.0:
+  version "2.4.5"
+  resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.5.tgz#f2e431d56154c4ea765545fc1003bd340c95b59a"
+  integrity sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A==
   dependencies:
     async "~1.0.0"
     colors "1.0.x"
@@ -15927,12 +16267,12 @@ xmlbuilder@~11.0.0:
   integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
 
 xpub-edit@^2.6.10:
-  version "2.6.10"
-  resolved "https://registry.yarnpkg.com/xpub-edit/-/xpub-edit-2.6.10.tgz#0f316a4389ea85eb19ca29d9fcf52ef293be9c63"
-  integrity sha512-P3wcaOijXTgfdHdaV3dHMQy2sAwp11w4nzR+a/GVM8GY9POEGPiQbLVjpOChRa9Sd14r0geHKMVB5gqF79cX8Q==
+  version "2.6.11"
+  resolved "https://registry.yarnpkg.com/xpub-edit/-/xpub-edit-2.6.11.tgz#9e00414fac43df1c4e57f5d7791a1da7bb6b9610"
+  integrity sha512-qE0mrlouvH3xOczNRS6Fqu15ez5wEFScfGpROmh7l/gN0kkeRJmJU0YTk1Nn7RfwZewRI0IRQlvV85UGTmjOng==
   dependencies:
-    "@pubsweet/ui" "^12.5.0"
-    "@pubsweet/ui-toolkit" "^2.3.1"
+    "@pubsweet/ui" "^12.6.0"
+    "@pubsweet/ui-toolkit" "^2.3.2"
     classnames "^2.2.6"
     prosemirror-commands "^1.0.1"
     prosemirror-dropcursor "^1.0.0"
@@ -15969,18 +16309,27 @@ xpub-with-context@^0.2.0:
   dependencies:
     recompose "^0.30.0"
 
-xregexp@^4.3.0:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50"
-  integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==
+xss@^1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.7.tgz#a554cbd5e909324bd6893fb47fff441ad54e2a95"
+  integrity sha512-A9v7tblGvxu8TWXQC9rlpW96a+LN1lyw6wyhpTmmGW+FwRMactchBR3ROKSi33UPCUcUHSu8s9YP6F+K3Mw//w==
   dependencies:
-    "@babel/runtime-corejs3" "^7.8.3"
+    commander "^2.20.3"
+    cssfilter "0.0.10"
 
-xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
 
+y-leveldb@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/y-leveldb/-/y-leveldb-0.1.0.tgz#8b60c1af020252445875ebc70d52666017bcb038"
+  integrity sha512-sMuitVrsAUNh+0b66I42nAuW3lCmez171uP4k0ePcTAJ+c+Iw9w4Yq3wwiyrDMFXBEyQSjSF86Inc23wEvWnxw==
+  dependencies:
+    level "^6.0.1"
+    lib0 "^0.2.31"
+
 y-protocols@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.0.tgz#d06035f9c8824b1fdc652c6a06b3c9aaca9261f0"
@@ -15988,6 +16337,17 @@ y-protocols@^1.0.0:
   dependencies:
     lib0 "^0.2.28"
 
+y-websocket@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/y-websocket/-/y-websocket-1.3.1.tgz#19e00ad9a4a491c9d0d14768547f437522e7a98f"
+  integrity sha512-pt4lyFz1jlJObl5IN2r7YWyzsRRdpQXGc2WbBXlsyMamZPID4y+MITeIpEr8n95I0d/Bx28uzgH4qhhb/3QmZg==
+  dependencies:
+    lib0 "^0.2.31"
+    y-leveldb "^0.1.0"
+    y-protocols "^1.0.0"
+  optionalDependencies:
+    ws "^6.2.1"
+
 y18n@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
@@ -16018,7 +16378,7 @@ yaml@^1.7.2:
   resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
   integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
 
-yargs-parser@^13.1.0, yargs-parser@^13.1.2:
+yargs-parser@^13.1.2:
   version "13.1.2"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
   integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
@@ -16033,23 +16393,6 @@ yargs-parser@^8.1.0:
   dependencies:
     camelcase "^4.1.0"
 
-yargs@13.2.4:
-  version "13.2.4"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83"
-  integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==
-  dependencies:
-    cliui "^5.0.0"
-    find-up "^3.0.0"
-    get-caller-file "^2.0.1"
-    os-locale "^3.1.0"
-    require-directory "^2.1.1"
-    require-main-filename "^2.0.0"
-    set-blocking "^2.0.0"
-    string-width "^3.0.0"
-    which-module "^2.0.0"
-    y18n "^4.0.0"
-    yargs-parser "^13.1.0"
-
 yargs@^10.0.3:
   version "10.1.2"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
@@ -16093,11 +16436,24 @@ yauzl@2.10.0, yauzl@^2.10.0:
     fd-slicer "~1.1.0"
 
 yjs@^13.2.0:
-  version "13.2.0"
-  resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.2.0.tgz#179997208bd835b84cbc9ffd1037b076299a5eed"
-  integrity sha512-0augWOespX5KC8de62GCR8WloZhAyBfEF3ZPDpjZlRs6yho7iFKqarpzxxJgmP8zA/pNJiV1EIpMezSxEdNdDw==
+  version "13.3.0"
+  resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.3.0.tgz#e43f3297b01dbafd7c21077cd1f651db93e06494"
+  integrity sha512-QdWZljN7OkAKen3VJ9P7sXwjuw+00WRXvmjZvgT28yMgxGnZ8w2LYP4GynuneLn53I6gud1PxB5zCeVODQC/dg==
+  dependencies:
+    lib0 "^0.2.32"
+
+yup@^0.29.0:
+  version "0.29.1"
+  resolved "https://registry.yarnpkg.com/yup/-/yup-0.29.1.tgz#35d25aab470a0c3950f66040ba0ff4b1b6efe0d9"
+  integrity sha512-U7mPIbgfQWI6M3hZCJdGFrr+U0laG28FxMAKIgNvgl7OtyYuUoc4uy9qCWYHZjh49b8T7Ug8NNDdiMIEytcXrQ==
   dependencies:
-    lib0 "^0.2.27"
+    "@babel/runtime" "^7.9.6"
+    fn-name "~3.0.0"
+    lodash "^4.17.15"
+    lodash-es "^4.17.11"
+    property-expr "^2.0.2"
+    synchronous-promise "^2.0.10"
+    toposort "^2.0.2"
 
 zen-observable-ts@^0.8.21:
   version "0.8.21"
@@ -16107,7 +16463,7 @@ zen-observable-ts@^0.8.21:
     tslib "^1.9.3"
     zen-observable "^0.8.0"
 
-zen-observable@^0.8.0:
+zen-observable@^0.8.0, zen-observable@^0.8.14:
   version "0.8.15"
   resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
   integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==