diff --git a/.circleci/config.yml b/.circleci/config.yml
index 295a7075f15def1108ff4fe517fd5a808bc25de8..fdaade0f3627303f421be140d0749498ef64b054 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -104,7 +104,7 @@ services_steps: &services_steps
         environment:
           mocha_reporter: mocha-junit-reporter
           MOCHA_FILE: junit/services/results.xml
-        command: npm run test:services:pr:run
+        command: RETRY_COUNT=3 npm run test:services:pr:run
 
     - store_test_results:
         path: junit
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 1cbb85fdf260b270ddd2daa69afe9348438b427e..63cdb25b0b33a28d5dfff4851224b23ca3a73534 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -5,6 +5,7 @@ extends:
   - prettier/@typescript-eslint
   - prettier/standard
   - prettier/react
+  - eslint:recommended
 
 parserOptions:
   # Override eslint-config-standard, which incorrectly sets this to "module",
@@ -35,6 +36,7 @@ overrides:
       - '!frontend/**/*.js'
     env:
       node: true
+      es6: true
     rules:
       no-console: 'off'
       '@typescript-eslint/no-var-requires': off
@@ -95,6 +97,8 @@ overrides:
   - files:
       - '**/*.spec.@(js|ts|tsx)'
       - '**/*.integration.js'
+      - '**/test-helpers.js'
+      - 'core/service-test-runner/**/*.js'
     env:
       mocha: true
     rules:
@@ -114,7 +118,7 @@ rules:
   '@typescript-eslint/no-var-requires': error
 
   # These should be disabled by eslint-config-prettier, but are not.
-  spaced-comment: 'off'
+  no-extra-semi: 'off'
 
   # Shields additions.
   no-var: 'error'
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e1014e48c951ae31899305189fe19c09407dc131..ea4759213a66ad288a738e5b013cb91897d1b731 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -105,12 +105,11 @@ There are three places to get help:
 ## Badge URLs
 
 - The format of new badges should be of the form
-  `/SERVICE/NOUN/PARAMETERS/QUALIFIERS.format`. For instance,
-  `/gitter/room/nwjs/nw.js.svg`. The vendor is gitter, the
-  badge is for rooms, the parameter is nwjs/nw.js, and the format is svg.
-- For services which require a hostname, the badge should be of the form
-  `/SERVICE/SCHEME/HOST/NOUN/PARAMETERS/QUALIFIERS.format`. For instance,
-  `/discourse/https/discourse.example.com/topics.svg`.
+  `/SERVICE/NOUN/PARAMETERS/QUALIFIERS`. For instance,
+  `/gitter/room/nwjs/nw.js`. The vendor is gitter, the
+  badge is for rooms, and the parameter is nwjs/nw.js.
+- Services which require a url/hostname parameter should use a query parameter to accept that value. For instance,
+  `/discourse/topics?server=https://meta.discourse.org`.
 
 ## Coding guidelines
 
diff --git a/core/base-service/base.js b/core/base-service/base.js
index 742272612830f5c894e589b6c93f5833a4f860ee..352314d8363f0188ab5edd73248b5473ece2f7a6 100644
--- a/core/base-service/base.js
+++ b/core/base-service/base.js
@@ -267,6 +267,12 @@ class BaseService {
     throw new Error(`Handler not implemented for ${this.constructor.name}`)
   }
 
+  // Making this an instance method ensures debuggability.
+  // https://github.com/badges/shields/issues/3784
+  _validateServiceData(serviceData) {
+    Joi.assert(serviceData, serviceDataSchema)
+  }
+
   _handleError(error) {
     if (error instanceof NotFound || error instanceof InvalidParameter) {
       trace.logTrace('outbound', emojic.noGoodWoman, 'Handled error', error)
@@ -379,7 +385,7 @@ class BaseService {
           namedParams,
           transformedQueryParams
         )
-        Joi.assert(serviceData, serviceDataSchema)
+        serviceInstance._validateServiceData(serviceData)
       } catch (error) {
         serviceError = error
       }
diff --git a/core/base-service/base.spec.js b/core/base-service/base.spec.js
index 8964cd0b274b9f2110ff643991dfbaafcff6af18..9acdd90a48587abd0e1c6b38680dee958f8d7c05 100644
--- a/core/base-service/base.spec.js
+++ b/core/base-service/base.spec.js
@@ -192,7 +192,7 @@ describe('BaseService', function() {
       })
     })
 
-    it('Throws a validation error on invalid data', async function() {
+    context('On invalid data', function() {
       class ThrowingService extends DummyService {
         async handle() {
           return {
@@ -200,19 +200,37 @@ describe('BaseService', function() {
           }
         }
       }
-      try {
-        await ThrowingService.invoke(
-          {},
-          { handleInternalErrors: false },
-          { namedParamA: 'bar.bar.bar' }
-        )
-        expect.fail('Expected to throw')
-      } catch (e) {
-        expect(e.name).to.equal('ValidationError')
-        expect(e.details.map(({ message }) => message)).to.deep.equal([
-          '"message" is required',
-        ])
-      }
+
+      it('Throws a validation error on invalid data', async function() {
+        try {
+          await ThrowingService.invoke(
+            {},
+            { handleInternalErrors: false },
+            { namedParamA: 'bar.bar.bar' }
+          )
+          expect.fail('Expected to throw')
+        } catch (e) {
+          expect(e.name).to.equal('ValidationError')
+          expect(e.details.map(({ message }) => message)).to.deep.equal([
+            '"message" is required',
+          ])
+        }
+      })
+
+      // Ensure debuggabillity.
+      // https://github.com/badges/shields/issues/3784
+      it('Includes the service class in the stack trace', async function() {
+        try {
+          await ThrowingService.invoke(
+            {},
+            { handleInternalErrors: false },
+            { namedParamA: 'bar.bar.bar' }
+          )
+          expect.fail('Expected to throw')
+        } catch (e) {
+          expect(e.stack).to.include('ThrowingService._validateServiceData')
+        }
+      })
     })
   })
 
@@ -316,7 +334,9 @@ describe('BaseService', function() {
   })
 
   describe('ScoutCamp integration', function() {
-    const expectedRouteRegex = /^\/foo\/([^/]+?)(|\.svg|\.json)$/
+    // TODO Strangly, without the useless escape the regexes do not match in Node 12.
+    // eslint-disable-next-line no-useless-escape
+    const expectedRouteRegex = /^\/foo\/([^\/]+?)(|\.svg|\.json)$/
 
     let mockCamp
     let mockHandleRequest
diff --git a/core/base-service/examples.js b/core/base-service/examples.js
index cc7d313b3acc26b8f6a8f03a5b5c5a3be44b1937..5f4248ad09056720b9c1fc600e7a92f1017df0ed 100644
--- a/core/base-service/examples.js
+++ b/core/base-service/examples.js
@@ -2,6 +2,7 @@
 
 const Joi = require('@hapi/joi')
 const pathToRegexp = require('path-to-regexp')
+const categories = require('../../services/categories')
 const coalesceBadge = require('./coalesce-badge')
 const { makeFullUrl } = require('./route')
 
@@ -154,7 +155,9 @@ function transformExample(inExample, index, ServiceClass) {
       style: style === 'flat' ? undefined : style,
       namedLogo,
     },
-    keywords,
+    keywords: keywords.concat(
+      categories.find(c => c.id === ServiceClass.category).keywords
+    ),
     documentation: documentation ? { __html: documentation } : undefined,
   }
 }
diff --git a/core/base-service/examples.spec.js b/core/base-service/examples.spec.js
index 3e4d254698c5e297b6aed0466fd0282cebdee5c7..387fec0456d160005da9d63db3e2d3a69e524a28 100644
--- a/core/base-service/examples.spec.js
+++ b/core/base-service/examples.spec.js
@@ -84,6 +84,7 @@ test(transformExample, function() {
     defaultBadgeData: {
       label: 'downloads',
     },
+    category: 'platform-support',
   }
 
   given(
@@ -109,7 +110,7 @@ test(transformExample, function() {
       namedLogo: undefined,
       style: undefined,
     },
-    keywords: ['hello'],
+    keywords: ['hello', 'platform'],
     documentation: undefined,
   })
 
@@ -135,7 +136,7 @@ test(transformExample, function() {
       namedLogo: undefined,
       style: undefined,
     },
-    keywords: ['hello'],
+    keywords: ['hello', 'platform'],
     documentation: undefined,
   })
 
@@ -162,7 +163,7 @@ test(transformExample, function() {
       namedLogo: undefined,
       style: undefined,
     },
-    keywords: ['hello'],
+    keywords: ['hello', 'platform'],
     documentation: undefined,
   })
 })
diff --git a/core/base-service/service-definitions.js b/core/base-service/service-definitions.js
index 2128e5a0e7c3f4a5e22ccddc00a33840cb0f5b98..c89f151bc28e24eb89a162123a2fa99ce2ffe1a6 100644
--- a/core/base-service/service-definitions.js
+++ b/core/base-service/service-definitions.js
@@ -66,6 +66,7 @@ const serviceDefinitionExport = Joi.object({
       Joi.object({
         id: Joi.string().required(),
         name: Joi.string().required(),
+        keywords: arrayOfStrings,
       })
     )
     .required(),
diff --git a/core/service-test-runner/cli.js b/core/service-test-runner/cli.js
index da4629a0d3673b0ebd8f8c3342720fb212860eed..1b7979e15fa9080b1ae6416c0658c582353c54e0 100644
--- a/core/service-test-runner/cli.js
+++ b/core/service-test-runner/cli.js
@@ -15,6 +15,11 @@
 // Run tests on a given instance:
 //   SKIP_INTERCEPTED=TRUE TESTED_SERVER_URL=https://test.shields.io npm run test:services --
 //
+// Run tests with given number of retries and backoff (in milliseconds):
+//   RETRY_COUNT=3 RETRY_BACKOFF=100 npm run test:services --
+// Retry option documentation:
+// https://github.com/IcedFrisby/IcedFrisby/blob/master/API.md#retrycount-backoff
+//
 // Service tests are run in CI in two cases: scheduled builds and pull
 // requests. The scheduled builds run _all_ the service tests, whereas the
 // pull requests run service tests designated in the PR title. In this way,
@@ -59,6 +64,9 @@ const Runner = require('./runner')
 
 require('../unhandled-rejection.spec')
 
+const retry = {}
+retry.count = parseInt(process.env.RETRY_COUNT) || 0
+retry.backoff = parseInt(process.env.RETRY_BACKOFF) || 0
 let baseUrl, server
 if (process.env.TESTED_SERVER_URL) {
   baseUrl = process.env.TESTED_SERVER_URL
@@ -77,7 +85,7 @@ if (process.env.TESTED_SERVER_URL) {
 }
 
 const skipIntercepted = envFlag(process.env.SKIP_INTERCEPTED, false)
-const runner = new Runner({ baseUrl, skipIntercepted })
+const runner = new Runner({ baseUrl, skipIntercepted, retry })
 runner.prepare()
 
 // The server's request cache causes side effects between tests.
diff --git a/core/service-test-runner/runner.js b/core/service-test-runner/runner.js
index a026b0064b09d4ef0fe4897d294e8965f8cf4af7..44e4718267414c5dfd576aff6c83af421f7326ae 100644
--- a/core/service-test-runner/runner.js
+++ b/core/service-test-runner/runner.js
@@ -9,9 +9,10 @@ const { loadTesters } = require('../base-service/loader')
  * Load a collection of ServiceTester objects and register them with Mocha.
  */
 class Runner {
-  constructor({ baseUrl, skipIntercepted }) {
+  constructor({ baseUrl, skipIntercepted, retry }) {
     this.baseUrl = baseUrl
     this.skipIntercepted = skipIntercepted
+    this.retry = retry
   }
 
   /**
@@ -67,8 +68,8 @@ class Runner {
    * Register the tests with Mocha.
    */
   toss() {
-    const { testers, baseUrl, skipIntercepted } = this
-    testers.forEach(tester => tester.toss({ baseUrl, skipIntercepted }))
+    const { testers, baseUrl, skipIntercepted, retry } = this
+    testers.forEach(tester => tester.toss({ baseUrl, skipIntercepted, retry }))
   }
 }
 module.exports = Runner
diff --git a/core/service-test-runner/service-tester.js b/core/service-test-runner/service-tester.js
index 60dd531427f143570f38f15b4d57ef8a337cddf1..8bc23ba517e9ad736870b29b97d8e61ec62c76aa 100644
--- a/core/service-test-runner/service-tester.js
+++ b/core/service-test-runner/service-tester.js
@@ -115,8 +115,11 @@ class ServiceTester {
    * @param {object} attrs Refer to individual attrs
    * @param {string} attrs.baseUrl base URL for test server
    * @param {boolean} attrs.skipIntercepted skip tests which intercept requests
+   * @param {object} attrs.retry retry configuration
+   * @param {number} attrs.retry.count number of times to retry test
+   * @param {number} attrs.retry.backoff number of milliseconds to add to the wait between each retry
    */
-  toss({ baseUrl, skipIntercepted }) {
+  toss({ baseUrl, skipIntercepted, retry }) {
     const { specs, pathPrefix } = this
     const testerBaseUrl = `${baseUrl}${pathPrefix}`
 
@@ -129,6 +132,7 @@ class ServiceTester {
         }`
         if (!skipIntercepted || !spec.intercepted) {
           spec.baseUri(testerBaseUrl)
+          spec.retry(retry.count, retry.backoff)
           spec.toss()
         }
       })
diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md
index bebe931170f932238db31c6c43eecc19c7e5ca01..0fc31cc044c2f06e77a286dca06f2aa356daa972 100644
--- a/doc/TUTORIAL.md
+++ b/doc/TUTORIAL.md
@@ -210,10 +210,9 @@ module.exports = class GemVersion extends BaseJsonService {
     return { label: 'gem' }
   }
 
-  // (9)
-  async handle({ gem }) {
-    const { version } = await this.fetch({ gem })
-    return this.constructor.render({ version })
+  // (11)
+  static render({ version }) {
+    return renderVersionBadge({ version })
   }
 
   // (10)
@@ -224,9 +223,10 @@ module.exports = class GemVersion extends BaseJsonService {
     })
   }
 
-  // (11)
-  static render({ version }) {
-    return renderVersionBadge({ version })
+  // (9)
+  async handle({ gem }) {
+    const { version } = await this.fetch({ gem })
+    return this.constructor.render({ version })
   }
 }
 ```
@@ -241,31 +241,31 @@ Description of the code:
    - [text-formatters.js](https://github.com/badges/shields/blob/master/services/text-formatters.js)
    - [version.js](https://github.com/badges/shields/blob/master/services/version.js)
 3. Our badge will query a JSON API so we will extend `BaseJsonService` instead of `BaseService`. This contains some helpers to reduce the need for boilerplate when calling a JSON API.
-4. We perform input validation by defining a schema which we expect the JSON we receive to conform to. This is done using [Joi](https://github.com/hapijs/joi). Defining a schema means we can ensure the JSON we receive meets our expectations and throw an error if we receive unexpected input without having to explicitly code validation checks. The schema also acts as a filter on the JSON object. Any properties we're going to reference need to be validated, otherwise they will be filtered out. In this case our schema declares that we expect to receive an object which must have a property called 'status', which is a string.
+4. We perform input validation by defining a schema which we expect the JSON we receive to conform to. This is done using [Joi](https://github.com/hapijs/joi). Defining a schema means we can ensure the JSON we receive meets our expectations and throw an error if we receive unexpected input without having to explicitly code validation checks. The schema also acts as a filter on the JSON object. Any properties we're going to reference need to be validated, otherwise they will be filtered out. In this case our schema declares that we expect to receive an object which must have a property called 'version', which is a string.
 5. Our module exports a class which extends `BaseJsonService`
 6. Returns the name of the category to sort this badge into (eg. "build"). Used to sort the examples on the main [shields.io](https://shields.io) website. [Here](https://github.com/badges/shields/blob/master/services/categories.js) is the list of the valid categories. See [section 4.4](#44-adding-an-example-to-the-front-page) for more details on examples.
 7. As with our previous badge, we need to declare a route. This time we will capture a variable called `gem`.
 8. We can use `defaultBadgeData()` to set a default `color`, `logo` and/or `label`. If `handle()` doesn't return any of these keys, we'll use the default. Instead of explicitly setting the label text when we return a badge object, we'll use `defaultBadgeData()` here to define it declaratively.
-9. Our badge must implement the `async handle()` function. Because our URL pattern captures a variable called `gem`, our function signature is `async handle({ gem })`. We usually separate the process of generating a badge into 2 stages or concerns: fetch and render. The `fetch()` function is responsible for calling an API endpoint to get data. The `render()` function formats the data for display. In a case where there is a lot of calculation or intermediate steps, this pattern may be thought of as fetch, transform, render and it might be necessary to define some helper functions to assist with the 'transform' step.
-10. The `async fetch()` method is responsible for calling an API endpoint to get data. Extending `BaseJsonService` gives us the helper function `_requestJson()`. Note here that we pass the schema we defined in step 4 as an argument. `_requestJson()` will deal with validating the response against the schema and throwing an error if necessary.
-
-- `_requestJson()` automatically adds an Accept header, checks the status code, parses the response as JSON, and returns the parsed response.
-- `_requestJson()` uses [request](https://github.com/request/request) to perform the HTTP request. Options can be passed to request, including method, query string, and headers. If headers are provided they will override the ones automatically set by `_requestJson()`. There is no need to specify json, as the JSON parsing is handled by `_requestJson()`. See the `request` docs for [supported options](https://github.com/request/request#requestoptions-callback).
-- Error messages corresponding to each status code can be returned by passing a dictionary of status codes -> messages in `errorMessages`.
-- A more complex call to `_requestJson()` might look like this:
-  ```js
-  return this._requestJson({
-    schema: mySchema,
-    url,
-    options: { qs: { branch: 'master' } },
-    errorMessages: {
-      401: 'private application not supported',
-      404: 'application not found',
-    },
-  })
-  ```
-
-11. The `static render()` method is responsible for formatting the data for display. `render()` is a pure function so we can make it a `static` method. By convention we declare functions which don't reference `this` as `static`. We could explicitly return an object here, as we did in the previous example. In this case, we will hand the version string off to `renderVersionBadge()` which will format it consistently and set an appropriate color. Because `renderVersionBadge()` doesn't return a `label` key, the default label we defined in `defaultBadgeData()` will be used when we generate the badge.
+9. We now jump to the bottom of the example code to the function all badges must implement: `async handle()`. This is the function the server will invoke to handle an incoming request. Because our URL pattern captures a variable called `gem`, our function signature is `async handle({ gem })`. We usually separate the process of generating a badge into 2 stages or concerns: fetch and render. The `fetch()` function is responsible for calling an API endpoint to get data. The `render()` function formats the data for display. In a case where there is a lot of calculation or intermediate steps, this pattern may be thought of as fetch, transform, render and it might be necessary to define some helper functions to assist with the 'transform' step.
+10. Working our way upward, the `async fetch()` method is responsible for calling an API endpoint to get data. Extending `BaseJsonService` gives us the helper function `_requestJson()`. Note here that we pass the schema we defined in step 4 as an argument. `_requestJson()` will deal with validating the response against the schema and throwing an error if necessary.
+
+    - `_requestJson()` automatically adds an Accept header, checks the status code, parses the response as JSON, and returns the parsed response.
+    - `_requestJson()` uses [request](https://github.com/request/request) to perform the HTTP request. Options can be passed to request, including method, query string, and headers. If headers are provided they will override the ones automatically set by `_requestJson()`. There is no need to specify json, as the JSON parsing is handled by `_requestJson()`. See the `request` docs for [supported options](https://github.com/request/request#requestoptions-callback).
+    - Error messages corresponding to each status code can be returned by passing a dictionary of status codes -> messages in `errorMessages`.
+    - A more complex call to `_requestJson()` might look like this:
+      ```js
+      return this._requestJson({
+        schema: mySchema,
+        url,
+        options: { qs: { branch: 'master' } },
+        errorMessages: {
+          401: 'private application not supported',
+          404: 'application not found',
+        },
+      })
+      ```
+
+11. Upward still, the `static render()` method is responsible for formatting the data for display. `render()` is a pure function so we can make it a `static` method. By convention we declare functions which don't reference `this` as `static`. We could explicitly return an object here, as we did in the previous example. In this case, we will hand the version string off to `renderVersionBadge()` which will format it consistently and set an appropriate color. Because `renderVersionBadge()` doesn't return a `label` key, the default label we defined in `defaultBadgeData()` will be used when we generate the badge.
 
 This code allows us to call this URL <https://img.shields.io/gem/v/formatador> to generate this badge: ![](https://img.shields.io/gem/v/formatador)
 
@@ -324,7 +324,7 @@ module.exports = class GemVersion extends BaseJsonService {
    - `namedParams`: Provide a valid example of params we can substitute into
      the pattern. In this case we need a valid ruby gem, so we've picked [formatador](https://rubygems.org/gems/formatador).
    - `staticPreview`: On the index page we want to show an example badge, but for performance reasons we want that example to be generated without making an API call. `staticPreview` should be populated by calling our `render()` method with some valid data.
-   - `keywords`: If we want to provide additional keywords other than the title, we can add them here. This helps users to search for relevant badges.
+   - `keywords`: If we want to provide additional keywords other than the title and the category, we can add them here. This helps users to search for relevant badges.
 
 Save, run `npm start`, and you can see it [locally](http://127.0.0.1:3000/).
 
@@ -339,7 +339,7 @@ should be included. They serve several purposes:
 
 1. They speed up future contributors when they are debugging or improving a
    badge.
-2. If a contributors like to change your badge, chances are, they forget
+2. If the contributors would like to change your badge, chances are, they forget
    edge cases and break your code.
    Tests may give hints in such cases.
 3. The contributor and reviewer can easily verify the code works as
@@ -352,7 +352,7 @@ Please follow it to include tests on your pull-request.
 
 ### (4.6) Update the Docs
 
-If your submission require an API token or authentication credentials, please
+If your submission requires an API token or authentication credentials, please
 update [server-secrets.md](./server-secrets.md). You should explain what the
 token or credentials are for and how to obtain them.
 
diff --git a/doc/self-hosting.md b/doc/self-hosting.md
index ae2ab7d48595efdabaf24fa01fb68a080cc29bd1..23b64f43c8b24fe73b1dd07ea2a8b98b4589a6e5 100644
--- a/doc/self-hosting.md
+++ b/doc/self-hosting.md
@@ -69,7 +69,7 @@ Successfully built 4471b442c220
 ```
 
 Optionally, create a file called `shields.env` that contains the needed
-configuration. See [server-secrets.md](server-secrets.md) and [../config/custom-environment-variables.yml](config/custom-environment-variables.yml) for examples.
+configuration. See [server-secrets.md](server-secrets.md) and [config/custom-environment-variables.yml](/config/custom-environment-variables.yml) for examples.
 
 Then run the container:
 
diff --git a/frontend/components/markup-modal/markup-modal-content.tsx b/frontend/components/markup-modal/markup-modal-content.tsx
index deebd06ac7fa0c6cd26a5cbcd46a71d0ed03a089..65e83a4399b611859df695e502dfecdb8ecf28e9 100644
--- a/frontend/components/markup-modal/markup-modal-content.tsx
+++ b/frontend/components/markup-modal/markup-modal-content.tsx
@@ -11,6 +11,7 @@ import Customizer from '../customizer/customizer'
 const Documentation = styled.div`
   max-width: 800px;
   margin: 35px auto 20px;
+  text-align: left;
 `
 
 export function MarkupModalContent({
diff --git a/frontend/components/usage.tsx b/frontend/components/usage.tsx
index d2390459379c9fead691fea591b2275ea6185264..cde5bb723346086c796285c545ed800a321e1f43 100644
--- a/frontend/components/usage.tsx
+++ b/frontend/components/usage.tsx
@@ -327,7 +327,7 @@ export default function Usage({ baseUrl }: { baseUrl: string }) {
           <QueryParam
             documentation={
               <span>
-                Insert one of the named logos from ({<NamedLogos />}) or{' '}
+                Insert one of the named logos from (<NamedLogos />) or{' '}
                 <a
                   href="https://simpleicons.org/"
                   rel="noopener noreferrer"
@@ -414,16 +414,16 @@ export default function Usage({ baseUrl }: { baseUrl: string }) {
       </QueryParamTable>
 
       <p>
-        We support <code>.svg</code> and <code>.json</code>. The default is
+        We support <code>.svg</code> and <code>.json</code>. The default is{' '}
         <code>.svg</code>, which can be omitted from the URL.
       </p>
 
       <p>
-        While we highly recommend using SVG, we also support <code>.png</code>
+        While we highly recommend using SVG, we also support <code>.png</code>{' '}
         for use cases where SVG will not work. These requests should be made to
         our raster server <code>https://raster.shields.io</code>. For example,
-        the raster equivalent of
-        <code>https://img.shields.io/v/npm/express</code> is
+        the raster equivalent of{' '}
+        <code>https://img.shields.io/v/npm/express</code> is{' '}
         <code>https://raster.shields.io/v/npm/express</code>. For backward
         compatibility, the badge server will redirect <code>.png</code> badges
         to the raster server.
diff --git a/frontend/lib/redirect-legacy-routes.ts b/frontend/lib/redirect-legacy-routes.ts
index 44eea5f11dfdb97dde88a4f561c6abd9fcb95c38..aebf7269c9d013d32c38c32a506d705717fa30e6 100644
--- a/frontend/lib/redirect-legacy-routes.ts
+++ b/frontend/lib/redirect-legacy-routes.ts
@@ -4,8 +4,12 @@ export default function redirectLegacyRoutes() {
   const { hash } = window.location
   if (hash && hash.startsWith('#/examples/')) {
     const category = hash.replace('#/examples/', '')
-    navigate(`category/${category}`)
+    navigate(`category/${category}`, {
+      replace: true,
+    })
   } else if (hash === '#/endpoint') {
-    navigate('endpoint')
+    navigate('endpoint', {
+      replace: true,
+    })
   }
 }
diff --git a/frontend/lib/service-definitions/index.spec.ts b/frontend/lib/service-definitions/index.spec.ts
index 035037a4d1851cd93c5126651c5e080f32147969..b83c603b9b667970a8e675a3ebcdae626d8318c9 100644
--- a/frontend/lib/service-definitions/index.spec.ts
+++ b/frontend/lib/service-definitions/index.spec.ts
@@ -4,7 +4,7 @@ import { findCategory, getDefinitionsForCategory } from '.'
 
 describe('Service definition helpers', function() {
   test(findCategory, () => {
-    given('build').expect({ id: 'build', name: 'Build' })
+    given('build').expect({ id: 'build', name: 'Build', keywords: ['build'] })
     given('foo').expect(undefined)
   })
 
diff --git a/frontend/lib/service-definitions/index.ts b/frontend/lib/service-definitions/index.ts
index 23d5b0314eed0412ff28696d3dbbc74fe60a880c..a962c74910e8004f9e86ee062a368ddfa78ddf51 100644
--- a/frontend/lib/service-definitions/index.ts
+++ b/frontend/lib/service-definitions/index.ts
@@ -5,6 +5,7 @@ import definitions from '../../../service-definitions.yml'
 export interface Category {
   id: string
   name: string
+  keywords: string[]
 }
 
 export interface ExampleSignature {
diff --git a/package-lock.json b/package-lock.json
index d105444e3ffc8735defc0622660b24f064ea3962..41e1592ba8a82eed1288366bd4d0a353c2888551 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,19 +14,19 @@
       }
     },
     "@babel/core": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.2.tgz",
-      "integrity": "sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ==",
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.2.tgz",
+      "integrity": "sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.5.5",
-        "@babel/generator": "^7.6.2",
-        "@babel/helpers": "^7.6.2",
-        "@babel/parser": "^7.6.2",
-        "@babel/template": "^7.6.0",
-        "@babel/traverse": "^7.6.2",
-        "@babel/types": "^7.6.0",
-        "convert-source-map": "^1.1.0",
+        "@babel/generator": "^7.7.2",
+        "@babel/helpers": "^7.7.0",
+        "@babel/parser": "^7.7.2",
+        "@babel/template": "^7.7.0",
+        "@babel/traverse": "^7.7.2",
+        "@babel/types": "^7.7.2",
+        "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "json5": "^2.1.0",
         "lodash": "^4.17.13",
@@ -45,64 +45,84 @@
           }
         },
         "@babel/generator": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz",
-          "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz",
+          "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.6.0",
+            "@babel/types": "^7.7.2",
             "jsesc": "^2.5.1",
             "lodash": "^4.17.13",
             "source-map": "^0.5.0"
           }
         },
+        "@babel/helper-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+          "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+          "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
         "@babel/helper-split-export-declaration": {
-          "version": "7.4.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-          "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.4.4"
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/parser": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz",
-          "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
           "dev": true
         },
         "@babel/template": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz",
-          "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==",
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
-            "@babel/parser": "^7.6.0",
-            "@babel/types": "^7.6.0"
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/traverse": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz",
-          "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz",
+          "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.5.5",
-            "@babel/generator": "^7.6.2",
-            "@babel/helper-function-name": "^7.1.0",
-            "@babel/helper-split-export-declaration": "^7.4.4",
-            "@babel/parser": "^7.6.2",
-            "@babel/types": "^7.6.0",
+            "@babel/generator": "^7.7.2",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/parser": "^7.7.2",
+            "@babel/types": "^7.7.2",
             "debug": "^4.1.0",
             "globals": "^11.1.0",
             "lodash": "^4.17.13"
           }
         },
         "@babel/types": {
-          "version": "7.6.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-          "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2",
@@ -110,6 +130,15 @@
             "to-fast-properties": "^2.0.0"
           }
         },
+        "convert-source-map": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+          "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "~5.1.1"
+          }
+        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -120,9 +149,9 @@
           }
         },
         "json5": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
-          "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
+          "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
           "dev": true,
           "requires": {
             "minimist": "^1.2.0"
@@ -173,13 +202,26 @@
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
-      "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz",
+      "integrity": "sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==",
       "dev": true,
       "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/helper-explode-assignable-expression": "^7.7.0",
+        "@babel/types": "^7.7.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
       }
     },
     "@babel/helper-builder-react-jsx": {
@@ -277,50 +319,173 @@
       }
     },
     "@babel/helper-create-class-features-plugin": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz",
-      "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz",
+      "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-member-expression-to-functions": "^7.5.5",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/helper-function-name": "^7.7.0",
+        "@babel/helper-member-expression-to-functions": "^7.7.0",
+        "@babel/helper-optimise-call-expression": "^7.7.0",
         "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.5.5",
-        "@babel/helper-split-export-declaration": "^7.4.4"
+        "@babel/helper-replace-supers": "^7.7.0",
+        "@babel/helper-split-export-declaration": "^7.7.0"
       },
       "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz",
+          "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+          "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+          "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
         "@babel/helper-member-expression-to-functions": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
-          "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz",
+          "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.5.5"
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-optimise-call-expression": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz",
+          "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-replace-supers": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz",
+          "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-member-expression-to-functions": "^7.7.0",
+            "@babel/helper-optimise-call-expression": "^7.7.0",
+            "@babel/traverse": "^7.7.0",
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/helper-split-export-declaration": {
-          "version": "7.4.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-          "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.4.4"
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz",
+          "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.2",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/parser": "^7.7.2",
+            "@babel/types": "^7.7.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          },
+          "dependencies": {
+            "@babel/code-frame": {
+              "version": "7.5.5",
+              "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+              "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+              "dev": true,
+              "requires": {
+                "@babel/highlight": "^7.0.0"
+              }
+            }
           }
         },
         "@babel/types": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz",
-          "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2",
             "lodash": "^4.17.13",
             "to-fast-properties": "^2.0.0"
           }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
         }
       }
     },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz",
+      "integrity": "sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-regex": "^7.4.4",
+        "regexpu-core": "^4.6.0"
+      }
+    },
     "@babel/helper-define-map": {
       "version": "7.5.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz",
@@ -346,13 +511,125 @@
       }
     },
     "@babel/helper-explode-assignable-expression": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
-      "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz",
+      "integrity": "sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==",
       "dev": true,
       "requires": {
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.5.5",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+          "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz",
+          "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+          "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+          "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz",
+          "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.2",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/parser": "^7.7.2",
+            "@babel/types": "^7.7.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
       }
     },
     "@babel/helper-function-name": {
@@ -407,9 +684,9 @@
       },
       "dependencies": {
         "@babel/types": {
-          "version": "7.6.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-          "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
+          "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2",
@@ -506,83 +783,206 @@
       }
     },
     "@babel/helper-remap-async-to-generator": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
-      "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-wrap-function": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-replace-supers": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
-      "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz",
+      "integrity": "sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==",
       "dev": true,
       "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.5.5",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/traverse": "^7.5.5",
-        "@babel/types": "^7.5.5"
+        "@babel/helper-annotate-as-pure": "^7.7.0",
+        "@babel/helper-wrap-function": "^7.7.0",
+        "@babel/template": "^7.7.0",
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
-          "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+        "@babel/generator": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz",
+          "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.0.0"
+            "@babel/types": "^7.7.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
           }
         },
-        "@babel/generator": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz",
-          "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==",
+        "@babel/helper-annotate-as-pure": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz",
+          "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.5.5",
-            "jsesc": "^2.5.1",
-            "lodash": "^4.17.13",
-            "source-map": "^0.5.0",
-            "trim-right": "^1.0.1"
+            "@babel/types": "^7.7.0"
           }
         },
-        "@babel/helper-member-expression-to-functions": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
-          "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
+        "@babel/helper-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+          "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.5.5"
+            "@babel/helper-get-function-arity": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+          "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/helper-split-export-declaration": {
-          "version": "7.4.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-          "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.4.4"
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/parser": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
-          "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
           "dev": true
         },
-        "@babel/traverse": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz",
-          "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==",
+        "@babel/template": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.5.5",
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz",
+          "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.2",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/parser": "^7.7.2",
+            "@babel/types": "^7.7.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          },
+          "dependencies": {
+            "@babel/code-frame": {
+              "version": "7.5.5",
+              "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+              "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+              "dev": true,
+              "requires": {
+                "@babel/highlight": "^7.0.0"
+              }
+            }
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
+      "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.5.5",
+        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/traverse": "^7.5.5",
+        "@babel/types": "^7.5.5"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.5.5",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+          "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.5.5",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz",
+          "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.5.5",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-member-expression-to-functions": {
+          "version": "7.5.5",
+          "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
+          "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.5.5"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.4.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
+          "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.4.4"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.5.5",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
+          "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==",
+          "dev": true
+        },
+        "@babel/traverse": {
+          "version": "7.5.5",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz",
+          "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
             "@babel/generator": "^7.5.5",
             "@babel/helper-function-name": "^7.1.0",
             "@babel/helper-split-export-declaration": "^7.4.4",
@@ -641,91 +1041,212 @@
       }
     },
     "@babel/helper-wrap-function": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
-      "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz",
+      "integrity": "sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.2.0"
+        "@babel/helper-function-name": "^7.7.0",
+        "@babel/template": "^7.7.0",
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0"
       },
       "dependencies": {
+        "@babel/generator": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz",
+          "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+          "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+          "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz",
+          "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.2",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/parser": "^7.7.2",
+            "@babel/types": "^7.7.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          },
+          "dependencies": {
+            "@babel/code-frame": {
+              "version": "7.5.5",
+              "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+              "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+              "dev": true,
+              "requires": {
+                "@babel/highlight": "^7.0.0"
+              }
+            }
+          }
+        },
         "@babel/types": {
-          "version": "7.6.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-          "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2",
             "lodash": "^4.17.13",
             "to-fast-properties": "^2.0.0"
           }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
         }
       }
     },
     "@babel/helpers": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz",
-      "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz",
+      "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.6.0",
-        "@babel/traverse": "^7.6.2",
-        "@babel/types": "^7.6.0"
+        "@babel/template": "^7.7.0",
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0"
       },
       "dependencies": {
         "@babel/generator": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz",
-          "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz",
+          "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.6.0",
+            "@babel/types": "^7.7.2",
             "jsesc": "^2.5.1",
             "lodash": "^4.17.13",
             "source-map": "^0.5.0"
           }
         },
+        "@babel/helper-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+          "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+          "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
         "@babel/helper-split-export-declaration": {
-          "version": "7.4.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-          "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.4.4"
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/parser": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz",
-          "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
           "dev": true
         },
         "@babel/template": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz",
-          "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==",
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
-            "@babel/parser": "^7.6.0",
-            "@babel/types": "^7.6.0"
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/traverse": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz",
-          "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz",
+          "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.5.5",
-            "@babel/generator": "^7.6.2",
-            "@babel/helper-function-name": "^7.1.0",
-            "@babel/helper-split-export-declaration": "^7.4.4",
-            "@babel/parser": "^7.6.2",
-            "@babel/types": "^7.6.0",
+            "@babel/generator": "^7.7.2",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/parser": "^7.7.2",
+            "@babel/types": "^7.7.2",
             "debug": "^4.1.0",
             "globals": "^11.1.0",
             "lodash": "^4.17.13"
@@ -743,9 +1264,9 @@
           }
         },
         "@babel/types": {
-          "version": "7.6.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-          "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2",
@@ -796,30 +1317,30 @@
       "dev": true
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
-      "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz",
+      "integrity": "sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0",
+        "@babel/helper-remap-async-to-generator": "^7.7.0",
         "@babel/plugin-syntax-async-generators": "^7.2.0"
       }
     },
     "@babel/plugin-proposal-class-properties": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz",
-      "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz",
+      "integrity": "sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.5.5",
+        "@babel/helper-create-class-features-plugin": "^7.7.0",
         "@babel/helper-plugin-utils": "^7.0.0"
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz",
-      "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz",
+      "integrity": "sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -857,14 +1378,13 @@
       }
     },
     "@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz",
-      "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz",
+      "integrity": "sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.6.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.7.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
       }
     },
     "@babel/plugin-syntax-async-generators": {
@@ -895,9 +1415,9 @@
       }
     },
     "@babel/plugin-syntax-flow": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz",
-      "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz",
+      "integrity": "sha512-vQMV07p+L+jZeUnvX3pEJ9EiXGCjB5CTTvsirFD9rpEuATnoAvLBLoYbw1v5tyn3d2XxSuvEKi8cV3KqYUa0vQ==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -939,6 +1459,15 @@
         "@babel/helper-plugin-utils": "^7.0.0"
       }
     },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz",
+      "integrity": "sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
     "@babel/plugin-syntax-typescript": {
       "version": "7.3.3",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz",
@@ -958,14 +1487,36 @@
       }
     },
     "@babel/plugin-transform-async-to-generator": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz",
-      "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz",
+      "integrity": "sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-module-imports": "^7.7.0",
         "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0"
+        "@babel/helper-remap-async-to-generator": "^7.7.0"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz",
+          "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
@@ -978,9 +1529,9 @@
       }
     },
     "@babel/plugin-transform-block-scoping": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz",
-      "integrity": "sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz",
+      "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1044,14 +1595,13 @@
       }
     },
     "@babel/plugin-transform-dotall-regex": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz",
-      "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz",
+      "integrity": "sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.6.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.7.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
       }
     },
     "@babel/plugin-transform-duplicate-keys": {
@@ -1074,9 +1624,9 @@
       }
     },
     "@babel/plugin-transform-flow-strip-types": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz",
-      "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.6.3.tgz",
+      "integrity": "sha512-l0ETkyEofkqFJ9LS6HChNIKtVJw2ylKbhYMlJ5C6df+ldxxaLIyXY4yOdDQQspfFpV8/vDiaWoJlvflstlYNxg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1166,16 +1716,36 @@
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz",
-      "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz",
+      "integrity": "sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==",
       "dev": true,
       "requires": {
-        "@babel/helper-hoist-variables": "^7.4.4",
+        "@babel/helper-hoist-variables": "^7.7.0",
         "@babel/helper-plugin-utils": "^7.0.0",
         "babel-plugin-dynamic-import-node": "^2.3.0"
       },
       "dependencies": {
+        "@babel/helper-hoist-variables": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz",
+          "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
         "babel-plugin-dynamic-import-node": {
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
@@ -1188,22 +1758,94 @@
       }
     },
     "@babel/plugin-transform-modules-umd": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
-      "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz",
+      "integrity": "sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.1.0",
+        "@babel/helper-module-transforms": "^7.7.0",
         "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz",
-      "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==",
-      "dev": true,
-      "requires": {
-        "regexpu-core": "^4.6.0"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz",
+          "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-module-transforms": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz",
+          "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-module-imports": "^7.7.0",
+            "@babel/helper-simple-access": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/helper-simple-access": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz",
+          "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==",
+          "dev": true,
+          "requires": {
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz",
+      "integrity": "sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.7.0"
       }
     },
     "@babel/plugin-transform-new-target": {
@@ -1286,9 +1928,9 @@
       }
     },
     "@babel/plugin-transform-regenerator": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
-      "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz",
+      "integrity": "sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==",
       "dev": true,
       "requires": {
         "regenerator-transform": "^0.14.0"
@@ -1333,9 +1975,9 @@
       }
     },
     "@babel/plugin-transform-spread": {
-      "version": "7.2.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
-      "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz",
+      "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -1371,9 +2013,9 @@
       }
     },
     "@babel/plugin-transform-typescript": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.0.tgz",
-      "integrity": "sha512-yzw7EopOOr6saONZ3KA3lpizKnWRTe+rfBqg4AmQbSow7ik7fqmzrfIqt053osLwLE2AaTqGinLM2tl6+M/uog==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.3.tgz",
+      "integrity": "sha512-aiWINBrPMSC3xTXRNM/dfmyYuPNKY/aexYqBgh0HBI5Y+WO5oRAqW/oROYeYHrF4Zw12r9rK4fMk/ZlAmqx/FQ==",
       "dev": true,
       "requires": {
         "@babel/helper-create-class-features-plugin": "^7.6.0",
@@ -1405,9 +2047,9 @@
           }
         },
         "@babel/types": {
-          "version": "7.6.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-          "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
+          "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2",
@@ -1418,20 +2060,19 @@
       }
     },
     "@babel/plugin-transform-unicode-regex": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz",
-      "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz",
+      "integrity": "sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.6.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.7.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
       }
     },
     "@babel/polyfill": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.6.0.tgz",
-      "integrity": "sha512-q5BZJI0n/B10VaQQvln1IlDK3BTBJFbADx7tv+oXDPIDZuTo37H5Adb9jhlXm/fEN4Y7/64qD9mnrJJG7rmaTw==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.7.0.tgz",
+      "integrity": "sha512-/TS23MVvo34dFmf8mwCisCbWGrfhbiWZSwBo6HkADTBhUa2Q/jWltyY/tpofz/b6/RIhqaqQcquptCirqIhOaQ==",
       "dev": true,
       "requires": {
         "core-js": "^2.6.5",
@@ -1439,9 +2080,9 @@
       },
       "dependencies": {
         "core-js": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
-          "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==",
+          "version": "2.6.10",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz",
+          "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==",
           "dev": true
         },
         "regenerator-runtime": {
@@ -1453,56 +2094,57 @@
       }
     },
     "@babel/preset-env": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.2.tgz",
-      "integrity": "sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q==",
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz",
+      "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-module-imports": "^7.7.0",
         "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
-        "@babel/plugin-proposal-dynamic-import": "^7.5.0",
+        "@babel/plugin-proposal-async-generator-functions": "^7.7.0",
+        "@babel/plugin-proposal-dynamic-import": "^7.7.0",
         "@babel/plugin-proposal-json-strings": "^7.2.0",
         "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
         "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.6.2",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.7.0",
         "@babel/plugin-syntax-async-generators": "^7.2.0",
         "@babel/plugin-syntax-dynamic-import": "^7.2.0",
         "@babel/plugin-syntax-json-strings": "^7.2.0",
         "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
         "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
+        "@babel/plugin-syntax-top-level-await": "^7.7.0",
         "@babel/plugin-transform-arrow-functions": "^7.2.0",
-        "@babel/plugin-transform-async-to-generator": "^7.5.0",
+        "@babel/plugin-transform-async-to-generator": "^7.7.0",
         "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
-        "@babel/plugin-transform-block-scoping": "^7.6.2",
-        "@babel/plugin-transform-classes": "^7.5.5",
+        "@babel/plugin-transform-block-scoping": "^7.6.3",
+        "@babel/plugin-transform-classes": "^7.7.0",
         "@babel/plugin-transform-computed-properties": "^7.2.0",
         "@babel/plugin-transform-destructuring": "^7.6.0",
-        "@babel/plugin-transform-dotall-regex": "^7.6.2",
+        "@babel/plugin-transform-dotall-regex": "^7.7.0",
         "@babel/plugin-transform-duplicate-keys": "^7.5.0",
         "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
         "@babel/plugin-transform-for-of": "^7.4.4",
-        "@babel/plugin-transform-function-name": "^7.4.4",
+        "@babel/plugin-transform-function-name": "^7.7.0",
         "@babel/plugin-transform-literals": "^7.2.0",
         "@babel/plugin-transform-member-expression-literals": "^7.2.0",
         "@babel/plugin-transform-modules-amd": "^7.5.0",
-        "@babel/plugin-transform-modules-commonjs": "^7.6.0",
-        "@babel/plugin-transform-modules-systemjs": "^7.5.0",
-        "@babel/plugin-transform-modules-umd": "^7.2.0",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.2",
+        "@babel/plugin-transform-modules-commonjs": "^7.7.0",
+        "@babel/plugin-transform-modules-systemjs": "^7.7.0",
+        "@babel/plugin-transform-modules-umd": "^7.7.0",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0",
         "@babel/plugin-transform-new-target": "^7.4.4",
         "@babel/plugin-transform-object-super": "^7.5.5",
         "@babel/plugin-transform-parameters": "^7.4.4",
         "@babel/plugin-transform-property-literals": "^7.2.0",
-        "@babel/plugin-transform-regenerator": "^7.4.5",
+        "@babel/plugin-transform-regenerator": "^7.7.0",
         "@babel/plugin-transform-reserved-words": "^7.2.0",
         "@babel/plugin-transform-shorthand-properties": "^7.2.0",
         "@babel/plugin-transform-spread": "^7.6.2",
         "@babel/plugin-transform-sticky-regex": "^7.2.0",
         "@babel/plugin-transform-template-literals": "^7.4.4",
         "@babel/plugin-transform-typeof-symbol": "^7.2.0",
-        "@babel/plugin-transform-unicode-regex": "^7.6.2",
-        "@babel/types": "^7.6.0",
+        "@babel/plugin-transform-unicode-regex": "^7.7.0",
+        "@babel/types": "^7.7.1",
         "browserslist": "^4.6.0",
         "core-js-compat": "^3.1.1",
         "invariant": "^2.2.2",
@@ -1510,39 +2152,217 @@
         "semver": "^5.5.0"
       },
       "dependencies": {
-        "@babel/plugin-proposal-object-rest-spread": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz",
-          "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==",
+        "@babel/generator": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz",
+          "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==",
           "dev": true,
           "requires": {
-            "@babel/helper-plugin-utils": "^7.0.0",
-            "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
+            "@babel/types": "^7.7.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
           }
         },
-        "@babel/plugin-transform-block-scoping": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz",
-          "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==",
+        "@babel/helper-annotate-as-pure": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz",
+          "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==",
           "dev": true,
           "requires": {
-            "@babel/helper-plugin-utils": "^7.0.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-define-map": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz",
+          "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/types": "^7.7.0",
+            "lodash": "^4.17.13"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+          "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+          "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-member-expression-to-functions": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz",
+          "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-module-imports": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz",
+          "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-module-transforms": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz",
+          "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-module-imports": "^7.7.0",
+            "@babel/helper-simple-access": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0",
             "lodash": "^4.17.13"
           }
         },
-        "@babel/plugin-transform-spread": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz",
-          "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==",
+        "@babel/helper-optimise-call-expression": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz",
+          "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-replace-supers": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz",
+          "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-member-expression-to-functions": "^7.7.0",
+            "@babel/helper-optimise-call-expression": "^7.7.0",
+            "@babel/traverse": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-simple-access": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz",
+          "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==",
+          "dev": true,
+          "requires": {
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
+          "dev": true
+        },
+        "@babel/plugin-transform-classes": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz",
+          "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-annotate-as-pure": "^7.7.0",
+            "@babel/helper-define-map": "^7.7.0",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-optimise-call-expression": "^7.7.0",
+            "@babel/helper-plugin-utils": "^7.0.0",
+            "@babel/helper-replace-supers": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "globals": "^11.1.0"
+          }
+        },
+        "@babel/plugin-transform-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz",
+          "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==",
           "dev": true,
           "requires": {
+            "@babel/helper-function-name": "^7.7.0",
             "@babel/helper-plugin-utils": "^7.0.0"
           }
         },
+        "@babel/plugin-transform-modules-commonjs": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz",
+          "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-module-transforms": "^7.7.0",
+            "@babel/helper-plugin-utils": "^7.0.0",
+            "@babel/helper-simple-access": "^7.7.0",
+            "babel-plugin-dynamic-import-node": "^2.3.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz",
+          "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.5.5",
+            "@babel/generator": "^7.7.2",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/parser": "^7.7.2",
+            "@babel/types": "^7.7.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.13"
+          },
+          "dependencies": {
+            "@babel/code-frame": {
+              "version": "7.5.5",
+              "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+              "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+              "dev": true,
+              "requires": {
+                "@babel/highlight": "^7.0.0"
+              }
+            }
+          }
+        },
         "@babel/types": {
-          "version": "7.6.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-          "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2",
@@ -1550,17 +2370,53 @@
             "to-fast-properties": "^2.0.0"
           }
         },
+        "babel-plugin-dynamic-import-node": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
+          "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
+          "dev": true,
+          "requires": {
+            "object.assign": "^4.1.0"
+          }
+        },
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+          "dev": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "ms": "^2.1.1"
           }
         },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -1570,9 +2426,9 @@
       }
     },
     "@babel/preset-react": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz",
-      "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.6.3.tgz",
+      "integrity": "sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1593,16 +2449,56 @@
       }
     },
     "@babel/register": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.6.2.tgz",
-      "integrity": "sha512-xgZk2LRZvt6i2SAUWxc7ellk4+OYRgS3Zpsnr13nMS1Qo25w21Uu8o6vTOAqNaxiqrnv30KTYzh9YWY2k21CeQ==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.7.0.tgz",
+      "integrity": "sha512-HV3GJzTvSoyOMWGYn2TAh6uL6g+gqKTgEZ99Q3+X9UURT1VPT/WcU46R61XftIc5rXytcOHZ4Z0doDlsjPomIg==",
       "dev": true,
       "requires": {
         "find-cache-dir": "^2.0.0",
         "lodash": "^4.17.13",
-        "mkdirp": "^0.5.1",
+        "make-dir": "^2.1.0",
         "pirates": "^4.0.0",
-        "source-map-support": "^0.5.9"
+        "source-map-support": "^0.5.16"
+      },
+      "dependencies": {
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+          "dev": true,
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "source-map-support": {
+          "version": "0.5.16",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
+          "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
+          }
+        }
       }
     },
     "@babel/runtime": {
@@ -1837,9 +2733,9 @@
       }
     },
     "@emotion/core": {
-      "version": "10.0.17",
-      "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.17.tgz",
-      "integrity": "sha512-gykyjjr0sxzVuZBVTVK4dUmYsorc2qLhdYgSiOVK+m7WXgcYTKZevGWZ7TLAgTZvMelCTvhNq8xnf8FR1IdTbg==",
+      "version": "10.0.20",
+      "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.20.tgz",
+      "integrity": "sha512-Vwzx/fcIHoaUzZSzYs75T1qaMrhpkvZwKfbRKBExu296t0CDUJ4RX3UMSiUB+nbHEF1cftz6bop0DXv1NXQt4Q==",
       "dev": true,
       "requires": {
         "@babel/runtime": "^7.5.5",
@@ -1900,12 +2796,6 @@
           "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.3.tgz",
           "integrity": "sha512-2Md9mH6mvo+ygq1trTeVp2uzAKwE2P7In0cRpD/M9Q70aH8L+rxMLbb3JCN2JoSWsV2O+DdFjfbbXoMoLBczow==",
           "dev": true
-        },
-        "@emotion/unitless": {
-          "version": "0.7.4",
-          "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.4.tgz",
-          "integrity": "sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ==",
-          "dev": true
         }
       }
     },
@@ -1922,9 +2812,9 @@
       "dev": true
     },
     "@emotion/unitless": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.3.tgz",
-      "integrity": "sha512-4zAPlpDEh2VwXswwr/t8xGNDGg8RQiPxtxZ3qQEXyQsBV39ptTdESCjuBvGze1nLMVrxmTIKmnO/nAV8Tqjjzg==",
+      "version": "0.7.4",
+      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.4.tgz",
+      "integrity": "sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ==",
       "dev": true
     },
     "@emotion/utils": {
@@ -1961,116 +2851,39 @@
         "relay-runtime": "2.0.0",
         "signedsource": "^1.0.0",
         "yargs": "^9.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
-          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
-          "dev": true
-        },
-        "cliui": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
-          "dev": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wrap-ansi": "^2.0.0"
-          },
-          "dependencies": {
-            "string-width": {
-              "version": "1.0.2",
-              "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-              "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-              "dev": true,
-              "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-              }
-            }
-          }
-        },
-        "decamelize": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-          "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "yargs": {
-          "version": "9.0.1",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz",
-          "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=",
-          "dev": true,
-          "requires": {
-            "camelcase": "^4.1.0",
-            "cliui": "^3.2.0",
-            "decamelize": "^1.1.1",
-            "get-caller-file": "^1.0.1",
-            "os-locale": "^2.0.0",
-            "read-pkg-up": "^2.0.0",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^1.0.1",
-            "set-blocking": "^2.0.0",
-            "string-width": "^2.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^3.2.1",
-            "yargs-parser": "^7.0.0"
-          }
-        },
-        "yargs-parser": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
-          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
-          "dev": true,
-          "requires": {
-            "camelcase": "^4.1.0"
-          }
-        }
-      }
-    },
-    "@hapi/address": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.1.tgz",
-      "integrity": "sha512-DYuHzu978pP1XW1GD3HGvLnAFjbQTIgc2+V153FGkbS2pgo9haigCdwBnUDrbhaOkgiJlbZvoEqDrcxSLHpiWA=="
-    },
-    "@hapi/bourne": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
-      "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
-      "dev": true
-    },
-    "@hapi/formula": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz",
-      "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA=="
-    },
-    "@hapi/hoek": {
-      "version": "8.2.4",
-      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.4.tgz",
-      "integrity": "sha512-Ze5SDNt325yZvNO7s5C4fXDscjJ6dcqLFXJQ/M7dZRQCewuDj2iDUuBi6jLQt+APbW9RjjVEvLr35FXuOEqjow=="
-    },
-    "@hapi/joi": {
-      "version": "16.1.4",
-      "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.4.tgz",
-      "integrity": "sha512-m7ctezhxjob+dSpXnCNlgAj6rrEpdSsaWu3GWL3g1AybQCU36mlAo9IwGFJwIxD+oHgdO6mYyviYlaejX+qN6g==",
-      "requires": {
-        "@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": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.1.tgz",
+      "integrity": "sha512-DYuHzu978pP1XW1GD3HGvLnAFjbQTIgc2+V153FGkbS2pgo9haigCdwBnUDrbhaOkgiJlbZvoEqDrcxSLHpiWA=="
+    },
+    "@hapi/bourne": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
+      "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
+      "dev": true
+    },
+    "@hapi/formula": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz",
+      "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA=="
+    },
+    "@hapi/hoek": {
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.4.tgz",
+      "integrity": "sha512-Ze5SDNt325yZvNO7s5C4fXDscjJ6dcqLFXJQ/M7dZRQCewuDj2iDUuBi6jLQt+APbW9RjjVEvLr35FXuOEqjow=="
+    },
+    "@hapi/joi": {
+      "version": "16.1.7",
+      "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.7.tgz",
+      "integrity": "sha512-anaIgnZhNooG3LJLrTFzgGALTiO97zRA1UkvQHm9KxxoSiIzCozB3RCNCpDnfhTJD72QlrHA8nwGmNgpFFCIeg==",
+      "requires": {
+        "@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"
       },
       "dependencies": {
         "@hapi/address": {
@@ -2150,11 +2963,12 @@
       }
     },
     "@octokit/endpoint": {
-      "version": "5.3.6",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.3.6.tgz",
-      "integrity": "sha512-XuerByak8H+jW9J/rVMEdBXfI4UTsDWUwAKgIP/uhQjXIUVdPRwt2Zg+SmbWQ+WY7pRkw/hFVES8C4G/Kle7oA==",
+      "version": "5.5.1",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.1.tgz",
+      "integrity": "sha512-nBFhRUb5YzVTCX/iAK1MgQ4uWo89Gu0TH00qQHoYRCsE12dWcG1OiLd7v2EIo2+tpUKPMOQ62QFy9hy9Vg2ULg==",
       "dev": true,
       "requires": {
+        "@octokit/types": "^2.0.0",
         "is-plain-object": "^3.0.0",
         "universal-user-agent": "^4.0.0"
       },
@@ -2177,13 +2991,14 @@
       }
     },
     "@octokit/request": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.1.0.tgz",
-      "integrity": "sha512-I15T9PwjFs4tbWyhtFU2Kq7WDPidYMvRB7spmxoQRZfxSmiqullG+Nz+KbSmpkfnlvHwTr1e31R5WReFRKMXjg==",
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.1.tgz",
+      "integrity": "sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg==",
       "dev": true,
       "requires": {
-        "@octokit/endpoint": "^5.1.0",
+        "@octokit/endpoint": "^5.5.0",
         "@octokit/request-error": "^1.0.1",
+        "@octokit/types": "^2.0.0",
         "deprecation": "^2.0.0",
         "is-plain-object": "^3.0.0",
         "node-fetch": "^2.3.0",
@@ -2209,22 +3024,23 @@
       }
     },
     "@octokit/request-error": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.0.4.tgz",
-      "integrity": "sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.0.tgz",
+      "integrity": "sha512-DNBhROBYjjV/I9n7A8kVkmQNkqFAMem90dSxqvPq57e2hBr7mNTX98y3R2zDpqMQHVRpBDjsvsfIGgBzy+4PAg==",
       "dev": true,
       "requires": {
+        "@octokit/types": "^2.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       }
     },
     "@octokit/rest": {
-      "version": "16.30.1",
-      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.30.1.tgz",
-      "integrity": "sha512-1n2QzTbbaBXNLpx7WHlcsSMdJvxSdKmerXQm+bMYlKDbQM19uq446ZpGs7Ynq5SsdLj1usIfgJ9gJf4LtcWkDw==",
+      "version": "16.34.1",
+      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.34.1.tgz",
+      "integrity": "sha512-JUoS12cdktf1fv86rgrjC/RvYLuL+o7p57W7zX1x7ANFJ7OvdV8emvUNkFlcidEaOkYrxK3SoWgQFt3FhNmabA==",
       "dev": true,
       "requires": {
-        "@octokit/request": "^5.0.0",
+        "@octokit/request": "^5.2.0",
         "@octokit/request-error": "^1.0.2",
         "atob-lite": "^2.0.0",
         "before-after-hook": "^2.0.0",
@@ -2238,6 +3054,15 @@
         "universal-user-agent": "^4.0.0"
       }
     },
+    "@octokit/types": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.0.1.tgz",
+      "integrity": "sha512-YDYgV6nCzdGdOm7wy43Ce8SQ3M5DMKegB8E5sTB/1xrxOdo2yS/KgUgML2N2ZGD621mkbdrAglwTyA4NDOlFFA==",
+      "dev": true,
+      "requires": {
+        "@types/node": ">= 8"
+      }
+    },
     "@pieh/friendly-errors-webpack-plugin": {
       "version": "1.7.0-chalk-2",
       "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz",
@@ -2257,15 +3082,15 @@
       "dev": true
     },
     "@popmotion/popcorn": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/@popmotion/popcorn/-/popcorn-0.3.4.tgz",
-      "integrity": "sha512-pAp8qZT7Mjoutt3eH+wIyb0P8fINO1JNU16OdYcgST6FgX7+AG7vNic4SDDLnkSt60BuEYkZ9V0IQq3PnItx0Q==",
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/@popmotion/popcorn/-/popcorn-0.4.2.tgz",
+      "integrity": "sha512-wu0tEwK3KUZ9BoqfcqC3DfdfRDws/oHXwZKJMVtuhXSrF/PtqvilsPjAk93nh8M+orAnbe8ZyxQmop9+4oJs2g==",
       "dev": true,
       "requires": {
         "@popmotion/easing": "^1.0.1",
         "framesync": "^4.0.1",
-        "hey-listen": "^1.0.5",
-        "style-value-types": "^3.1.0"
+        "hey-listen": "^1.0.8",
+        "style-value-types": "^3.1.6"
       }
     },
     "@reach/router": {
@@ -2302,49 +3127,49 @@
       }
     },
     "@sentry/core": {
-      "version": "5.6.2",
-      "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.6.2.tgz",
-      "integrity": "sha512-grbjvNmyxP5WSPR6UobN2q+Nss7Hvz+BClBT8QTr7VTEG5q89TwNddn6Ej3bGkaUVbct/GpVlI3XflWYDsnU6Q==",
-      "requires": {
-        "@sentry/hub": "5.6.1",
-        "@sentry/minimal": "5.6.1",
-        "@sentry/types": "5.6.1",
-        "@sentry/utils": "5.6.1",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.7.1.tgz",
+      "integrity": "sha512-AOn3k3uVWh2VyajcHbV9Ta4ieDIeLckfo7UMLM+CTk2kt7C89SayDGayJMSsIrsZlL4qxBoLB9QY4W2FgAGJrg==",
+      "requires": {
+        "@sentry/hub": "5.7.1",
+        "@sentry/minimal": "5.7.1",
+        "@sentry/types": "5.7.1",
+        "@sentry/utils": "5.7.1",
         "tslib": "^1.9.3"
       }
     },
     "@sentry/hub": {
-      "version": "5.6.1",
-      "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.6.1.tgz",
-      "integrity": "sha512-m+OhkIV5yTAL3R1+XfCwzUQka0UF/xG4py8sEfPXyYIcoOJ2ZTX+1kQJLy8QQJ4RzOBwZA+DzRKP0cgzPJ3+oQ==",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.7.1.tgz",
+      "integrity": "sha512-evGh323WR073WSBCg/RkhlUmCQyzU0xzBzCZPscvcoy5hd4SsLE6t9Zin+WACHB9JFsRQIDwNDn+D+pj3yKsig==",
       "requires": {
-        "@sentry/types": "5.6.1",
-        "@sentry/utils": "5.6.1",
+        "@sentry/types": "5.7.1",
+        "@sentry/utils": "5.7.1",
         "tslib": "^1.9.3"
       }
     },
     "@sentry/minimal": {
-      "version": "5.6.1",
-      "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.6.1.tgz",
-      "integrity": "sha512-ercCKuBWHog6aS6SsJRuKhJwNdJ2oRQVWT2UAx1zqvsbHT9mSa8ZRjdPHYOtqY3DoXKk/pLUFW/fkmAnpdMqRw==",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.7.1.tgz",
+      "integrity": "sha512-nS/Dg+jWAZtcxQW8wKbkkw4dYvF6uyY/vDiz/jFCaux0LX0uhgXAC9gMOJmgJ/tYBLJ64l0ca5LzpZa7BMJQ0g==",
       "requires": {
-        "@sentry/hub": "5.6.1",
-        "@sentry/types": "5.6.1",
+        "@sentry/hub": "5.7.1",
+        "@sentry/types": "5.7.1",
         "tslib": "^1.9.3"
       }
     },
     "@sentry/node": {
-      "version": "5.6.2",
-      "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.6.2.tgz",
-      "integrity": "sha512-A9CELco6SjF4zt8iS1pO3KdUVI2WVhtTGhSH6X04OVf2en1fimPR+Vs8YVY/04udwd7o+3mI6byT+rS9+/Qzow==",
-      "requires": {
-        "@sentry/core": "5.6.2",
-        "@sentry/hub": "5.6.1",
-        "@sentry/types": "5.6.1",
-        "@sentry/utils": "5.6.1",
-        "cookie": "0.3.1",
-        "https-proxy-agent": "2.2.1",
-        "lru_map": "0.3.3",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.7.1.tgz",
+      "integrity": "sha512-hVM10asFStrOhYZzMqFM7V1lrHkr1ydc2n/SFG0ZmIQxfTjCVElyXV/BJASIdqadM1fFIvvtD/EfgkTcZmub1g==",
+      "requires": {
+        "@sentry/core": "5.7.1",
+        "@sentry/hub": "5.7.1",
+        "@sentry/types": "5.7.1",
+        "@sentry/utils": "5.7.1",
+        "cookie": "^0.3.1",
+        "https-proxy-agent": "^3.0.0",
+        "lru_map": "^0.3.3",
         "tslib": "^1.9.3"
       },
       "dependencies": {
@@ -2357,11 +3182,11 @@
           }
         },
         "https-proxy-agent": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
-          "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.0.tgz",
+          "integrity": "sha512-y4jAxNEihqvBI5F3SaO2rtsjIOnnNA8sEbuiP+UhJZJHeM2NRm6c09ax2tgqme+SgUUvjao2fJXF4h3D6Cb2HQ==",
           "requires": {
-            "agent-base": "^4.1.0",
+            "agent-base": "^4.3.0",
             "debug": "^3.1.0"
           }
         },
@@ -2373,16 +3198,16 @@
       }
     },
     "@sentry/types": {
-      "version": "5.6.1",
-      "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.6.1.tgz",
-      "integrity": "sha512-Kub8TETefHpdhvtnDj3kKfhCj0u/xn3Zi2zIC7PB11NJHvvPXENx97tciz4roJGp7cLRCJsFqCg4tHXniqDSnQ=="
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.7.1.tgz",
+      "integrity": "sha512-tbUnTYlSliXvnou5D4C8Zr+7/wJrHLbpYX1YkLXuIJRU0NSi81bHMroAuHWILcQKWhVjaV/HZzr7Y/hhWtbXVQ=="
     },
     "@sentry/utils": {
-      "version": "5.6.1",
-      "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.6.1.tgz",
-      "integrity": "sha512-rfgha+UsHW816GqlSRPlniKqAZylOmQWML2JsujoUP03nPu80zdN43DK9Poy/d9OxBxv0gd5K2n+bFdM2kqLQQ==",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.7.1.tgz",
+      "integrity": "sha512-nhirUKj/qFLsR1i9kJ5BRvNyzdx/E2vorIsukuDrbo8e3iZ11JMgCOVrmC8Eq9YkHBqgwX4UnrPumjFyvGMZ2Q==",
       "requires": {
-        "@sentry/types": "5.6.1",
+        "@sentry/types": "5.7.1",
         "tslib": "^1.9.3"
       }
     },
@@ -2446,9 +3271,9 @@
       }
     },
     "@types/chai": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.3.tgz",
-      "integrity": "sha512-VRw2xEGbll3ZiTQ4J02/hUjNqZoue1bMhoo2dgM2LXjDdyaq4q80HgBDHwpI0/VKlo4Eg+BavyQMv/NYgTetzA==",
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.4.tgz",
+      "integrity": "sha512-7qvf9F9tMTzo0akeswHPGqgUx/gIaJqrOEET/FCD8CFRkSUHlygQiM5yB6OvjrtdxBVLSyw7COJubsFYs0683g==",
       "dev": true
     },
     "@types/chai-enzyme": {
@@ -2530,9 +3355,9 @@
       "dev": true
     },
     "@types/invariant": {
-      "version": "2.2.29",
-      "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.29.tgz",
-      "integrity": "sha512-lRVw09gOvgviOfeUrKc/pmTiRZ7g7oDOU6OAutyuSHpm1/o2RaBQvRhgK8QEdu+FFuw/wnWb29A/iuxv9i8OpQ==",
+      "version": "2.2.30",
+      "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz",
+      "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==",
       "dev": true
     },
     "@types/json-schema": {
@@ -2591,9 +3416,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "12.7.5",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz",
-      "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==",
+      "version": "12.12.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.6.tgz",
+      "integrity": "sha512-FjsYUPzEJdGXjwKqSpE0/9QEh6kzhTAeObA54rn6j3rR4C/mzpI9L0KNfoeASSPMMdxIsoJuCLDWcM/rVjIsSA==",
       "dev": true
     },
     "@types/normalize-package-data": {
@@ -2609,9 +3434,9 @@
       "dev": true
     },
     "@types/reach__router": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.2.4.tgz",
-      "integrity": "sha512-a+MFhebeSGi0LwHZ0UhH/ke77rWtNQnt8YmaHnquSaY3HmyEi+BPQi3GhPcUPnC9X5BLw/qORw3BPxGb1mCtEw==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.2.6.tgz",
+      "integrity": "sha512-Oh5DAVr/L2svBvubw6QEFpXGu295Y406BPs4i9t1n2pp7M+q3pmCmhzb9oZV5wncR41KCD3NHl1Yhi7uKnTPsA==",
       "dev": true,
       "requires": {
         "@types/history": "*",
@@ -2629,36 +3454,36 @@
       }
     },
     "@types/react-dom": {
-      "version": "16.9.0",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.0.tgz",
-      "integrity": "sha512-OL2lk7LYGjxn4b0efW3Pvf2KBVP0y1v3wip1Bp7nA79NkOpElH98q3WdCEdDj93b2b0zaeBG9DvriuKjIK5xDA==",
+      "version": "16.9.3",
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.3.tgz",
+      "integrity": "sha512-FUuZKXPr9qlzUT9lhuzrZgLjH63TvNn28Ch3MvKG4B+F52zQtO8DtE0Opbncy3xaucNZM2WIPfuNTgkbKx5Brg==",
       "dev": true,
       "requires": {
         "@types/react": "*"
       }
     },
     "@types/react-helmet": {
-      "version": "5.0.10",
-      "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-5.0.10.tgz",
-      "integrity": "sha512-wGr0J7yncqwOS4ae+yYeMd4L3Gh43CgYcbq9bXEeSozB4d/+Z/XLT9wyMUwfWImWtOLCFLP6Xnt7w5P6+02gZg==",
+      "version": "5.0.14",
+      "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-5.0.14.tgz",
+      "integrity": "sha512-Q73FFg7+LjblfSQUNbnjrwy2T1avBP8yevEgNrkDjyz1rBbnXkuOQcEV7I5wvmAic9FLUk0CnkLieEDej84Zkw==",
       "dev": true,
       "requires": {
         "@types/react": "*"
       }
     },
     "@types/react-modal": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.8.3.tgz",
-      "integrity": "sha512-UBSa21GApA6Jly7ll9OQnZmEDttEJ8joy2TrfIEdf5bK6Sr8VTb3zHX0sPx7FTFDFdM9NpG4X0s5Dd2OXVTRhg==",
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.10.0.tgz",
+      "integrity": "sha512-HOBSGwtaZXACvYI2kdhOiAG+CtwCxq62TwayFxtsGDtOvBxE4vxKCQI7LnhrihoDchVarqvnH7GKZ8xXHjs+yg==",
       "dev": true,
       "requires": {
         "@types/react": "*"
       }
     },
     "@types/react-select": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-3.0.4.tgz",
-      "integrity": "sha512-Po4P/ZbUHXGx5ivdF84q8rxL4MPdjCy5ikaS5l9/e+cGfhFzrJi0ahCu+gJZndsWKf8uYFq3WpC4M8klFQb8lg==",
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-3.0.8.tgz",
+      "integrity": "sha512-0763TXYZc8bTiHM+DUnWoy9Rg5mk6PxYWBrEe6Fkjgc0Kv0r1RqjZk9/BrK4wdM0RNjYjixlFPnUhOJb76sMGg==",
       "dev": true,
       "requires": {
         "@types/react": "*",
@@ -2667,14 +3492,20 @@
       }
     },
     "@types/react-transition-group": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.2.tgz",
-      "integrity": "sha512-YfoaTNqBwbIqpiJ5NNfxfgg5kyFP1Hqf/jqBtSWNv0E+EkkxmN+3VD6U2fu86tlQvdAc1o0SdWhnWFwcRMTn9A==",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.3.tgz",
+      "integrity": "sha512-Hk8jiuT7iLOHrcjKP/ZVSyCNXK73wJAUz60xm0mVhiRujrdiI++j4duLiL282VGxwAgxetHQFfqA29LgEeSkFA==",
       "dev": true,
       "requires": {
         "@types/react": "*"
       }
     },
+    "@types/sizzle": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz",
+      "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==",
+      "dev": true
+    },
     "@types/styled-components": {
       "version": "4.1.8",
       "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-4.1.8.tgz",
@@ -3081,13 +3912,13 @@
       }
     },
     "airbnb-prop-types": {
-      "version": "2.13.2",
-      "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.13.2.tgz",
-      "integrity": "sha512-2FN6DlHr6JCSxPPi25EnqGaXC4OC3/B3k1lCd6MMYrZ51/Gf/1qDfaR+JElzWa+Tl7cY2aYOlsYJGFeQyVHIeQ==",
+      "version": "2.15.0",
+      "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz",
+      "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==",
       "dev": true,
       "requires": {
-        "array.prototype.find": "^2.0.4",
-        "function.prototype.name": "^1.1.0",
+        "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",
@@ -3095,9 +3926,30 @@
         "object.entries": "^1.1.0",
         "prop-types": "^15.7.2",
         "prop-types-exact": "^1.2.0",
-        "react-is": "^16.8.6"
+        "react-is": "^16.9.0"
       },
       "dependencies": {
+        "define-properties": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+          "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+          "dev": true,
+          "requires": {
+            "object-keys": "^1.0.12"
+          }
+        },
+        "function.prototype.name": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz",
+          "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==",
+          "dev": true,
+          "requires": {
+            "define-properties": "^1.1.3",
+            "function-bind": "^1.1.1",
+            "functions-have-names": "^1.1.1",
+            "is-callable": "^1.1.4"
+          }
+        },
         "has": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -3107,10 +3959,22 @@
             "function-bind": "^1.1.1"
           }
         },
+        "is-callable": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+          "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+          "dev": true
+        },
+        "object-keys": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+          "dev": true
+        },
         "react-is": {
-          "version": "16.8.6",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
-          "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==",
+          "version": "16.10.2",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz",
+          "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==",
           "dev": true
         }
       }
@@ -3404,17 +4268,21 @@
           }
         },
         "es-abstract": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
-          "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
+          "version": "1.15.0",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz",
+          "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==",
           "dev": true,
           "requires": {
             "es-to-primitive": "^1.2.0",
             "function-bind": "^1.1.1",
             "has": "^1.0.3",
+            "has-symbols": "^1.0.0",
             "is-callable": "^1.1.4",
             "is-regex": "^1.0.4",
-            "object-keys": "^1.0.12"
+            "object-inspect": "^1.6.0",
+            "object-keys": "^1.1.1",
+            "string.prototype.trimleft": "^2.1.0",
+            "string.prototype.trimright": "^2.1.0"
           }
         },
         "es-to-primitive": {
@@ -3528,6 +4396,87 @@
         }
       }
     },
+    "array.prototype.flatmap": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.2.tgz",
+      "integrity": "sha512-ZZtPLE74KNE+0XcPv/vQmcivxN+8FhwOLvt2udHauO0aDEpsXDQrmd5HuJGpgPVyaV8HvkDPWnJ2iaem0oCKtA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.15.0",
+        "function-bind": "^1.1.1"
+      },
+      "dependencies": {
+        "define-properties": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+          "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+          "dev": true,
+          "requires": {
+            "object-keys": "^1.0.12"
+          }
+        },
+        "es-abstract": {
+          "version": "1.16.0",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
+          "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
+          "dev": true,
+          "requires": {
+            "es-to-primitive": "^1.2.0",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.0",
+            "is-callable": "^1.1.4",
+            "is-regex": "^1.0.4",
+            "object-inspect": "^1.6.0",
+            "object-keys": "^1.1.1",
+            "string.prototype.trimleft": "^2.1.0",
+            "string.prototype.trimright": "^2.1.0"
+          }
+        },
+        "es-to-primitive": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+          "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+          "dev": true,
+          "requires": {
+            "is-callable": "^1.1.4",
+            "is-date-object": "^1.0.1",
+            "is-symbol": "^1.0.2"
+          }
+        },
+        "has": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+          "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+          "dev": true,
+          "requires": {
+            "function-bind": "^1.1.1"
+          }
+        },
+        "is-callable": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+          "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+          "dev": true
+        },
+        "is-symbol": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+          "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+          "dev": true,
+          "requires": {
+            "has-symbols": "^1.0.0"
+          }
+        },
+        "object-keys": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+          "dev": true
+        }
+      }
+    },
     "arraybuffer.slice": {
       "version": "0.0.7",
       "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
@@ -3662,9 +4611,9 @@
       "dev": true
     },
     "auto-bind": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-2.1.0.tgz",
-      "integrity": "sha512-qZuFvkes1eh9lB2mg8/HG18C+5GIO51r+RrCSst/lh+i5B1CtVlkhTE488M805Nr3dKl0sM/pIFKSKUIlg3zUg==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-2.1.1.tgz",
+      "integrity": "sha512-NUwV1i9D3vxxY1KnfZgSZ716d6ovY7o8LfOwLhGIPFBowIb6Ln6DBW64+jCqPzUznel2hRSkQnYQqvh7/ldw8A==",
       "dev": true,
       "optional": true,
       "requires": {
@@ -3672,29 +4621,50 @@
       }
     },
     "autoprefixer": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz",
-      "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==",
+      "version": "9.7.1",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz",
+      "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.6.3",
-        "caniuse-lite": "^1.0.30000980",
+        "browserslist": "^4.7.2",
+        "caniuse-lite": "^1.0.30001006",
         "chalk": "^2.4.2",
         "normalize-range": "^0.1.2",
         "num2fraction": "^1.2.2",
-        "postcss": "^7.0.17",
-        "postcss-value-parser": "^4.0.0"
+        "postcss": "^7.0.21",
+        "postcss-value-parser": "^4.0.2"
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.39",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+          "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "semver": "^6.3.0"
           }
         },
         "postcss-value-parser": {
@@ -3726,9 +4696,9 @@
       },
       "dependencies": {
         "is-buffer": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
-          "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==",
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
           "dev": true
         }
       }
@@ -3886,9 +4856,9 @@
       }
     },
     "babel-plugin-emotion": {
-      "version": "10.0.19",
-      "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.19.tgz",
-      "integrity": "sha512-1pJb5uKN/gx6bi3gGr588Krj49sxARI9KmxhtMUa+NRJb6lR3OfC51mh3NlWRsOqdjWlT4cSjnZpnFq5K3T5ZA==",
+      "version": "10.0.20",
+      "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.20.tgz",
+      "integrity": "sha512-Lmyc1wk+zdvz9LY0IZub51fwTxsptxdvBR7aGGmPit9PX7suYUtndFcge945TNqcz7MZxbMxlo52RaRxH+3wiw==",
       "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.0.0",
@@ -4099,9 +5069,9 @@
       }
     },
     "babel-plugin-remove-graphql-queries": {
-      "version": "2.7.7",
-      "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.7.tgz",
-      "integrity": "sha512-/bmTuUkkLtim99qe7Lj3VBTLsOX3nxeuwtkqb4q3ybuynpP2rYuLUUQ3Z5Lq+1sT63ImN49+q8EiP+BMXstEAQ==",
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.14.tgz",
+      "integrity": "sha512-GnAZhBChCjAg0NyZMmZureWmBXijbAK7wreEpsoI1oP5hCuHcvWknDU4u5PjoVdLyJ+8ObJ86Y/Y4uzrqcg/qg==",
       "dev": true
     },
     "babel-plugin-styled-components": {
@@ -4141,9 +5111,9 @@
       "dev": true
     },
     "babel-preset-fbjs": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz",
-      "integrity": "sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz",
+      "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==",
       "dev": true,
       "requires": {
         "@babel/plugin-proposal-class-properties": "^7.0.0",
@@ -4176,181 +5146,30 @@
       }
     },
     "babel-preset-gatsby": {
-      "version": "0.2.17",
-      "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.2.17.tgz",
-      "integrity": "sha512-6jR7z54Rj1QYUN5UMYOMWYpY0cGNRVyqT9bOgao32c9Fs7AUi5m6mgTDW/jHuhND0HQy8Hfstc1apoXr/D5KQg==",
+      "version": "0.2.20",
+      "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.2.20.tgz",
+      "integrity": "sha512-vKDeNhszAjTiHpgIyzLOxf9NCY9Jbw7k2yi6m4i9b9uPySCU19b/oRifYA0bC5cRj76vfoicSjykFGuwjj0Tyw==",
       "dev": true,
       "requires": {
         "@babel/plugin-proposal-class-properties": "^7.5.5",
         "@babel/plugin-syntax-dynamic-import": "^7.2.0",
         "@babel/plugin-transform-runtime": "^7.6.2",
         "@babel/plugin-transform-spread": "^7.6.2",
-        "@babel/preset-env": "^7.6.2",
-        "@babel/preset-react": "^7.0.0",
-        "@babel/runtime": "^7.6.2",
+        "@babel/preset-env": "^7.6.3",
+        "@babel/preset-react": "^7.6.3",
+        "@babel/runtime": "^7.6.3",
         "babel-plugin-dynamic-import-node": "^1.2.0",
         "babel-plugin-macros": "^2.6.1",
         "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
       },
       "dependencies": {
-        "@babel/plugin-proposal-object-rest-spread": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz",
-          "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-plugin-utils": "^7.0.0",
-            "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
-          }
-        },
-        "@babel/plugin-proposal-unicode-property-regex": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz",
-          "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-plugin-utils": "^7.0.0",
-            "@babel/helper-regex": "^7.4.4",
-            "regexpu-core": "^4.6.0"
-          }
-        },
-        "@babel/plugin-transform-block-scoping": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz",
-          "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-plugin-utils": "^7.0.0",
-            "lodash": "^4.17.13"
-          }
-        },
-        "@babel/plugin-transform-dotall-regex": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz",
-          "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-plugin-utils": "^7.0.0",
-            "@babel/helper-regex": "^7.4.4",
-            "regexpu-core": "^4.6.0"
-          }
-        },
-        "@babel/plugin-transform-named-capturing-groups-regex": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz",
-          "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==",
-          "dev": true,
-          "requires": {
-            "regexpu-core": "^4.6.0"
-          }
-        },
-        "@babel/plugin-transform-spread": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz",
-          "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==",
+        "@babel/runtime": {
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
           "dev": true,
           "requires": {
-            "@babel/helper-plugin-utils": "^7.0.0"
-          }
-        },
-        "@babel/plugin-transform-unicode-regex": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz",
-          "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-plugin-utils": "^7.0.0",
-            "@babel/helper-regex": "^7.4.4",
-            "regexpu-core": "^4.6.0"
-          }
-        },
-        "@babel/preset-env": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.2.tgz",
-          "integrity": "sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.0.0",
-            "@babel/helper-plugin-utils": "^7.0.0",
-            "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
-            "@babel/plugin-proposal-dynamic-import": "^7.5.0",
-            "@babel/plugin-proposal-json-strings": "^7.2.0",
-            "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
-            "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
-            "@babel/plugin-proposal-unicode-property-regex": "^7.6.2",
-            "@babel/plugin-syntax-async-generators": "^7.2.0",
-            "@babel/plugin-syntax-dynamic-import": "^7.2.0",
-            "@babel/plugin-syntax-json-strings": "^7.2.0",
-            "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
-            "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
-            "@babel/plugin-transform-arrow-functions": "^7.2.0",
-            "@babel/plugin-transform-async-to-generator": "^7.5.0",
-            "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
-            "@babel/plugin-transform-block-scoping": "^7.6.2",
-            "@babel/plugin-transform-classes": "^7.5.5",
-            "@babel/plugin-transform-computed-properties": "^7.2.0",
-            "@babel/plugin-transform-destructuring": "^7.6.0",
-            "@babel/plugin-transform-dotall-regex": "^7.6.2",
-            "@babel/plugin-transform-duplicate-keys": "^7.5.0",
-            "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
-            "@babel/plugin-transform-for-of": "^7.4.4",
-            "@babel/plugin-transform-function-name": "^7.4.4",
-            "@babel/plugin-transform-literals": "^7.2.0",
-            "@babel/plugin-transform-member-expression-literals": "^7.2.0",
-            "@babel/plugin-transform-modules-amd": "^7.5.0",
-            "@babel/plugin-transform-modules-commonjs": "^7.6.0",
-            "@babel/plugin-transform-modules-systemjs": "^7.5.0",
-            "@babel/plugin-transform-modules-umd": "^7.2.0",
-            "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.2",
-            "@babel/plugin-transform-new-target": "^7.4.4",
-            "@babel/plugin-transform-object-super": "^7.5.5",
-            "@babel/plugin-transform-parameters": "^7.4.4",
-            "@babel/plugin-transform-property-literals": "^7.2.0",
-            "@babel/plugin-transform-regenerator": "^7.4.5",
-            "@babel/plugin-transform-reserved-words": "^7.2.0",
-            "@babel/plugin-transform-shorthand-properties": "^7.2.0",
-            "@babel/plugin-transform-spread": "^7.6.2",
-            "@babel/plugin-transform-sticky-regex": "^7.2.0",
-            "@babel/plugin-transform-template-literals": "^7.4.4",
-            "@babel/plugin-transform-typeof-symbol": "^7.2.0",
-            "@babel/plugin-transform-unicode-regex": "^7.6.2",
-            "@babel/types": "^7.6.0",
-            "browserslist": "^4.6.0",
-            "core-js-compat": "^3.1.1",
-            "invariant": "^2.2.2",
-            "js-levenshtein": "^1.1.3",
-            "semver": "^5.5.0"
-          }
-        },
-        "@babel/runtime": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz",
-          "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==",
-          "dev": true,
-          "requires": {
-            "regenerator-runtime": "^0.13.2"
-          }
-        },
-        "@babel/types": {
-          "version": "7.6.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-          "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2",
-            "lodash": "^4.17.13",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
-        "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
-          "dev": true,
-          "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "regenerator-runtime": "^0.13.2"
           }
         },
         "regenerator-runtime": {
@@ -4358,12 +5177,6 @@
           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
           "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
           "dev": true
-        },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
         }
       }
     },
@@ -4532,9 +5345,9 @@
       "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
     },
     "bluebird": {
-      "version": "3.5.5",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
-      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz",
+      "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==",
       "dev": true
     },
     "bn.js": {
@@ -4775,9 +5588,9 @@
       }
     },
     "bser": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz",
-      "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
       "dev": true,
       "requires": {
         "node-int64": "^0.4.0"
@@ -4901,9 +5714,9 @@
       },
       "dependencies": {
         "graceful-fs": {
-          "version": "4.2.2",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
-          "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+          "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
           "dev": true
         },
         "lru-cache": {
@@ -4931,9 +5744,9 @@
           "dev": true
         },
         "yallist": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
-          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
           "dev": true
         }
       }
@@ -4964,9 +5777,9 @@
       }
     },
     "cache-manager": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.10.0.tgz",
-      "integrity": "sha512-IuPx05r5L0uZyBDYicB2Llld1o+/1WYjoHUnrC0TNQejMAnkoYxYS9Y8Uwr+lIBytDiyu7dwwmBCup2M9KugwQ==",
+      "version": "2.10.1",
+      "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.10.1.tgz",
+      "integrity": "sha512-bk17v9IkLqNcbCzggEh82LEJhjHp+COnL57L7a0ESbM/cOuXIIBatdVjD/ps7vOsofI48++zAC14Ye+8v50flg==",
       "dev": true,
       "requires": {
         "async": "1.5.2",
@@ -5360,14 +6173,37 @@
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          },
+          "dependencies": {
+            "caniuse-lite": {
+              "version": "1.0.30001008",
+              "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+              "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+              "dev": true
+            }
+          }
+        },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.39",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+          "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "semver": "^6.3.0"
           }
         }
       }
@@ -5560,25 +6396,25 @@
       }
     },
     "chokidar": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz",
-      "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==",
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.3.tgz",
+      "integrity": "sha512-GtrxGuRf6bzHQmXWRepvsGnXpkQkVU+D2/9a7dAe4a7v1NhrfZOZ2oKf76M3nOs46fFYL8D+Q8JYA4GYeJ8Cjw==",
       "dev": true,
       "requires": {
-        "anymatch": "^3.0.1",
-        "braces": "^3.0.2",
-        "fsevents": "^2.0.6",
-        "glob-parent": "^5.0.0",
-        "is-binary-path": "^2.1.0",
-        "is-glob": "^4.0.1",
-        "normalize-path": "^3.0.0",
-        "readdirp": "^3.1.1"
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "fsevents": "~2.1.1",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.2.0"
       },
       "dependencies": {
         "anymatch": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz",
-          "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==",
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
           "dev": true,
           "requires": {
             "normalize-path": "^3.0.0",
@@ -5610,16 +6446,16 @@
           }
         },
         "fsevents": {
-          "version": "2.0.7",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz",
-          "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==",
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.1.tgz",
+          "integrity": "sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==",
           "dev": true,
           "optional": true
         },
         "glob-parent": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz",
-          "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==",
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
+          "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
           "dev": true,
           "requires": {
             "is-glob": "^4.0.1"
@@ -5656,9 +6492,9 @@
           "dev": true
         },
         "readdirp": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz",
-          "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==",
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
+          "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
           "dev": true,
           "requires": {
             "picomatch": "^2.0.4"
@@ -5676,9 +6512,9 @@
       }
     },
     "chownr": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz",
-      "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
+      "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==",
       "dev": true
     },
     "chrome-trace-event": {
@@ -5839,12 +6675,6 @@
         }
       }
     },
-    "classnames": {
-      "version": "2.2.6",
-      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
-      "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==",
-      "dev": true
-    },
     "clean-stack": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -6129,9 +6959,9 @@
       "dev": true
     },
     "comment-parser": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.6.2.tgz",
-      "integrity": "sha512-Wdms0Q8d4vvb2Yk72OwZjwNWtMklbC5Re7lD9cjCP/AG1fhocmc0TrxGBBAXPLy8fZQPrfHGgyygwI0lA7pbzA==",
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.0.tgz",
+      "integrity": "sha512-m0SGP0RFO4P3hIBlIor4sBFPe5Y4HUeGgo/UZK/1Zdea5eUiqxroQ3lFqBDDSfWo9z9Q6LLnt2u0JqwacVEd/A==",
       "dev": true
     },
     "common-tags": {
@@ -6171,9 +7001,9 @@
       },
       "dependencies": {
         "mime-db": {
-          "version": "1.41.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.41.0.tgz",
-          "integrity": "sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw==",
+          "version": "1.42.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz",
+          "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==",
           "dev": true
         }
       }
@@ -6256,13 +7086,13 @@
       }
     },
     "concurrently": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz",
-      "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.0.0.tgz",
+      "integrity": "sha512-1yDvK8mduTIdxIxV9C60KoiOySUl/lfekpdbI+U5GXaPrgdffEavFa9QZB3vh68oWOpbCC+TuvxXV9YRPMvUrA==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
-        "date-fns": "^1.30.1",
+        "date-fns": "^2.0.1",
         "lodash": "^4.17.15",
         "read-pkg": "^4.0.1",
         "rxjs": "^6.5.2",
@@ -6286,9 +7116,9 @@
           }
         },
         "date-fns": {
-          "version": "1.30.1",
-          "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
-          "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==",
+          "version": "2.5.1",
+          "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.5.1.tgz",
+          "integrity": "sha512-ZBrQmuaqH9YqIejbgu8f09ki7wdD2JxWsRTZ/+HnnLNmkI56ty0evnWzKY+ihLT0xX5VdUX0vDNZCxJJGKX2+Q==",
           "dev": true
         },
         "decamelize": {
@@ -6428,15 +7258,6 @@
             "pify": "^3.0.0"
           }
         },
-        "rxjs": {
-          "version": "6.5.2",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
-          "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
-          "dev": true,
-          "requires": {
-            "tslib": "^1.9.0"
-          }
-        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -6485,9 +7306,9 @@
       }
     },
     "config": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/config/-/config-3.2.2.tgz",
-      "integrity": "sha512-rOsfIOAcG82AWouK4/vBS/OKz3UPl2T/kP0irExmXJJOoWg2CmdfPLdx56bCoMUMFNh+7soQkQWCUC8DyemiwQ==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/config/-/config-3.2.4.tgz",
+      "integrity": "sha512-H1XIGfnU1EAkfjSLn9ZvYDRx9lOezDViuzLDgiJ/lMeqjYe3q6iQfpcLt2NInckJgpAeekbNhQkmnnbdEDs9rw==",
       "requires": {
         "json5": "^1.0.1"
       }
@@ -6507,9 +7328,9 @@
       }
     },
     "confusing-browser-globals": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.8.tgz",
-      "integrity": "sha512-lI7asCibVJ6Qd3FGU7mu4sfG4try4LX3+GVS+Gv8UlrEf2AeW57piecapnog2UHZSbcX/P/1UDWVaTsblowlZg==",
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
+      "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==",
       "dev": true
     },
     "connect-history-api-fallback": {
@@ -6519,13 +7340,10 @@
       "dev": true
     },
     "console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "dev": true,
-      "requires": {
-        "date-now": "^0.1.4"
-      }
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
     },
     "constants-browserify": {
       "version": "1.0.0",
@@ -6649,48 +7467,37 @@
       "dev": true
     },
     "core-js-compat": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz",
-      "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.0.tgz",
+      "integrity": "sha512-pgQUcgT2+v9/yxHgMynYjNj7nmxLRXv3UC39rjCjDwpe63ev2rioQTju1PKLYUBbPCQQvZNWvQC8tBJd65q11g==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.6.6",
+        "browserslist": "^4.7.2",
         "semver": "^6.3.0"
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
           }
         },
-        "electron-to-chromium": {
-          "version": "1.3.257",
-          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.257.tgz",
-          "integrity": "sha512-EcKVmUeHCZelPA0wnIaSmpAN8karKhKBwFb+xLUjSVZ8sGRE1l3fst1zQZ7KJUkyJ7H5edPd4RP94pzC9sG00A==",
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
           "dev": true
         },
-        "node-releases": {
-          "version": "1.1.30",
-          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.30.tgz",
-          "integrity": "sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw==",
-          "dev": true,
-          "requires": {
-            "semver": "^5.3.0"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.1",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-              "dev": true
-            }
-          }
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
         }
       }
     },
@@ -6710,13 +7517,14 @@
       }
     },
     "cosmiconfig": {
-      "version": "5.0.6",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz",
-      "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==",
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
       "dev": true,
       "requires": {
+        "import-fresh": "^2.0.0",
         "is-directory": "^0.3.1",
-        "js-yaml": "^3.9.0",
+        "js-yaml": "^3.13.1",
         "parse-json": "^4.0.0"
       },
       "dependencies": {
@@ -6857,9 +7665,9 @@
       }
     },
     "cross-env": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.0.tgz",
-      "integrity": "sha512-G/B6gtkjgthT8AP/xN1wdj5Xe18fVyk58JepK8GxpUbqcz3hyWxegocMbvnZK+KoTslwd0ACZ3woi/DVUdVjyQ==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz",
+      "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==",
       "requires": {
         "cross-spawn": "^7.0.0"
       },
@@ -7068,9 +7876,9 @@
       }
     },
     "css-to-react-native": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.1.tgz",
-      "integrity": "sha512-yO+oEx1Lf+hDKasqQRVrAvzMCz825Huh1VMlEEDlRWyAhFb/FWb6I0KpEF1PkyKQ7NEdcx9d5M2ZEWgJAsgPvQ==",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz",
+      "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==",
       "dev": true,
       "requires": {
         "camelize": "^1.0.0",
@@ -7242,13 +8050,14 @@
       "dev": true
     },
     "cypress": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.4.1.tgz",
-      "integrity": "sha512-1HBS7t9XXzkt6QHbwfirWYty8vzxNMawGj1yI+Fu6C3/VZJ8UtUngMW6layqwYZzLTZV8tiDpdCNBypn78V4Dg==",
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.6.0.tgz",
+      "integrity": "sha512-ODhbOrH1XZx0DUoYmJSvOSbEQjycNOpFYe7jOnHkT1+sdsn2+uqwAjZ1x982q3H4R/5iZjpSd50gd/iw2bofzg==",
       "dev": true,
       "requires": {
         "@cypress/listr-verbose-renderer": "0.4.1",
         "@cypress/xvfb": "1.2.4",
+        "@types/sizzle": "2.3.2",
         "arch": "2.1.1",
         "bluebird": "3.5.0",
         "cachedir": "1.3.0",
@@ -7275,6 +8084,7 @@
         "request-progress": "3.0.0",
         "supports-color": "5.5.0",
         "tmp": "0.1.0",
+        "untildify": "3.0.3",
         "url": "0.11.0",
         "yauzl": "2.10.0"
       },
@@ -7556,9 +8366,9 @@
       "dev": true
     },
     "danger": {
-      "version": "9.2.1",
-      "resolved": "https://registry.npmjs.org/danger/-/danger-9.2.1.tgz",
-      "integrity": "sha512-kKU/Yo1IZTJ/CrlK6A0VPz7KZnnADFpgDM8557sv61nNN3V44k2fwflpEGpBgzhbHLphKx9R35skObQ7zPS12g==",
+      "version": "9.2.4",
+      "resolved": "https://registry.npmjs.org/danger/-/danger-9.2.4.tgz",
+      "integrity": "sha512-d8EMe4lBbNM2ks+DMfYTbo7qEu+oKlBE76WzONmVCNb0B1T3Kc7jUeSutcOHH32pOMMlp8tqZmzVaVfqln9RTA==",
       "dev": true,
       "requires": {
         "@babel/polyfill": "^7.2.5",
@@ -7609,9 +8419,9 @@
           }
         },
         "json5": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
-          "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
+          "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
           "dev": true,
           "requires": {
             "minimist": "^1.2.0"
@@ -7657,12 +8467,6 @@
       "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==",
       "dev": true
     },
-    "date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
-      "dev": true
-    },
     "debug": {
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -7948,9 +8752,9 @@
       "dev": true
     },
     "detect-indent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
-      "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
+      "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==",
       "dev": true
     },
     "detect-node": {
@@ -8004,9 +8808,9 @@
           }
         },
         "@types/node": {
-          "version": "7.10.7",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.7.tgz",
-          "integrity": "sha512-4I7+hXKyq7e1deuzX9udu0hPIYqSSkdKXtjow6fMnQ3OR9qkxIErGHbGY08YrfZJrCS1ajK8lOuzd0k3n2WM4A==",
+          "version": "7.10.9",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.9.tgz",
+          "integrity": "sha512-usSpgoUsRtO5xNV5YEPU8PPnHisFx8u0rokj1BPVn/hDF7zwUDzVLiuKZM38B7z8V2111Fj6kd4rGtQFUZpNOw==",
           "dev": true
         },
         "tmp": {
@@ -8215,9 +9019,9 @@
       }
     },
     "dotenv": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz",
-      "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA=="
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
+      "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
     },
     "duplexer": {
       "version": "0.1.1",
@@ -8386,49 +9190,74 @@
       }
     },
     "engine.io": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz",
-      "integrity": "sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz",
+      "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==",
       "dev": true,
       "requires": {
         "accepts": "~1.3.4",
-        "base64id": "1.0.0",
+        "base64id": "2.0.0",
         "cookie": "0.3.1",
-        "debug": "~3.1.0",
-        "engine.io-parser": "~2.1.0",
-        "ws": "~6.1.0"
+        "debug": "~4.1.0",
+        "engine.io-parser": "~2.2.0",
+        "ws": "^7.1.2"
       },
       "dependencies": {
+        "base64id": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+          "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+          "dev": true
+        },
         "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "ms": "^2.1.1"
+          }
+        },
+        "engine.io-parser": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
+          "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
+          "dev": true,
+          "requires": {
+            "after": "0.8.2",
+            "arraybuffer.slice": "~0.0.7",
+            "base64-arraybuffer": "0.1.5",
+            "blob": "0.0.5",
+            "has-binary2": "~1.0.2"
           }
         },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
         "ws": {
-          "version": "6.1.4",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
-          "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz",
+          "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==",
           "dev": true,
           "requires": {
-            "async-limiter": "~1.0.0"
+            "async-limiter": "^1.0.0"
           }
         }
       }
     },
     "engine.io-client": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz",
-      "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz",
+      "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==",
       "dev": true,
       "requires": {
         "component-emitter": "1.2.1",
         "component-inherit": "0.0.3",
-        "debug": "~3.1.0",
-        "engine.io-parser": "~2.1.1",
+        "debug": "~4.1.0",
+        "engine.io-parser": "~2.2.0",
         "has-cors": "1.1.0",
         "indexof": "0.0.1",
         "parseqs": "0.0.5",
@@ -8439,14 +9268,33 @@
       },
       "dependencies": {
         "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "ms": "^2.1.1"
+          }
+        },
+        "engine.io-parser": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
+          "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
+          "dev": true,
+          "requires": {
+            "after": "0.8.2",
+            "arraybuffer.slice": "~0.0.7",
+            "base64-arraybuffer": "0.1.5",
+            "blob": "0.0.5",
+            "has-binary2": "~1.0.2"
           }
         },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
         "ws": {
           "version": "6.1.4",
           "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
@@ -8471,14 +9319,62 @@
       }
     },
     "enhanced-resolve": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
-      "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
+      "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
       "dev": true,
       "requires": {
         "graceful-fs": "^4.1.2",
-        "memory-fs": "^0.4.0",
+        "memory-fs": "^0.5.0",
         "tapable": "^1.0.0"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+          "dev": true
+        },
+        "memory-fs": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+          "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+          "dev": true,
+          "requires": {
+            "errno": "^0.1.3",
+            "readable-stream": "^2.0.1"
+          }
+        },
+        "process-nextick-args": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+          "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
       }
     },
     "entities": {
@@ -8614,17 +9510,18 @@
       }
     },
     "enzyme-adapter-react-16": {
-      "version": "1.14.0",
-      "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.14.0.tgz",
-      "integrity": "sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA==",
+      "version": "1.15.1",
+      "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.1.tgz",
+      "integrity": "sha512-yMPxrP3vjJP+4wL/qqfkT6JAIctcwKF+zXO6utlGPgUJT2l4tzrdjMDWGd/Pp1BjHBcljhN24OzNEGRteibJhA==",
       "dev": true,
       "requires": {
-        "enzyme-adapter-utils": "^1.12.0",
+        "enzyme-adapter-utils": "^1.12.1",
+        "enzyme-shallow-equal": "^1.0.0",
         "has": "^1.0.3",
         "object.assign": "^4.1.0",
         "object.values": "^1.1.0",
         "prop-types": "^15.7.2",
-        "react-is": "^16.8.6",
+        "react-is": "^16.10.2",
         "react-test-renderer": "^16.0.0-0",
         "semver": "^5.7.0"
       },
@@ -8639,17 +9536,21 @@
           }
         },
         "es-abstract": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
-          "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
+          "version": "1.15.0",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz",
+          "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==",
           "dev": true,
           "requires": {
             "es-to-primitive": "^1.2.0",
             "function-bind": "^1.1.1",
             "has": "^1.0.3",
+            "has-symbols": "^1.0.0",
             "is-callable": "^1.1.4",
             "is-regex": "^1.0.4",
-            "object-keys": "^1.0.12"
+            "object-inspect": "^1.6.0",
+            "object-keys": "^1.1.1",
+            "string.prototype.trimleft": "^2.1.0",
+            "string.prototype.trimright": "^2.1.0"
           }
         },
         "es-to-primitive": {
@@ -8706,50 +9607,163 @@
           }
         },
         "react-is": {
-          "version": "16.8.6",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
-          "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==",
+          "version": "16.10.2",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz",
+          "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==",
           "dev": true
         },
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         }
       }
     },
     "enzyme-adapter-utils": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz",
-      "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==",
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz",
+      "integrity": "sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g==",
       "dev": true,
       "requires": {
-        "airbnb-prop-types": "^2.13.2",
-        "function.prototype.name": "^1.1.0",
+        "airbnb-prop-types": "^2.15.0",
+        "function.prototype.name": "^1.1.1",
         "object.assign": "^4.1.0",
-        "object.fromentries": "^2.0.0",
+        "object.fromentries": "^2.0.1",
         "prop-types": "^15.7.2",
-        "semver": "^5.6.0"
+        "semver": "^5.7.0"
       },
       "dependencies": {
-        "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
-          "dev": true
-        }
-      }
-    },
-    "eol": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/eol/-/eol-0.8.1.tgz",
-      "integrity": "sha1-3vwyJJkMfspzuzRGGlbPncJHYdA=",
-      "dev": true
-    },
-    "errno": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+        "define-properties": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+          "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+          "dev": true,
+          "requires": {
+            "object-keys": "^1.0.12"
+          }
+        },
+        "es-abstract": {
+          "version": "1.15.0",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz",
+          "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==",
+          "dev": true,
+          "requires": {
+            "es-to-primitive": "^1.2.0",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.0",
+            "is-callable": "^1.1.4",
+            "is-regex": "^1.0.4",
+            "object-inspect": "^1.6.0",
+            "object-keys": "^1.1.1",
+            "string.prototype.trimleft": "^2.1.0",
+            "string.prototype.trimright": "^2.1.0"
+          }
+        },
+        "es-to-primitive": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+          "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+          "dev": true,
+          "requires": {
+            "is-callable": "^1.1.4",
+            "is-date-object": "^1.0.1",
+            "is-symbol": "^1.0.2"
+          }
+        },
+        "function.prototype.name": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz",
+          "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==",
+          "dev": true,
+          "requires": {
+            "define-properties": "^1.1.3",
+            "function-bind": "^1.1.1",
+            "functions-have-names": "^1.1.1",
+            "is-callable": "^1.1.4"
+          }
+        },
+        "has": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+          "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+          "dev": true,
+          "requires": {
+            "function-bind": "^1.1.1"
+          }
+        },
+        "is-callable": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+          "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+          "dev": true
+        },
+        "is-symbol": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+          "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+          "dev": true,
+          "requires": {
+            "has-symbols": "^1.0.0"
+          }
+        },
+        "object-keys": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+          "dev": true
+        },
+        "object.fromentries": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz",
+          "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==",
+          "dev": true,
+          "requires": {
+            "define-properties": "^1.1.3",
+            "es-abstract": "^1.15.0",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
+      }
+    },
+    "enzyme-shallow-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.0.tgz",
+      "integrity": "sha512-VUf+q5o1EIv2ZaloNQQtWCJM9gpeux6vudGVH6vLmfPXFLRuxl5+Aq3U260wof9nn0b0i+P5OEUXm1vnxkRpXQ==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3",
+        "object-is": "^1.0.1"
+      },
+      "dependencies": {
+        "has": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+          "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+          "dev": true,
+          "requires": {
+            "function-bind": "^1.1.1"
+          }
+        }
+      }
+    },
+    "eol": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/eol/-/eol-0.8.1.tgz",
+      "integrity": "sha1-3vwyJJkMfspzuzRGGlbPncJHYdA=",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
       "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
       "dev": true,
       "requires": {
@@ -8766,12 +9780,12 @@
       }
     },
     "error-stack-parser": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.3.tgz",
-      "integrity": "sha512-vRC4rKv87twMZy92X4+TmUdv3iYMsmePbpG/YguHsfzmZ8bYJZYYep7yrXH09yFUaCEPKgNK5X79+Yq7hwLVOA==",
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.4.tgz",
+      "integrity": "sha512-fZ0KkoxSjLFmhW5lHbUT3tLwy3nX1qEzMYo8koY1vrsAco53CMT1djnBSeC/wUjTEZRhZl9iRw7PaMaxfJ4wzQ==",
       "dev": true,
       "requires": {
-        "stackframe": "^1.0.4"
+        "stackframe": "^1.1.0"
       }
     },
     "es-abstract": {
@@ -9003,21 +10017,21 @@
       }
     },
     "eslint-config-prettier": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.3.0.tgz",
-      "integrity": "sha512-EWaGjlDAZRzVFveh2Jsglcere2KK5CJBhkNSa1xs3KfMUGdRiT7lG089eqPdvlzWHpAqaekubOsOMu8W8Yk71A==",
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz",
+      "integrity": "sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ==",
       "dev": true,
       "requires": {
         "get-stdin": "^6.0.0"
       }
     },
     "eslint-config-react-app": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz",
-      "integrity": "sha512-ZsaoXUIGsK8FCi/x4lT2bZR5mMkL/Kgj+Lnw690rbvvUr/uiwgFiD8FcfAhkCycm7Xte6O5lYz4EqMx2vX7jgw==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.0.2.tgz",
+      "integrity": "sha512-VhlESAQM83uULJ9jsvcKxx2Ab0yrmjUt8kDz5DyhTQufqWE0ssAnejlWri5LXv25xoXfdqOyeDPdfJS9dXKagQ==",
       "dev": true,
       "requires": {
-        "confusing-browser-globals": "^1.0.7"
+        "confusing-browser-globals": "^1.0.9"
       }
     },
     "eslint-config-standard": {
@@ -9094,9 +10108,9 @@
       }
     },
     "eslint-plugin-chai-friendly": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.4.1.tgz",
-      "integrity": "sha512-hkpLN7VVoGGsofZjUhcQ+sufC3FgqMJwD0DvAcRfxY1tVRyQyVsqpaKnToPHJQOrRo0FQ0fSEDwW2gr4rsNdGA==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.5.0.tgz",
+      "integrity": "sha512-Pxe6z8C9fP0pn2X2nGFU/b3GBOCM/5FVus1hsMwJsXP3R7RiXFl7g0ksJbsc0GxiLyidTW4mEFk77qsNn7Tk7g==",
       "dev": true
     },
     "eslint-plugin-cypress": {
@@ -9144,9 +10158,9 @@
       }
     },
     "eslint-plugin-graphql": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-3.0.3.tgz",
-      "integrity": "sha512-hHwLyxSkC5rkakJ/SNTWwOswPdVhvfyMCnEOloevrLQIOHUNVIQBg1ljCaRe9C40HdzgcGUFUdG5BHLCKm8tuw==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-3.1.0.tgz",
+      "integrity": "sha512-87HGS00aeBqGFiQZQGzSPzk1D59w+124F8CRIDATh3LJqce5RCTuUI4tcIqPeyY95YPBCIKwISksWUuA0nrgNw==",
       "dev": true,
       "requires": {
         "graphql-config": "^2.0.1",
@@ -9266,14 +10280,14 @@
       }
     },
     "eslint-plugin-jsdoc": {
-      "version": "15.9.4",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-15.9.4.tgz",
-      "integrity": "sha512-TGk5HytRmlBA3BQ4Ya1WPzBWsi56XlFtdxDyQHNTpE5WQGphIJp7VbibWWWydU7N6HCsyhqazSSZQuO7SAJnww==",
+      "version": "17.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-17.1.1.tgz",
+      "integrity": "sha512-astLOTsj87UIzvDyiuAKbkgQgtChutazTDVxdG254tAtcvIVlWnPmlN7/dLnMYld/aHBhB4SWiUalMuKwTaynQ==",
       "dev": true,
       "requires": {
-        "comment-parser": "^0.6.2",
+        "comment-parser": "^0.7.0",
         "debug": "^4.1.1",
-        "jsdoctypeparser": "5.0.1",
+        "jsdoctypeparser": "^5.1.1",
         "lodash": "^4.17.15",
         "object.entries-ponyfill": "^1.0.1",
         "regextras": "^0.6.1"
@@ -9325,9 +10339,9 @@
       }
     },
     "eslint-plugin-mocha": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.1.1.tgz",
-      "integrity": "sha512-p/otruG425jRYDa28HjbBYYXoFNzq3Qp++gn5dbE44Kz4NvmIsSUKSV1T+RLYUcZOcdJKKAftXbaqkHFqReKoA==",
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.2.1.tgz",
+      "integrity": "sha512-o3Ibhpczi5MjUVpnlnrpC/+oJYGoHKB5m4bQdRnaAOeFCN3HRkqBisQ2/h0hEuCR4lPxyHP1Qzyjpna8MsOdlA==",
       "dev": true,
       "requires": {
         "ramda": "^0.26.1"
@@ -9383,20 +10397,20 @@
       "dev": true
     },
     "eslint-plugin-react": {
-      "version": "7.14.3",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz",
-      "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==",
+      "version": "7.16.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz",
+      "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==",
       "dev": true,
       "requires": {
         "array-includes": "^3.0.3",
         "doctrine": "^2.1.0",
         "has": "^1.0.3",
-        "jsx-ast-utils": "^2.1.0",
+        "jsx-ast-utils": "^2.2.1",
         "object.entries": "^1.1.0",
         "object.fromentries": "^2.0.0",
         "object.values": "^1.1.0",
         "prop-types": "^15.7.2",
-        "resolve": "^1.10.1"
+        "resolve": "^1.12.0"
       },
       "dependencies": {
         "define-properties": {
@@ -9418,17 +10432,21 @@
           }
         },
         "es-abstract": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
-          "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
+          "version": "1.15.0",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz",
+          "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==",
           "dev": true,
           "requires": {
             "es-to-primitive": "^1.2.0",
             "function-bind": "^1.1.1",
             "has": "^1.0.3",
+            "has-symbols": "^1.0.0",
             "is-callable": "^1.1.4",
             "is-regex": "^1.0.4",
-            "object-keys": "^1.0.12"
+            "object-inspect": "^1.6.0",
+            "object-keys": "^1.1.1",
+            "string.prototype.trimleft": "^2.1.0",
+            "string.prototype.trimright": "^2.1.0"
           }
         },
         "es-to-primitive": {
@@ -9502,9 +10520,9 @@
       }
     },
     "eslint-plugin-react-hooks": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.0.1.tgz",
-      "integrity": "sha512-xir+3KHKo86AasxlCV8AHRtIZPHljqCRRUYgASkbatmt0fad4+5GgC7zkT7o/06hdKM6MIwp8giHVXqBPaarHQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.2.0.tgz",
+      "integrity": "sha512-jSlnBjV2cmyIeL555H/FbvuSbQ1AtpHjLMHuPrQnt1eVA6lX8yufdygh7AArI2m8ct7ChHGx2uOaCuxq2MUn6g==",
       "dev": true
     },
     "eslint-plugin-sort-class-members": {
@@ -9520,9 +10538,9 @@
       "dev": true
     },
     "eslint-scope": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
-      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
+      "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
       "dev": true,
       "requires": {
         "esrecurse": "^4.1.0",
@@ -9604,9 +10622,9 @@
       "dev": true
     },
     "event-source-polyfill": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.8.tgz",
-      "integrity": "sha512-wC9j5vjH9Xu9s8XhumgBoypdFJswraU1HXykqCCD/b7q+EH4P/avf5fM1e8IiHyHNZOeOiWwrki2775XFTYyeg==",
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.9.tgz",
+      "integrity": "sha512-+x0BMKTYwZcmGmlkHK0GsXkX1+otfEwqu3QitN0wmWuHaZniw3HeIx1k5OjWX3JUHQHlPS4yONol6eokS1ZAWg==",
       "dev": true
     },
     "event-stream": {
@@ -9631,9 +10649,9 @@
       "dev": true
     },
     "eventemitter3": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
-      "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz",
+      "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==",
       "dev": true
     },
     "events": {
@@ -10165,12 +11183,9 @@
       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
     },
     "fast-xml-parser": {
-      "version": "3.12.20",
-      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.12.20.tgz",
-      "integrity": "sha512-viadHdefuuqkyJWUhF2r2Ymb5LJ0T7uQhzSRv4OZzYxpoPQnY05KtaX0pLkolabD7tLzIE8q/OytIAEhqPyYbw==",
-      "requires": {
-        "nimnjs": "^1.3.2"
-      }
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.14.0.tgz",
+      "integrity": "sha512-3SzQnPNtMVqaBVDzYqYt0BTaaLwkd45wTbsUsH1eiE9dnyc4b8mYcm1Q0Rcx9AWkeTj5UZFTTm55Io5yVWS1tg=="
     },
     "fastparse": {
       "version": "1.1.2",
@@ -10622,12 +11637,21 @@
       }
     },
     "framesync": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/framesync/-/framesync-4.0.2.tgz",
-      "integrity": "sha512-hQLD5NURHmzB4Symo6JJ5HDw2TWwhr6T3gw9aChNMsZvkxcD8U8Gcz/hllAOOMGE+HO3ScpRPahpXDQRgF19JQ==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/framesync/-/framesync-4.0.4.tgz",
+      "integrity": "sha512-mdP0WvVHe0/qA62KG2LFUAOiWLng5GLpscRlwzBxu2VXOp6B8hNs5C5XlFigsMgrfDrr2YbqTsgdWZTc4RXRMQ==",
       "dev": true,
       "requires": {
-        "hey-listen": "^1.0.5"
+        "hey-listen": "^1.0.8",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
+          "dev": true
+        }
       }
     },
     "fresh": {
@@ -11318,65 +12342,72 @@
       "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
       "dev": true
     },
+    "functions-have-names": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.1.1.tgz",
+      "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==",
+      "dev": true
+    },
     "gatsby": {
-      "version": "2.15.15",
-      "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.15.15.tgz",
-      "integrity": "sha512-mOZJSBoVYd6ObEIB0sHje6BeMd7OQeGAw2XtJCPfetolkwWqYN+fUpYdVlYz5cbztuWmXIQoU6jhrxqsJu/InA==",
+      "version": "2.17.10",
+      "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.17.10.tgz",
+      "integrity": "sha512-xrKfc67UIMAkVtJj4fS3MK0KUiLvkOfuTZBp6GRXVxMZXuREem3uFnnYD//n+vGHSlYk6c0R1NJ9+2lJClTG2Q==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.5.5",
-        "@babel/core": "^7.6.0",
-        "@babel/parser": "^7.5.5",
+        "@babel/core": "^7.6.4",
+        "@babel/parser": "^7.6.4",
         "@babel/polyfill": "^7.6.0",
-        "@babel/runtime": "^7.6.0",
-        "@babel/traverse": "^7.6.0",
+        "@babel/runtime": "^7.6.3",
+        "@babel/traverse": "^7.6.3",
         "@gatsbyjs/relay-compiler": "2.0.0-printer-fix.4",
         "@hapi/joi": "^15.1.1",
         "@mikaelkristiansson/domready": "^1.0.9",
         "@pieh/friendly-errors-webpack-plugin": "1.7.0-chalk-2",
         "@reach/router": "^1.2.1",
-        "@typescript-eslint/eslint-plugin": "^1.13.0",
-        "@typescript-eslint/parser": "^1.13.0",
+        "@typescript-eslint/eslint-plugin": "^2.6.0",
+        "@typescript-eslint/parser": "^2.6.0",
         "address": "1.1.2",
-        "autoprefixer": "^9.6.1",
+        "array.prototype.flatmap": "^1.2.2",
+        "autoprefixer": "^9.7.0",
         "axios": "^0.19.0",
         "babel-core": "7.0.0-bridge.0",
         "babel-eslint": "^10.0.3",
         "babel-loader": "^8.0.6",
         "babel-plugin-add-module-exports": "^0.3.3",
         "babel-plugin-dynamic-import-node": "^1.2.0",
-        "babel-plugin-remove-graphql-queries": "^2.7.7",
-        "babel-preset-gatsby": "^0.2.13",
+        "babel-plugin-remove-graphql-queries": "^2.7.14",
+        "babel-preset-gatsby": "^0.2.20",
         "better-opn": "1.0.0",
         "better-queue": "^3.8.10",
-        "bluebird": "^3.5.5",
+        "bluebird": "^3.7.1",
         "browserslist": "3.2.8",
         "cache-manager": "^2.10.0",
         "cache-manager-fs-hash": "^0.0.7",
         "chalk": "^2.4.2",
-        "chokidar": "3.0.2",
+        "chokidar": "3.2.3",
         "common-tags": "^1.8.0",
         "compression": "^1.7.4",
         "convert-hrtime": "^2.0.0",
         "copyfiles": "^1.2.0",
-        "core-js": "^2.6.9",
+        "core-js": "^2.6.10",
         "cors": "^2.8.5",
         "css-loader": "^1.0.1",
         "debug": "^3.2.6",
         "del": "^5.1.0",
         "detect-port": "^1.3.0",
         "devcert-san": "^0.3.3",
-        "dotenv": "^8.1.0",
-        "eslint": "^5.16.0",
-        "eslint-config-react-app": "^4.0.1",
+        "dotenv": "^8.2.0",
+        "eslint": "^6.6.0",
+        "eslint-config-react-app": "^5.0.2",
         "eslint-loader": "^2.2.1",
         "eslint-plugin-flowtype": "^3.13.0",
-        "eslint-plugin-graphql": "^3.0.3",
+        "eslint-plugin-graphql": "^3.1.0",
         "eslint-plugin-import": "^2.18.2",
         "eslint-plugin-jsx-a11y": "^6.2.3",
-        "eslint-plugin-react": "^7.14.3",
+        "eslint-plugin-react": "^7.16.0",
         "eslint-plugin-react-hooks": "^1.7.0",
-        "event-source-polyfill": "^1.0.8",
+        "event-source-polyfill": "^1.0.9",
         "express": "^4.17.1",
         "express-graphql": "^0.9.0",
         "fast-levenshtein": "^2.0.6",
@@ -11384,33 +12415,33 @@
         "flat": "^4.1.0",
         "fs-exists-cached": "1.0.0",
         "fs-extra": "^8.1.0",
-        "gatsby-cli": "^2.7.47",
-        "gatsby-core-utils": "^1.0.8",
-        "gatsby-graphiql-explorer": "^0.2.15",
-        "gatsby-link": "^2.2.13",
-        "gatsby-plugin-page-creator": "^2.1.17",
-        "gatsby-react-router-scroll": "^2.1.8",
-        "gatsby-telemetry": "^1.1.23",
-        "glob": "^7.1.4",
+        "gatsby-cli": "^2.8.8",
+        "gatsby-core-utils": "^1.0.17",
+        "gatsby-graphiql-explorer": "^0.2.26",
+        "gatsby-link": "^2.2.22",
+        "gatsby-plugin-page-creator": "^2.1.28",
+        "gatsby-react-router-scroll": "^2.1.14",
+        "gatsby-telemetry": "^1.1.35",
+        "glob": "^7.1.5",
         "got": "8.3.2",
-        "graphql": "^14.5.4",
-        "graphql-compose": "^6.3.5",
+        "graphql": "^14.5.8",
+        "graphql-compose": "^6.3.7",
         "graphql-playground-middleware-express": "^1.7.12",
         "invariant": "^2.2.4",
         "is-relative": "^1.0.0",
         "is-relative-url": "^3.0.0",
-        "is-wsl": "^2.1.0",
+        "is-wsl": "^2.1.1",
         "jest-worker": "^24.9.0",
         "json-loader": "^0.5.7",
         "json-stringify-safe": "^5.0.1",
         "lodash": "^4.17.15",
-        "lokijs": "^1.5.7",
+        "lokijs": "^1.5.8",
         "md5": "^2.2.1",
         "md5-file": "^3.2.3",
         "micromatch": "^3.1.10",
         "mime": "^2.4.4",
         "mini-css-extract-plugin": "^0.8.0",
-        "mitt": "^1.1.3",
+        "mitt": "^1.2.0",
         "mkdirp": "^0.5.1",
         "moment": "^2.24.0",
         "name-all-modules-plugin": "^1.0.1",
@@ -11428,7 +12459,7 @@
         "raw-loader": "^0.5.1",
         "react-dev-utils": "^4.2.3",
         "react-error-overlay": "^3.0.0",
-        "react-hot-loader": "^4.12.13",
+        "react-hot-loader": "^4.12.15",
         "redux": "^4.0.4",
         "redux-thunk": "^2.3.0",
         "semver": "^5.7.1",
@@ -11436,7 +12467,7 @@
         "sift": "^5.1.0",
         "signal-exit": "^3.0.2",
         "slash": "^3.0.0",
-        "socket.io": "^2.2.0",
+        "socket.io": "^2.3.0",
         "stack-trace": "^0.0.10",
         "string-similarity": "^1.2.2",
         "style-loader": "^0.23.1",
@@ -11447,9 +12478,9 @@
         "util.promisify": "^1.0.0",
         "uuid": "^3.3.3",
         "v8-compile-cache": "^1.1.2",
-        "webpack": "~4.40.1",
-        "webpack-dev-middleware": "^3.7.1",
-        "webpack-dev-server": "^3.8.0",
+        "webpack": "~4.41.2",
+        "webpack-dev-middleware": "^3.7.2",
+        "webpack-dev-server": "^3.9.0",
         "webpack-hot-middleware": "^2.25.0",
         "webpack-merge": "^4.2.2",
         "webpack-stats-plugin": "^0.3.0",
@@ -11467,45 +12498,84 @@
           }
         },
         "@babel/generator": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz",
-          "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz",
+          "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.6.0",
+            "@babel/types": "^7.7.2",
             "jsesc": "^2.5.1",
             "lodash": "^4.17.13",
-            "source-map": "^0.5.0",
-            "trim-right": "^1.0.1"
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz",
+          "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.7.0",
+            "@babel/template": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz",
+          "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/helper-split-export-declaration": {
-          "version": "7.4.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-          "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz",
+          "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==",
           "dev": true,
           "requires": {
-            "@babel/types": "^7.4.4"
+            "@babel/types": "^7.7.0"
           }
         },
         "@babel/parser": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz",
-          "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz",
+          "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==",
           "dev": true
         },
+        "@babel/runtime": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz",
+          "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==",
+          "dev": true,
+          "requires": {
+            "regenerator-runtime": "^0.13.2"
+          }
+        },
+        "@babel/template": {
+          "version": "7.7.0",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz",
+          "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.7.0",
+            "@babel/types": "^7.7.0"
+          }
+        },
         "@babel/traverse": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz",
-          "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz",
+          "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.5.5",
-            "@babel/generator": "^7.6.0",
-            "@babel/helper-function-name": "^7.1.0",
-            "@babel/helper-split-export-declaration": "^7.4.4",
-            "@babel/parser": "^7.6.0",
-            "@babel/types": "^7.6.0",
+            "@babel/generator": "^7.7.2",
+            "@babel/helper-function-name": "^7.7.0",
+            "@babel/helper-split-export-declaration": "^7.7.0",
+            "@babel/parser": "^7.7.2",
+            "@babel/types": "^7.7.2",
             "debug": "^4.1.0",
             "globals": "^11.1.0",
             "lodash": "^4.17.13"
@@ -11523,9 +12593,9 @@
           }
         },
         "@babel/types": {
-          "version": "7.6.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-          "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz",
+          "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2",
@@ -11551,6 +12621,94 @@
           "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
           "dev": true
         },
+        "@typescript-eslint/eslint-plugin": {
+          "version": "2.6.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.6.1.tgz",
+          "integrity": "sha512-Z0rddsGqioKbvqfohg7BwkFC3PuNLsB+GE9QkFza7tiDzuHoy0y823Y+oGNDzxNZrYyLjqkZtCTl4vCqOmEN4g==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/experimental-utils": "2.6.1",
+            "eslint-utils": "^1.4.2",
+            "functional-red-black-tree": "^1.0.1",
+            "regexpp": "^2.0.1",
+            "tsutils": "^3.17.1"
+          }
+        },
+        "@typescript-eslint/experimental-utils": {
+          "version": "2.6.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.6.1.tgz",
+          "integrity": "sha512-EVrrUhl5yBt7fC7c62lWmriq4MIc49zpN3JmrKqfiFXPXCM5ErfEcZYfKOhZXkW6MBjFcJ5kGZqu1b+lyyExUw==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.3",
+            "@typescript-eslint/typescript-estree": "2.6.1",
+            "eslint-scope": "^5.0.0"
+          }
+        },
+        "@typescript-eslint/parser": {
+          "version": "2.6.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.6.1.tgz",
+          "integrity": "sha512-PDPkUkZ4c7yA+FWqigjwf3ngPUgoLaGjMlFh6TRtbjhqxFBnkElDfckSjm98q9cMr4xRzZ15VrS/xKm6QHYf0w==",
+          "dev": true,
+          "requires": {
+            "@types/eslint-visitor-keys": "^1.0.0",
+            "@typescript-eslint/experimental-utils": "2.6.1",
+            "@typescript-eslint/typescript-estree": "2.6.1",
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "2.6.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.6.1.tgz",
+          "integrity": "sha512-+sTnssW6bcbDZKE8Ce7VV6LdzkQz2Bxk7jzk1J8H1rovoTxnm6iXvYIyncvNsaB/kBCOM63j/LNJfm27bNdUoA==",
+          "dev": true,
+          "requires": {
+            "debug": "^4.1.1",
+            "glob": "^7.1.4",
+            "is-glob": "^4.0.1",
+            "lodash.unescape": "4.0.1",
+            "semver": "^6.3.0",
+            "tsutils": "^3.17.1"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "4.1.1",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+              "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+              "dev": true,
+              "requires": {
+                "ms": "^2.1.1"
+              }
+            },
+            "semver": {
+              "version": "6.3.0",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+              "dev": true
+            }
+          }
+        },
+        "acorn": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
+          "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
+          "dev": true
+        },
+        "acorn-jsx": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz",
+          "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==",
+          "dev": true
+        },
+        "ansi-escapes": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
+          "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.5.2"
+          }
+        },
         "ansi-regex": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
@@ -11586,11 +12744,14 @@
             }
           }
         },
-        "ci-info": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-          "dev": true
+        "cli-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+          "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^3.1.0"
+          }
         },
         "configstore": {
           "version": "5.0.0",
@@ -11607,9 +12768,9 @@
           }
         },
         "core-js": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
-          "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==",
+          "version": "2.6.10",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz",
+          "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==",
           "dev": true
         },
         "cross-spawn": {
@@ -11646,28 +12807,143 @@
           "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
           "dev": true
         },
+        "doctrine": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+          "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
         "dot-prop": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.0.tgz",
-          "integrity": "sha512-n1oC6NBF+KM9oVXtjmen4Yo7HyAVWV2UUl50dCYJdw2924K6dX9bf9TTTWaKtYlRn0FEtxG27KS80ayVLixxJA==",
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
           "dev": true,
           "requires": {
             "is-obj": "^2.0.0"
           }
         },
-        "eslint-plugin-react-hooks": {
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+          "dev": true
+        },
+        "eslint": {
+          "version": "6.6.0",
+          "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz",
+          "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "ajv": "^6.10.0",
+            "chalk": "^2.1.0",
+            "cross-spawn": "^6.0.5",
+            "debug": "^4.0.1",
+            "doctrine": "^3.0.0",
+            "eslint-scope": "^5.0.0",
+            "eslint-utils": "^1.4.3",
+            "eslint-visitor-keys": "^1.1.0",
+            "espree": "^6.1.2",
+            "esquery": "^1.0.1",
+            "esutils": "^2.0.2",
+            "file-entry-cache": "^5.0.1",
+            "functional-red-black-tree": "^1.0.1",
+            "glob-parent": "^5.0.0",
+            "globals": "^11.7.0",
+            "ignore": "^4.0.6",
+            "import-fresh": "^3.0.0",
+            "imurmurhash": "^0.1.4",
+            "inquirer": "^7.0.0",
+            "is-glob": "^4.0.0",
+            "js-yaml": "^3.13.1",
+            "json-stable-stringify-without-jsonify": "^1.0.1",
+            "levn": "^0.3.0",
+            "lodash": "^4.17.14",
+            "minimatch": "^3.0.4",
+            "mkdirp": "^0.5.1",
+            "natural-compare": "^1.4.0",
+            "optionator": "^0.8.2",
+            "progress": "^2.0.0",
+            "regexpp": "^2.0.1",
+            "semver": "^6.1.2",
+            "strip-ansi": "^5.2.0",
+            "strip-json-comments": "^3.0.1",
+            "table": "^5.2.3",
+            "text-table": "^0.2.0",
+            "v8-compile-cache": "^2.0.3"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "4.1.1",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+              "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+              "dev": true,
+              "requires": {
+                "ms": "^2.1.1"
+              }
+            },
+            "eslint-utils": {
+              "version": "1.4.3",
+              "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+              "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+              "dev": true,
+              "requires": {
+                "eslint-visitor-keys": "^1.1.0"
+              }
+            },
+            "semver": {
+              "version": "6.3.0",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+              "dev": true
+            },
+            "v8-compile-cache": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
+              "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
+              "dev": true
+            }
+          }
+        },
+        "eslint-plugin-react-hooks": {
           "version": "1.7.0",
           "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
           "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==",
           "dev": true
         },
+        "eslint-visitor-keys": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
+          "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+          "dev": true
+        },
+        "espree": {
+          "version": "6.1.2",
+          "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz",
+          "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==",
+          "dev": true,
+          "requires": {
+            "acorn": "^7.1.0",
+            "acorn-jsx": "^5.1.0",
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
         "execa": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz",
-          "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==",
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
+          "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
           "dev": true,
           "requires": {
-            "cross-spawn": "^6.0.5",
+            "cross-spawn": "^7.0.0",
             "get-stream": "^5.0.0",
             "is-stream": "^2.0.0",
             "merge-stream": "^2.0.0",
@@ -11676,6 +12952,52 @@
             "p-finally": "^2.0.0",
             "signal-exit": "^3.0.2",
             "strip-final-newline": "^2.0.0"
+          },
+          "dependencies": {
+            "cross-spawn": {
+              "version": "7.0.1",
+              "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
+              "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+              "dev": true,
+              "requires": {
+                "path-key": "^3.1.0",
+                "shebang-command": "^2.0.0",
+                "which": "^2.0.1"
+              }
+            },
+            "path-key": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
+              "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
+              "dev": true
+            },
+            "shebang-command": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+              "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+              "dev": true,
+              "requires": {
+                "shebang-regex": "^3.0.0"
+              }
+            },
+            "which": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
+              "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
+              "dev": true,
+              "requires": {
+                "isexe": "^2.0.0"
+              }
+            }
+          }
+        },
+        "figures": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz",
+          "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
           }
         },
         "find-up": {
@@ -11699,30 +13021,30 @@
           }
         },
         "gatsby-cli": {
-          "version": "2.7.47",
-          "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.7.47.tgz",
-          "integrity": "sha512-dDVrbTjxzUwugOnnI/MDFZruYie5KW+t+XmLrG2L4ZjKBrAT6G2wsiPS+NwHiConqfTx67xoFAp54++C8+iWXg==",
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.8.8.tgz",
+          "integrity": "sha512-j8xhEA3G0msqBY5Iu1ddZkBybV+gwiLEVOtO1GwSwv4moJunWkTjWW9tn9sVKOpQdRnEZ11z5ducVY/kBJRENA==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.5.5",
-            "@babel/runtime": "^7.6.0",
+            "@babel/runtime": "^7.6.3",
             "@hapi/joi": "^15.1.1",
             "better-opn": "^0.1.4",
-            "bluebird": "^3.5.5",
+            "bluebird": "^3.7.1",
             "chalk": "^2.4.2",
-            "ci-info": "^2.0.0",
             "clipboardy": "^2.1.0",
             "common-tags": "^1.8.0",
             "configstore": "^5.0.0",
             "convert-hrtime": "^2.0.0",
-            "core-js": "^2.6.9",
+            "core-js": "^2.6.10",
             "envinfo": "^5.12.1",
-            "execa": "^2.0.4",
+            "execa": "^2.1.0",
             "fs-exists-cached": "^1.0.0",
             "fs-extra": "^8.1.0",
-            "gatsby-telemetry": "^1.1.23",
-            "hosted-git-info": "^3.0.0",
-            "ink": "^2.3.0",
+            "gatsby-core-utils": "^1.0.17",
+            "gatsby-telemetry": "^1.1.35",
+            "hosted-git-info": "^3.0.2",
+            "ink": "^2.5.0",
             "ink-spinner": "^3.0.1",
             "is-valid-path": "^0.1.1",
             "lodash": "^4.17.15",
@@ -11733,16 +13055,18 @@
             "pretty-error": "^2.1.1",
             "progress": "^2.0.3",
             "prompts": "^2.2.1",
-            "react": "^16.9.0",
+            "react": "^16.11.0",
+            "redux": "^4.0.4",
             "resolve-cwd": "^2.0.0",
             "semver": "^6.3.0",
+            "signal-exit": "^3.0.2",
             "source-map": "0.7.3",
             "stack-trace": "^0.0.10",
             "strip-ansi": "^5.2.0",
             "update-notifier": "^2.5.0",
             "uuid": "3.3.3",
             "yargs": "^12.0.5",
-            "yurnalist": "^1.0.5"
+            "yurnalist": "^1.1.1"
           },
           "dependencies": {
             "better-opn": {
@@ -11777,6 +13101,15 @@
             "pump": "^3.0.0"
           }
         },
+        "glob-parent": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
+          "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
         "got": {
           "version": "8.3.2",
           "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
@@ -11811,15 +13144,15 @@
           }
         },
         "graceful-fs": {
-          "version": "4.2.2",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
-          "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+          "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
           "dev": true
         },
         "hosted-git-info": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.0.tgz",
-          "integrity": "sha512-zYSx1cP4MLsvKtTg8DF/PI6e6FHZ3wcawcTGsrLU2TM+UfD4jmSrn2wdQT16TFbH3lO4PIdjLG0E+cuYDgFD9g==",
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.2.tgz",
+          "integrity": "sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw==",
           "dev": true,
           "requires": {
             "lru-cache": "^5.1.1"
@@ -11831,6 +13164,37 @@
           "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
           "dev": true
         },
+        "import-fresh": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
+          "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==",
+          "dev": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "inquirer": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz",
+          "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^4.2.1",
+            "chalk": "^2.4.2",
+            "cli-cursor": "^3.1.0",
+            "cli-width": "^2.0.0",
+            "external-editor": "^3.0.3",
+            "figures": "^3.0.0",
+            "lodash": "^4.17.15",
+            "mute-stream": "0.0.8",
+            "run-async": "^2.2.0",
+            "rxjs": "^6.4.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^5.1.0",
+            "through": "^2.3.6"
+          }
+        },
         "invariant": {
           "version": "2.2.4",
           "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -11846,6 +13210,21 @@
           "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
           "dev": true
         },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+          "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
         "is-obj": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
@@ -11859,9 +13238,9 @@
           "dev": true
         },
         "is-wsl": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.0.tgz",
-          "integrity": "sha512-pFTjpv/x5HRj8kbZ/Msxi9VrvtOMRBqaDi3OIcbwPI3OuH+r3lLxVWukLITBaOGJIbA/w2+M1eVmVa4XNQlAmQ==",
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz",
+          "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==",
           "dev": true
         },
         "keyv": {
@@ -11947,10 +13326,10 @@
           "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
           "dev": true
         },
-        "node-fetch": {
-          "version": "2.6.0",
-          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
-          "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==",
+        "mute-stream": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+          "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
           "dev": true
         },
         "normalize-url": {
@@ -12101,18 +13480,51 @@
           "integrity": "sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw==",
           "dev": true
         },
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
+          "dev": true
+        },
+        "restore-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+          "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+          "dev": true,
+          "requires": {
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
         "semver": {
           "version": "5.7.1",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
         "strict-uri-encode": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
           "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
           "dev": true
         },
+        "string-width": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz",
+          "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^5.2.0"
+          }
+        },
         "strip-ansi": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -12122,6 +13534,27 @@
             "ansi-regex": "^4.1.0"
           }
         },
+        "strip-json-comments": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
+          "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
+          "dev": true
+        },
+        "tsutils": {
+          "version": "3.17.1",
+          "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
+          "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.8.1"
+          }
+        },
+        "type-fest": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
+          "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==",
+          "dev": true
+        },
         "unique-string": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
@@ -12132,9 +13565,9 @@
           }
         },
         "write-file-atomic": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz",
-          "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==",
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz",
+          "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==",
           "dev": true,
           "requires": {
             "imurmurhash": "^0.1.4",
@@ -12150,9 +13583,9 @@
           "dev": true
         },
         "yallist": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
-          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
           "dev": true
         },
         "yargs": {
@@ -12173,6 +13606,39 @@
             "which-module": "^2.0.0",
             "y18n": "^3.2.1 || ^4.0.0",
             "yargs-parser": "^11.1.1"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+              "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+              "dev": true
+            },
+            "is-fullwidth-code-point": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+              "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+              "dev": true
+            },
+            "string-width": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+              "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+              "dev": true,
+              "requires": {
+                "is-fullwidth-code-point": "^2.0.0",
+                "strip-ansi": "^4.0.0"
+              }
+            },
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^3.0.0"
+              }
+            }
           }
         },
         "yargs-parser": {
@@ -12188,192 +13654,123 @@
       }
     },
     "gatsby-core-utils": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.0.8.tgz",
-      "integrity": "sha512-080Jl8NamTbCGliKxXpMjEO1XUYU5FAow+VPR/j6hJk+Kl/gFmpE1mqa5QnHRGLZQhBP/h2T0mUwnSJn9m/Jsw==",
-      "dev": true
+      "version": "1.0.17",
+      "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.0.17.tgz",
+      "integrity": "sha512-5LOderWqZFGaTwwLgqDgad/5Hbf/WFD44ZmodqSJLYUOG8K0wv4PctlQ2/1UO+LZuKYanthYi3jAVgk4OooeSQ==",
+      "dev": true,
+      "requires": {
+        "ci-info": "2.0.0"
+      },
+      "dependencies": {
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+          "dev": true
+        }
+      }
     },
     "gatsby-graphiql-explorer": {
-      "version": "0.2.15",
-      "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.2.15.tgz",
-      "integrity": "sha512-T4N+q8VDbivREBDRKLoxlersaYhWhEaTBKBLT0rWAd8PfPiFQPno8JIaqFTB1DLgsL421wJo9JSsLy1xPx79yA==",
+      "version": "0.2.26",
+      "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.2.26.tgz",
+      "integrity": "sha512-gcA7SPpI7jdz4yl8Kvzfg9TZ7Sp5UHt/P+beSdey76NRBpGeywMItyptpF2fSGiOkKngVrjJOUCsb6EfLSiEcA==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.0"
+        "@babel/runtime": "^7.6.3"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz",
+          "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==",
+          "dev": true,
+          "requires": {
+            "regenerator-runtime": "^0.13.2"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
+          "dev": true
+        }
       }
     },
     "gatsby-link": {
-      "version": "2.2.13",
-      "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.2.13.tgz",
-      "integrity": "sha512-CghQ+hM5JQONNuQ5tQ383z9B9ngDPr79I1lLhZ8j8IPOfna4VQsdVYYtS/wHkdiuF2Ji8ZADP1YJcUEEAEfhew==",
+      "version": "2.2.22",
+      "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.2.22.tgz",
+      "integrity": "sha512-Cv73tFFFQ98grOhhBhI07bsd/w4g/RklLJmaqBucSU8v7MQ9EQorvOX0snly2dQurbNNSfU2XkNNPFrRBGNb0g==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.0",
-        "@types/reach__router": "^1.2.4",
+        "@babel/runtime": "^7.6.3",
+        "@types/reach__router": "^1.2.6",
         "prop-types": "^15.7.2"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz",
+          "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==",
+          "dev": true,
+          "requires": {
+            "regenerator-runtime": "^0.13.2"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
+          "dev": true
+        }
       }
     },
     "gatsby-page-utils": {
-      "version": "0.0.23",
-      "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.0.23.tgz",
-      "integrity": "sha512-CC1EObDssmTE3MBqrMmiaWIOykiSX32D8196KiGfShIpQ62c15kKEBWFG0C+d4xCt9piR3j9N5VBn8LOHZ18VA==",
+      "version": "0.0.28",
+      "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.0.28.tgz",
+      "integrity": "sha512-Jk597HFWBWDStgs2Znj09uwXpVsNHi+UwCt+g+qsghXGieiWHR0Cs4shH32p/D2AS9KmCvSuJrNqAL1VamZAZw==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.2",
-        "bluebird": "^3.5.5",
-        "chokidar": "3.1.1",
+        "@babel/runtime": "^7.6.3",
+        "bluebird": "^3.7.1",
+        "chokidar": "3.2.3",
         "fs-exists-cached": "^1.0.0",
-        "glob": "^7.1.4",
+        "glob": "^7.1.5",
         "lodash": "^4.17.15",
         "micromatch": "^3.1.10",
         "slash": "^3.0.0"
       },
       "dependencies": {
         "@babel/runtime": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz",
-          "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==",
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
           "dev": true,
           "requires": {
             "regenerator-runtime": "^0.13.2"
           }
         },
-        "anymatch": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz",
-          "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==",
-          "dev": true,
-          "requires": {
-            "normalize-path": "^3.0.0",
-            "picomatch": "^2.0.4"
-          }
-        },
-        "binary-extensions": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
-          "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
-          "dev": true
-        },
-        "braces": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-          "dev": true,
-          "requires": {
-            "fill-range": "^7.0.1"
-          }
-        },
-        "chokidar": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.1.1.tgz",
-          "integrity": "sha512-df4o16uZmMHzVQwECZRHwfguOt5ixpuQVaZHjYMvYisgKhE+JXwcj/Tcr3+3bu/XeOJQ9ycYmzu7Mv8XrGxJDQ==",
-          "dev": true,
-          "requires": {
-            "anymatch": "^3.1.0",
-            "braces": "^3.0.2",
-            "fsevents": "^2.0.6",
-            "glob-parent": "^5.0.0",
-            "is-binary-path": "^2.1.0",
-            "is-glob": "^4.0.1",
-            "normalize-path": "^3.0.0",
-            "readdirp": "^3.1.1"
-          }
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-          "dev": true,
-          "requires": {
-            "to-regex-range": "^5.0.1"
-          }
-        },
-        "fsevents": {
-          "version": "2.0.7",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz",
-          "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==",
-          "dev": true,
-          "optional": true
-        },
-        "glob-parent": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
-          "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "is-binary-path": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^2.0.0"
-          }
-        },
-        "is-glob": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-          "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.1"
-          }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
-        },
-        "readdirp": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz",
-          "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==",
-          "dev": true,
-          "requires": {
-            "picomatch": "^2.0.4"
-          }
-        },
         "regenerator-runtime": {
           "version": "0.13.3",
           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
           "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
           "dev": true
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-          "dev": true,
-          "requires": {
-            "is-number": "^7.0.0"
-          }
         }
       }
     },
     "gatsby-plugin-catch-links": {
-      "version": "2.1.12",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-2.1.12.tgz",
-      "integrity": "sha512-42BGcWaYNJ1fL702A2HZNsQyFL2+0FBdiJkBbizZyWRqhlo3+/YlcIqUCILICrrsCipyGdaR9RLnIlalBczRdg==",
+      "version": "2.1.15",
+      "resolved": "https://registry.npmjs.org/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-2.1.15.tgz",
+      "integrity": "sha512-lQXmRYtaO6BN0QUOqcGD2Zt6bsfJxJ6xANdJCyVebF7DNKJuMyyHN6Y+w/7IIKormwXOUxWSM3BnfbHCgumWYQ==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.2",
+        "@babel/runtime": "^7.6.3",
         "escape-string-regexp": "^1.0.5"
       },
       "dependencies": {
         "@babel/runtime": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz",
-          "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==",
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
           "dev": true,
           "requires": {
             "regenerator-runtime": "^0.13.2"
@@ -12394,24 +13791,24 @@
       }
     },
     "gatsby-plugin-page-creator": {
-      "version": "2.1.23",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.1.23.tgz",
-      "integrity": "sha512-2DAouJ4HW4kUD4pTtduGyGvbuN3123if5UTVU6zP1G0XxwtgTd0HRZnFSyYjhO7sB/W+eHYWV/KVDPgD+3Rkdg==",
+      "version": "2.1.28",
+      "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.1.28.tgz",
+      "integrity": "sha512-EAKppjDIOvSHWnozQZq93KRXHZdDFH4hAunlrVWexGD1rxmV328506dk/LnU1EZr1FZMjPcnx4bfh3j2mVB3bw==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.2",
-        "bluebird": "^3.5.5",
+        "@babel/runtime": "^7.6.3",
+        "bluebird": "^3.7.1",
         "fs-exists-cached": "^1.0.0",
-        "gatsby-page-utils": "^0.0.23",
-        "glob": "^7.1.4",
+        "gatsby-page-utils": "^0.0.28",
+        "glob": "^7.1.5",
         "lodash": "^4.17.15",
         "micromatch": "^3.1.10"
       },
       "dependencies": {
         "@babel/runtime": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz",
-          "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==",
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
           "dev": true,
           "requires": {
             "regenerator-runtime": "^0.13.2"
@@ -12426,18 +13823,18 @@
       }
     },
     "gatsby-plugin-react-helmet": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.1.10.tgz",
-      "integrity": "sha512-xv3FlZGDPscXkm0jwZJvcwe50T4EcU7t8TnCsf7FC7YBzfil7FQ2k5YUB8LaG4DNEM5Vl35WKS5ad/5eSkmGIA==",
+      "version": "3.1.13",
+      "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.1.13.tgz",
+      "integrity": "sha512-O3Fvxm76t58RPVUz0Fo2tbXeJnXV6vmlLnKBPMz+smr0Mtx8vnGP1Pi6DuWdRepJsnVespNNth/L8n7iucQCYQ==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.2"
+        "@babel/runtime": "^7.6.3"
       },
       "dependencies": {
         "@babel/runtime": {
-          "version": "7.6.2",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz",
-          "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==",
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
           "dev": true,
           "requires": {
             "regenerator-runtime": "^0.13.2"
@@ -12452,67 +13849,133 @@
       }
     },
     "gatsby-plugin-remove-trailing-slashes": {
-      "version": "2.1.7",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-remove-trailing-slashes/-/gatsby-plugin-remove-trailing-slashes-2.1.7.tgz",
-      "integrity": "sha512-8oPAnQoVxPkNe3zIaCD6QoSGCe7PNswa2NEOmrTaKdpvKphpgf/JSGHPIWh4ZYqqpAfUydc9o854ndPTDck83g==",
+      "version": "2.1.12",
+      "resolved": "https://registry.npmjs.org/gatsby-plugin-remove-trailing-slashes/-/gatsby-plugin-remove-trailing-slashes-2.1.12.tgz",
+      "integrity": "sha512-9xhOMjzVWTxuA3JLJ/+VNgtgCXHJHgrcUC/lzrfPFr+AciDN6bUup2IesH47DBum/3zXhrJ8MzzfLAExaKqf8A==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.0"
+        "@babel/runtime": "^7.6.3"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+          "dev": true,
+          "requires": {
+            "regenerator-runtime": "^0.13.2"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
+          "dev": true
+        }
       }
     },
     "gatsby-plugin-styled-components": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-3.1.6.tgz",
-      "integrity": "sha512-JAvOGuF9y9L3jmTjn9s5YDuAtmdVENH8s2awXdgDN3dnoSa4DM8f7jKn7Sb2p+vw5cHqr7ZRC2izAs6iwvd6bw==",
+      "version": "3.1.11",
+      "resolved": "https://registry.npmjs.org/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-3.1.11.tgz",
+      "integrity": "sha512-10RgU3FcXNctDfFHpiAKQOmYBZlbeZSOfG1mqjWjz/BmYqkLoIaQfTwEMmBpH40DGf72pG2PUOGoDVDrikPKOA==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.0"
+        "@babel/runtime": "^7.6.3"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+          "dev": true,
+          "requires": {
+            "regenerator-runtime": "^0.13.2"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
+          "dev": true
+        }
       }
     },
     "gatsby-plugin-typescript": {
-      "version": "2.1.9",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.1.9.tgz",
-      "integrity": "sha512-g++yoSbMb/4WHdu8Z1Uh4e9qDXWdb1g5xfc63qzabGjRgoNVP5gG3azhUe4Az2E4RGTyW1S6c8flB20+64Lijg==",
+      "version": "2.1.15",
+      "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.1.15.tgz",
+      "integrity": "sha512-jwN2nkUxVM0y96ha6sR8jsZBJak5dR7SsA7UBSvpiUPJgN6dRtDpYlu+CLYzLOBdyxTr9Uo0LDfeCMDGZ63NNg==",
       "dev": true,
       "requires": {
         "@babel/preset-typescript": "^7.6.0",
-        "@babel/runtime": "^7.6.0",
-        "babel-plugin-remove-graphql-queries": "^2.7.8"
+        "@babel/runtime": "^7.6.3",
+        "babel-plugin-remove-graphql-queries": "^2.7.14"
       },
       "dependencies": {
+        "@babel/runtime": {
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+          "dev": true,
+          "requires": {
+            "regenerator-runtime": "^0.13.2"
+          }
+        },
         "babel-plugin-remove-graphql-queries": {
-          "version": "2.7.8",
-          "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.8.tgz",
-          "integrity": "sha512-uMEVCaeDQbQBJBev8cMGHInJRGu/oMPdVbIK5sqRXpAgtdfo1WGriyb7OtIKDycSlvHx95l2NjOtwPADI9mG9w==",
+          "version": "2.7.14",
+          "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.14.tgz",
+          "integrity": "sha512-GnAZhBChCjAg0NyZMmZureWmBXijbAK7wreEpsoI1oP5hCuHcvWknDU4u5PjoVdLyJ+8ObJ86Y/Y4uzrqcg/qg==",
+          "dev": true
+        },
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
           "dev": true
         }
       }
     },
     "gatsby-react-router-scroll": {
-      "version": "2.1.8",
-      "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.1.8.tgz",
-      "integrity": "sha512-h6zjADduO8lBvZozn7E7aijoaex75Thk/dwS8256AgKb5SDQ0ilFQHZKsZPvQHwftGpOuvdoYnks/Mb3nR0cJg==",
+      "version": "2.1.14",
+      "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.1.14.tgz",
+      "integrity": "sha512-UTkapxc+o7tGdoTL+HqrAqMiVtfjuyZUVAqQ42zhugfqA3Vz1yXOnsKgWqHAASlMXOzIPjvAhdR4vrxwuHDLjA==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.6.0",
+        "@babel/runtime": "^7.6.3",
         "scroll-behavior": "^0.9.10",
         "warning": "^3.0.0"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz",
+          "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==",
+          "dev": true,
+          "requires": {
+            "regenerator-runtime": "^0.13.2"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
+          "dev": true
+        }
       }
     },
     "gatsby-telemetry": {
-      "version": "1.1.23",
-      "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.1.23.tgz",
-      "integrity": "sha512-tG1NS1BBIKHUXutGKYvoGFmR3sIC+l9GHd52ko2RNxm+rcnKMQAsrhlCfnKw2yGB+wys/k9YOJ5bZ1da1TFe7A==",
+      "version": "1.1.35",
+      "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.1.35.tgz",
+      "integrity": "sha512-4XisbcM8/qaBd76lG9MayXcIja8kJ6m15Uv+TqiTn7i+pnSCFzza9XY+vZsO/bP/WUjAjlTsCdTngVLR5Ocmjw==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.5.5",
-        "@babel/runtime": "^7.6.0",
-        "bluebird": "^3.5.5",
+        "@babel/runtime": "^7.6.3",
+        "bluebird": "^3.7.1",
         "boxen": "^3.2.0",
-        "ci-info": "2.0.0",
         "configstore": "^5.0.0",
         "envinfo": "^5.12.1",
         "fs-extra": "^8.1.0",
+        "gatsby-core-utils": "^1.0.17",
         "git-up": "4.0.1",
         "is-docker": "2.0.0",
         "lodash": "^4.17.15",
@@ -12533,11 +13996,14 @@
             "@babel/highlight": "^7.0.0"
           }
         },
-        "ci-info": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-          "dev": true
+        "@babel/runtime": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz",
+          "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==",
+          "dev": true,
+          "requires": {
+            "regenerator-runtime": "^0.13.2"
+          }
         },
         "configstore": {
           "version": "5.0.0",
@@ -12560,9 +14026,9 @@
           "dev": true
         },
         "dot-prop": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.0.tgz",
-          "integrity": "sha512-n1oC6NBF+KM9oVXtjmen4Yo7HyAVWV2UUl50dCYJdw2924K6dX9bf9TTTWaKtYlRn0FEtxG27KS80ayVLixxJA==",
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
           "dev": true,
           "requires": {
             "is-obj": "^2.0.0"
@@ -12580,9 +14046,9 @@
           },
           "dependencies": {
             "graceful-fs": {
-              "version": "4.2.2",
-              "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
-              "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
+              "version": "4.2.3",
+              "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+              "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
               "dev": true
             }
           }
@@ -12602,10 +14068,10 @@
             "semver": "^6.0.0"
           }
         },
-        "node-fetch": {
-          "version": "2.6.0",
-          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
-          "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==",
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
           "dev": true
         },
         "source-map": {
@@ -12624,9 +14090,9 @@
           }
         },
         "write-file-atomic": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz",
-          "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==",
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz",
+          "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==",
           "dev": true,
           "requires": {
             "imurmurhash": "^0.1.4",
@@ -12655,9 +14121,9 @@
       "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE="
     },
     "get-own-enumerable-property-symbols": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz",
-      "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz",
+      "integrity": "sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA==",
       "dev": true
     },
     "get-port": {
@@ -12804,9 +14270,9 @@
       }
     },
     "glob": {
-      "version": "7.1.4",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
-      "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -13068,9 +14534,9 @@
       }
     },
     "graphql-compose": {
-      "version": "6.3.5",
-      "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-6.3.5.tgz",
-      "integrity": "sha512-XUpp7JqbaQ+vK/Nw4Jw0CQKs3UU8YFz3wpbBz+6WvPhrMkexco0bIbK4iGW9okQT7+/toAphEdVO4HFqM7lk2w==",
+      "version": "6.3.7",
+      "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-6.3.7.tgz",
+      "integrity": "sha512-OxfhSPZS2Uz+P9U6FUllJmGGY2T4jrKhnX0x5XFcyQO4ubjQeoHQbAgRyqKqePhIKGqQWFwm2w40/HJC0tt7rA==",
       "dev": true,
       "requires": {
         "graphql-type-json": "^0.2.4",
@@ -13358,9 +14824,9 @@
       "dev": true
     },
     "hey-listen": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.5.tgz",
-      "integrity": "sha512-O2iCNxBBGb4hOxL9tUdnoPwDYmZhQ29t5xKV74BVZNdvwCDXCpVYTJ4yoaibc1V0I8Yw3K3nwmvDpoyjnCqUaw==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
+      "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==",
       "dev": true
     },
     "hmac-drbg": {
@@ -13543,12 +15009,12 @@
       "dev": true
     },
     "http-proxy": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
-      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz",
+      "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==",
       "dev": true,
       "requires": {
-        "eventemitter3": "^3.0.0",
+        "eventemitter3": "^4.0.0",
         "follow-redirects": "^1.0.0",
         "requires-port": "^1.0.0"
       }
@@ -13603,9 +15069,9 @@
       "dev": true
     },
     "https-proxy-agent": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz",
-      "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==",
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+      "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
       "dev": true,
       "requires": {
         "agent-base": "^4.3.0",
@@ -13662,20 +15128,20 @@
       "dev": true
     },
     "husky": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.5.tgz",
-      "integrity": "sha512-cKd09Jy9cDyNIvAdN2QQAP/oA21sle4FWXjIMDttailpLAYZuBE7WaPmhrkj+afS8Sj9isghAtFvWSQ0JiwOHg==",
+      "version": "3.0.9",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.9.tgz",
+      "integrity": "sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
+        "ci-info": "^2.0.0",
         "cosmiconfig": "^5.2.1",
         "execa": "^1.0.0",
         "get-stdin": "^7.0.0",
-        "is-ci": "^2.0.0",
         "opencollective-postinstall": "^2.0.2",
         "pkg-dir": "^4.2.0",
         "please-upgrade-node": "^3.2.0",
-        "read-pkg": "^5.1.1",
+        "read-pkg": "^5.2.0",
         "run-node": "^1.0.0",
         "slash": "^3.0.0"
       },
@@ -13686,18 +15152,6 @@
           "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
           "dev": true
         },
-        "cosmiconfig": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
-          "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
-          "dev": true,
-          "requires": {
-            "import-fresh": "^2.0.0",
-            "is-directory": "^0.3.1",
-            "js-yaml": "^3.13.1",
-            "parse-json": "^4.0.0"
-          }
-        },
         "cross-spawn": {
           "version": "6.0.5",
           "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -13751,15 +15205,6 @@
             "pump": "^3.0.0"
           }
         },
-        "is-ci": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-          "dev": true,
-          "requires": {
-            "ci-info": "^2.0.0"
-          }
-        },
         "locate-path": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -13800,13 +15245,15 @@
           }
         },
         "parse-json": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
+          "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
           "dev": true,
           "requires": {
+            "@babel/code-frame": "^7.0.0",
             "error-ex": "^1.3.1",
-            "json-parse-better-errors": "^1.0.1"
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
           }
         },
         "path-exists": {
@@ -13840,20 +15287,6 @@
             "normalize-package-data": "^2.5.0",
             "parse-json": "^5.0.0",
             "type-fest": "^0.6.0"
-          },
-          "dependencies": {
-            "parse-json": {
-              "version": "5.0.0",
-              "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
-              "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
-              "dev": true,
-              "requires": {
-                "@babel/code-frame": "^7.0.0",
-                "error-ex": "^1.3.1",
-                "json-parse-better-errors": "^1.0.1",
-                "lines-and-columns": "^1.1.6"
-              }
-            }
           }
         },
         "resolve": {
@@ -13870,12 +15303,6 @@
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
         }
       }
     },
@@ -14141,13 +15568,14 @@
       "dev": true
     },
     "ink": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/ink/-/ink-2.3.0.tgz",
-      "integrity": "sha512-931rgXHAS3hM++8ygWPOBeHOFwTzHh3pDAVZtiBVOUH6tVvJijym43ODUy22ySo2NwYUFeR/Zj3xuWzBEKMiHw==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/ink/-/ink-2.5.0.tgz",
+      "integrity": "sha512-HUkVglJ11cXK+W1a5cKNoOCxLkDi5hbDMAWSFDcwF2kpNd0eoX+2/cpaTP9BTFaQ8RJk7O59NxKMmyPXkmxo7w==",
       "dev": true,
       "optional": true,
       "requires": {
         "@types/react": "^16.8.6",
+        "ansi-escapes": "^4.2.1",
         "arrify": "^1.0.1",
         "auto-bind": "^2.0.0",
         "chalk": "^2.4.1",
@@ -14157,8 +15585,8 @@
         "lodash.throttle": "^4.1.1",
         "log-update": "^3.0.0",
         "prop-types": "^15.6.2",
-        "react-reconciler": "^0.20.0",
-        "scheduler": "^0.13.2",
+        "react-reconciler": "^0.21.0",
+        "scheduler": "^0.15.0",
         "signal-exit": "^3.0.2",
         "slice-ansi": "^1.0.0",
         "string-length": "^2.0.0",
@@ -14168,11 +15596,14 @@
       },
       "dependencies": {
         "ansi-escapes": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
-          "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
+          "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
           "dev": true,
-          "optional": true
+          "optional": true,
+          "requires": {
+            "type-fest": "^0.5.2"
+          }
         },
         "ansi-regex": {
           "version": "4.1.0",
@@ -14229,6 +15660,26 @@
             "ansi-escapes": "^3.2.0",
             "cli-cursor": "^2.1.0",
             "wrap-ansi": "^5.0.0"
+          },
+          "dependencies": {
+            "ansi-escapes": {
+              "version": "3.2.0",
+              "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+              "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "scheduler": {
+          "version": "0.15.0",
+          "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz",
+          "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "loose-envify": "^1.1.0",
+            "object-assign": "^4.1.1"
           }
         },
         "slice-ansi": {
@@ -14251,6 +15702,13 @@
             "ansi-regex": "^4.1.0"
           }
         },
+        "type-fest": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
+          "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==",
+          "dev": true,
+          "optional": true
+        },
         "wrap-ansi": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
@@ -14445,9 +15903,9 @@
       "dev": true
     },
     "is-absolute-url": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.2.tgz",
-      "integrity": "sha512-+5g/wLlcm1AcxSP7014m6GvbPHswDx980vD/3bZaap8aGV9Yfs7Q6y6tfaupgZ5O74Byzc8dGrSCJ+bFXx0KdA==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+      "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
       "dev": true
     },
     "is-accessor-descriptor": {
@@ -14922,9 +16380,9 @@
       }
     },
     "is-what": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.2.3.tgz",
-      "integrity": "sha512-c4syLgFnjXTH5qd82Fp/qtUIeM0wA69xbI0KH1QpurMIvDaZFrS8UtAa4U52Dc2qSznaMxHit0gErMp6A/Qk1w==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.3.1.tgz",
+      "integrity": "sha512-seFn10yAXy+yJlTRO+8VfiafC+0QJanGLMPTBWLrJm/QPauuchy0UXh8B6H5o9VA8BAzk0iYievt6mNp6gfaqA==",
       "dev": true
     },
     "is-windows": {
@@ -15414,9 +16872,9 @@
       }
     },
     "jsdoctypeparser": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-5.0.1.tgz",
-      "integrity": "sha512-dYwcK6TKzvq+ZKtbp4sbQSW9JMo6s+4YFfUs5D/K7bZsn3s1NhEhZ+jmIPzby0HbkbECBe+hNPEa6a+E21o94w==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-5.1.1.tgz",
+      "integrity": "sha512-APGygIJrT5bbz5lsVt8vyLJC0miEbQf/z9ZBfTr4RYvdia8AhWMRlYgivvwHG5zKD/VW3d6qpChCy64hpQET3A==",
       "dev": true
     },
     "jsdom": {
@@ -15714,9 +17172,9 @@
       }
     },
     "leven": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
-      "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
       "dev": true
     },
     "levn": {
@@ -15750,9 +17208,9 @@
       }
     },
     "lint-staged": {
-      "version": "9.4.0",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.4.0.tgz",
-      "integrity": "sha512-jTu1KoGiGTSffM539wK+3igVqDGVsby3KwDBaXL471YndahkjnavLX+R5Nsk49JwklyMo0ZAXay1BaoyA6d2Jw==",
+      "version": "9.4.2",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.4.2.tgz",
+      "integrity": "sha512-OFyGokJSWTn2M6vngnlLXjaHhi8n83VIZZ5/1Z26SULRUWgR3ITWpAEQC9Pnm3MC/EpCxlwts/mQWDHNji2+zA==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
@@ -15781,34 +17239,20 @@
           }
         },
         "commander": {
-          "version": "2.20.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
-          "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
           "dev": true
         },
-        "cosmiconfig": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
-          "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
-          "dev": true,
-          "requires": {
-            "import-fresh": "^2.0.0",
-            "is-directory": "^0.3.1",
-            "js-yaml": "^3.13.1",
-            "parse-json": "^4.0.0"
-          }
-        },
         "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
+          "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
           "dev": true,
           "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
           }
         },
         "debug": {
@@ -15821,12 +17265,12 @@
           }
         },
         "execa": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz",
-          "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==",
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
+          "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
           "dev": true,
           "requires": {
-            "cross-spawn": "^6.0.5",
+            "cross-spawn": "^7.0.0",
             "get-stream": "^5.0.0",
             "is-stream": "^2.0.0",
             "merge-stream": "^2.0.0",
@@ -15911,14 +17355,6 @@
           "dev": true,
           "requires": {
             "path-key": "^3.0.0"
-          },
-          "dependencies": {
-            "path-key": {
-              "version": "3.1.0",
-              "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
-              "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
-              "dev": true
-            }
           }
         },
         "onetime": {
@@ -15936,20 +17372,25 @@
           "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
           "dev": true
         },
-        "parse-json": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+        "path-key": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
+          "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
           "dev": true,
           "requires": {
-            "error-ex": "^1.3.1",
-            "json-parse-better-errors": "^1.0.1"
+            "shebang-regex": "^3.0.0"
           }
         },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
           "dev": true
         },
         "to-regex-range": {
@@ -15960,6 +17401,15 @@
           "requires": {
             "is-number": "^7.0.0"
           }
+        },
+        "which": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
+          "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
         }
       }
     },
@@ -16451,15 +17901,15 @@
       }
     },
     "loglevel": {
-      "version": "1.6.4",
-      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz",
-      "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==",
+      "version": "1.6.6",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz",
+      "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==",
       "dev": true
     },
     "lokijs": {
-      "version": "1.5.7",
-      "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.7.tgz",
-      "integrity": "sha512-2SqUV6JH4f15Z5/7LVsyadSUwHhZppxhujgy/VhVqiRYMGt5oaocb7fV/3JGjHJ6rTuEIajnpTLGRz9cJW/c3g==",
+      "version": "1.5.8",
+      "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.8.tgz",
+      "integrity": "sha512-D8E3TBrY35o1ELnonp2MF8b3wKu2tVNl2TqRjvS+95oPMMe7OoIAxNY1qr+5BEZwnWn2V4ErAjVt000DonM+FA==",
       "dev": true
     },
     "lolex": {
@@ -16844,12 +18294,12 @@
       }
     },
     "merge-anything": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.2.5.tgz",
-      "integrity": "sha512-WgZGR7EQ1D8pyh57uKBbkPhUCJZLGdMzbDaxL4MDTJSGsvtpGdm8myr6DDtgJwT46xiFBlHqxbveDRpFBWlKWQ==",
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.4.1.tgz",
+      "integrity": "sha512-dYOIAl9GFCJNctSIHWOj9OJtarCjsD16P8ObCl6oxrujAG+kOvlwJuOD9/O9iYZ9aTi1RGpGTG9q9etIvuUikQ==",
       "dev": true,
       "requires": {
-        "is-what": "^3.2.3"
+        "is-what": "^3.3.1"
       }
     },
     "merge-descriptors": {
@@ -17112,9 +18562,9 @@
       }
     },
     "mitt": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.3.tgz",
-      "integrity": "sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz",
+      "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==",
       "dev": true
     },
     "mixin-deep": {
@@ -17154,9 +18604,9 @@
       }
     },
     "mocha": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz",
-      "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==",
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz",
+      "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==",
       "dev": true,
       "requires": {
         "ansi-colors": "3.2.3",
@@ -17179,9 +18629,9 @@
         "supports-color": "6.0.0",
         "which": "1.3.1",
         "wide-align": "1.1.3",
-        "yargs": "13.2.2",
-        "yargs-parser": "13.0.0",
-        "yargs-unparser": "1.5.0"
+        "yargs": "13.3.0",
+        "yargs-parser": "13.1.1",
+        "yargs-unparser": "1.6.0"
       },
       "dependencies": {
         "ansi-regex": {
@@ -17190,17 +18640,24 @@
           "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
           "dev": true,
           "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
+            "color-convert": "^1.9.0"
+          }
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
           }
         },
         "debug": {
@@ -17224,21 +18681,6 @@
           "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
           "dev": true
         },
-        "execa": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^6.0.0",
-            "get-stream": "^4.0.0",
-            "is-stream": "^1.1.0",
-            "npm-run-path": "^2.0.0",
-            "p-finally": "^1.0.0",
-            "signal-exit": "^3.0.0",
-            "strip-eof": "^1.0.0"
-          }
-        },
         "find-up": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
@@ -17254,15 +18696,6 @@
           "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
           "dev": true
         },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
         "glob": {
           "version": "7.1.3",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
@@ -17283,21 +18716,6 @@
           "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
           "dev": true
         },
-        "invert-kv": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
-          "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
-          "dev": true
-        },
-        "lcid": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-          "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
-          "dev": true,
-          "requires": {
-            "invert-kv": "^2.0.0"
-          }
-        },
         "locate-path": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
@@ -17308,44 +18726,16 @@
             "path-exists": "^3.0.0"
           }
         },
-        "mem": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
-          "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
-          "dev": true,
-          "requires": {
-            "map-age-cleaner": "^0.1.1",
-            "mimic-fn": "^2.0.0",
-            "p-is-promise": "^2.0.0"
-          }
-        },
-        "mimic-fn": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-          "dev": true
-        },
         "ms": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
           "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
           "dev": true
         },
-        "os-locale": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-          "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
-          "dev": true,
-          "requires": {
-            "execa": "^1.0.0",
-            "lcid": "^2.0.0",
-            "mem": "^4.0.0"
-          }
-        },
         "p-limit": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
-          "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+          "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
           "dev": true,
           "requires": {
             "p-try": "^2.0.0"
@@ -17366,12 +18756,6 @@
           "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
           "dev": true
         },
-        "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
-          "dev": true
-        },
         "string-width": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
@@ -17410,6 +18794,17 @@
             "isexe": "^2.0.0"
           }
         },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
         "y18n": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
@@ -17417,28 +18812,27 @@
           "dev": true
         },
         "yargs": {
-          "version": "13.2.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz",
-          "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==",
+          "version": "13.3.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
+          "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
           "dev": true,
           "requires": {
-            "cliui": "^4.0.0",
+            "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.0.0"
+            "yargs-parser": "^13.1.1"
           }
         },
         "yargs-parser": {
-          "version": "13.0.0",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz",
-          "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==",
+          "version": "13.1.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
+          "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
           "dev": true,
           "requires": {
             "camelcase": "^5.0.0",
@@ -17855,25 +19249,6 @@
       "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
       "dev": true
     },
-    "nimn-date-parser": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/nimn-date-parser/-/nimn-date-parser-1.0.0.tgz",
-      "integrity": "sha512-1Nf+x3EeMvHUiHsVuEhiZnwA8RMeOBVTQWfB1S2n9+i6PYCofHd2HRMD+WOHIHYshy4T4Gk8wQoCol7Hq3av8Q=="
-    },
-    "nimn_schema_builder": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/nimn_schema_builder/-/nimn_schema_builder-1.1.0.tgz",
-      "integrity": "sha512-DK5/B8CM4qwzG2URy130avcwPev4uO0ev836FbQyKo1ms6I9z/i6EJyiZ+d9xtgloxUri0W+5gfR8YbPq7SheA=="
-    },
-    "nimnjs": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/nimnjs/-/nimnjs-1.3.2.tgz",
-      "integrity": "sha512-TIOtI4iqkQrUM1tiM76AtTQem0c7e56SkDZ7sj1d1MfUsqRcq2ZWQvej/O+HBTZV7u/VKnwlKTDugK/75IRPPw==",
-      "requires": {
-        "nimn-date-parser": "^1.0.0",
-        "nimn_schema_builder": "^1.0.0"
-      }
-    },
     "nise": {
       "version": "1.5.2",
       "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.2.tgz",
@@ -17899,9 +19274,9 @@
       }
     },
     "nock": {
-      "version": "11.3.5",
-      "resolved": "https://registry.npmjs.org/nock/-/nock-11.3.5.tgz",
-      "integrity": "sha512-6WGeZcWc3RExkBcMSYSrUm/5YukDo52m/jhwniQyrnuiCnKRljBwwje9vTwJyEi4J6m2bq0Aj6C1vzuM6iuaeg==",
+      "version": "11.7.0",
+      "resolved": "https://registry.npmjs.org/nock/-/nock-11.7.0.tgz",
+      "integrity": "sha512-7c1jhHew74C33OBeRYyQENT+YXQiejpwIrEjinh6dRurBae+Ei4QjeUaPlkptIF0ZacEiVCnw8dWaxqepkiihg==",
       "dev": true,
       "requires": {
         "chai": "^4.1.2",
@@ -17983,9 +19358,9 @@
       },
       "dependencies": {
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         }
       }
@@ -18003,9 +19378,9 @@
       "dev": true
     },
     "node-forge": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.2.tgz",
-      "integrity": "sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==",
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
+      "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==",
       "dev": true
     },
     "node-int64": {
@@ -18159,20 +19534,12 @@
       "dev": true
     },
     "node-releases": {
-      "version": "1.1.30",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.30.tgz",
-      "integrity": "sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw==",
+      "version": "1.1.39",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+      "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
       "dev": true,
       "requires": {
-        "semver": "^5.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        }
+        "semver": "^6.3.0"
       }
     },
     "node-status-codes": {
@@ -18187,18 +19554,18 @@
       "dev": true
     },
     "nodemon": {
-      "version": "1.19.2",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.2.tgz",
-      "integrity": "sha512-hRLYaw5Ihyw9zK7NF+9EUzVyS6Cvgc14yh8CAYr38tPxJa6UrOxwAQ351GwrgoanHCF0FalQFn6w5eoX/LGdJw==",
+      "version": "1.19.4",
+      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz",
+      "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==",
       "dev": true,
       "requires": {
-        "chokidar": "^2.1.5",
-        "debug": "^3.1.0",
+        "chokidar": "^2.1.8",
+        "debug": "^3.2.6",
         "ignore-by-default": "^1.0.1",
         "minimatch": "^3.0.4",
-        "pstree.remy": "^1.1.6",
-        "semver": "^5.5.0",
-        "supports-color": "^5.2.0",
+        "pstree.remy": "^1.1.7",
+        "semver": "^5.7.1",
+        "supports-color": "^5.5.0",
         "touch": "^3.1.0",
         "undefsafe": "^2.0.2",
         "update-notifier": "^2.5.0"
@@ -18233,6 +19600,12 @@
             "ms": "^2.1.1"
           }
         },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -18251,11 +19624,14 @@
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
-        "upath": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-          "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-          "dev": true
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
@@ -19598,9 +20974,9 @@
       }
     },
     "parse-asn1": {
-      "version": "5.1.4",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz",
-      "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==",
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
+      "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
       "dev": true,
       "requires": {
         "asn1.js": "^4.0.0",
@@ -19902,24 +21278,24 @@
       }
     },
     "popmotion": {
-      "version": "8.6.4",
-      "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-8.6.4.tgz",
-      "integrity": "sha512-nXYMlVkzpXG5BvZ7fUbFpXNodTP11y+guw5yRfJWpQ+8MAnTqIOfWqxAlzIKD1n8SmXddDY/PEgMqvKgU5aGXw==",
+      "version": "8.7.0",
+      "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-8.7.0.tgz",
+      "integrity": "sha512-RnJMbWN+TEBT0tgG+3WS0O1i9LAq+senXSAcKw+srGviT1c9G+iKUXrp24D2w6Og0mDd61rEfKz3pFrFCdKn5Q==",
       "dev": true,
       "requires": {
         "@popmotion/easing": "^1.0.1",
-        "@popmotion/popcorn": "^0.3.2",
+        "@popmotion/popcorn": "^0.4.0",
         "framesync": "^4.0.0",
         "hey-listen": "^1.0.5",
-        "style-value-types": "^3.1.0",
-        "stylefire": "2.4.3",
+        "style-value-types": "^3.1.4",
+        "stylefire": "^4.1.3",
         "tslib": "^1.9.1"
       }
     },
     "popmotion-pose": {
-      "version": "3.4.6",
-      "resolved": "https://registry.npmjs.org/popmotion-pose/-/popmotion-pose-3.4.6.tgz",
-      "integrity": "sha512-ZlRj4dWlJcZvr/84Xh+P+w9lxZVfTU3pJ+u1TkYu+y7Mq4yDXgPlarjgth2qeI4U5VylvTfWSvzwSjEXy8OPxg==",
+      "version": "3.4.8",
+      "resolved": "https://registry.npmjs.org/popmotion-pose/-/popmotion-pose-3.4.8.tgz",
+      "integrity": "sha512-/dkEhDiTYkbLb15dkrU3Okh58KU5I8z3f18V7kciN/cJmSc8ZD8tWgOc8U9yJf3lUHnf/va5PMCX4/4RnVeUiQ==",
       "dev": true,
       "requires": {
         "@popmotion/easing": "^1.0.1",
@@ -19932,14 +21308,40 @@
       }
     },
     "portfinder": {
-      "version": "1.0.24",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz",
-      "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==",
+      "version": "1.0.25",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz",
+      "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==",
       "dev": true,
       "requires": {
-        "async": "^1.5.2",
-        "debug": "^2.2.0",
-        "mkdirp": "0.5.x"
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.1"
+      },
+      "dependencies": {
+        "async": {
+          "version": "2.6.3",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+          "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+          "dev": true,
+          "requires": {
+            "lodash": "^4.17.14"
+          }
+        },
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
       }
     },
     "pose-core": {
@@ -19955,9 +21357,9 @@
       },
       "dependencies": {
         "@types/node": {
-          "version": "10.14.17",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.17.tgz",
-          "integrity": "sha512-p/sGgiPaathCfOtqu2fx5Mu1bcjuP8ALFg4xpGgNkcin7LwRyzUKniEHBKdcE1RPsenq5JVPIpMTJSygLboygQ==",
+          "version": "10.14.21",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.21.tgz",
+          "integrity": "sha512-nuFlRdBiqbF+PJIEVxm2jLFcQWN7q7iWEJGsBV4n7v1dbI9qXB8im2pMMKMCUZe092sQb5SQft2DHfuQGK5hqQ==",
           "dev": true
         }
       }
@@ -19969,9 +21371,9 @@
       "dev": true
     },
     "postcss": {
-      "version": "7.0.18",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz",
-      "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==",
+      "version": "7.0.21",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz",
+      "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
@@ -20028,24 +21430,45 @@
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
           }
-        }
-      }
-    },
-    "postcss-convert-values": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
-      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
-      "dev": true,
-      "requires": {
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.39",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+          "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.3.0"
+          }
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+      "dev": true,
+      "requires": {
         "postcss": "^7.0.0",
         "postcss-value-parser": "^3.0.0"
       }
@@ -20182,14 +21605,35 @@
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.39",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+          "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "semver": "^6.3.0"
           }
         },
         "postcss-selector-parser": {
@@ -20242,14 +21686,35 @@
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.39",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+          "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "semver": "^6.3.0"
           }
         }
       }
@@ -20472,14 +21937,35 @@
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.39",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+          "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "semver": "^6.3.0"
           }
         }
       }
@@ -20538,14 +22024,35 @@
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.39",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+          "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "semver": "^6.3.0"
           }
         }
       }
@@ -21041,9 +22548,9 @@
       }
     },
     "react": {
-      "version": "16.9.0",
-      "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz",
-      "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==",
+      "version": "16.11.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-16.11.0.tgz",
+      "integrity": "sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g==",
       "dev": true,
       "requires": {
         "loose-envify": "^1.1.0",
@@ -21247,21 +22754,21 @@
       }
     },
     "react-dom": {
-      "version": "16.9.0",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz",
-      "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==",
+      "version": "16.11.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.11.0.tgz",
+      "integrity": "sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA==",
       "dev": true,
       "requires": {
         "loose-envify": "^1.1.0",
         "object-assign": "^4.1.1",
         "prop-types": "^15.6.2",
-        "scheduler": "^0.15.0"
+        "scheduler": "^0.17.0"
       },
       "dependencies": {
         "scheduler": {
-          "version": "0.15.0",
-          "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz",
-          "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==",
+          "version": "0.17.0",
+          "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz",
+          "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==",
           "dev": true,
           "requires": {
             "loose-envify": "^1.1.0",
@@ -21271,9 +22778,9 @@
       }
     },
     "react-error-overlay": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.2.tgz",
-      "integrity": "sha512-DHRuRk3K4Lg9obI6J4Y+nKvtwjasYRU9CFL3ud42x9YJG1HbQjSNublapC/WBJOA726gNUbqbj0U2df9+uzspQ==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.3.tgz",
+      "integrity": "sha512-bOUvMWFQVk5oz8Ded9Xb7WVdEi3QGLC8tH7HmYP0Fdp4Bn3qw0tRFmr5TW6mvahzvmrK4a6bqWGfCevBflP+Xw==",
       "dev": true
     },
     "react-fast-compare": {
@@ -21295,11 +22802,12 @@
       }
     },
     "react-hot-loader": {
-      "version": "4.12.13",
-      "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.13.tgz",
-      "integrity": "sha512-4Byk3aVQhcmTnVCBvDHOEOUnMFMj81r2yRKZQSfLOG2yd/4hm/A3oK15AnCZilQExqSFSsHcK64lIIU+dU2zQQ==",
+      "version": "4.12.16",
+      "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.16.tgz",
+      "integrity": "sha512-KC33uTBacgdunMtfpZFP2pgPpyvKIcCwuh0XmWESbeFrkWLqUtCFN91zyaTdU5OiAM982+E8xh1gjE5EINumaw==",
       "dev": true,
       "requires": {
+        "@types/react": "^15.0.0 || ^16.0.0",
         "fast-levenshtein": "^2.0.6",
         "global": "^4.3.0",
         "hoist-non-react-statics": "^3.3.0",
@@ -21319,9 +22827,9 @@
       }
     },
     "react-input-autosize": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz",
-      "integrity": "sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz",
+      "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==",
       "dev": true,
       "requires": {
         "prop-types": "^15.5.8"
@@ -21340,9 +22848,9 @@
       "dev": true
     },
     "react-modal": {
-      "version": "3.10.1",
-      "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.10.1.tgz",
-      "integrity": "sha512-2DKIfdOc8+WY+SYJ/xf/WBwOYMmNAYAyGkYlc4e1TCs9rk1xY4QBz04hB3UHGcrLChh7ce77rHAe6VPNmuLYsQ==",
+      "version": "3.11.1",
+      "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.11.1.tgz",
+      "integrity": "sha512-8uN744Yq0X2lbfSLxsEEc2UV3RjSRb4yDVxRQ1aGzPo86QjNOwhQSukDb8U8kR+636TRTvfMren10fgOjAy9eA==",
       "dev": true,
       "requires": {
         "exenv": "^1.2.0",
@@ -21363,9 +22871,9 @@
       }
     },
     "react-pose": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/react-pose/-/react-pose-4.0.8.tgz",
-      "integrity": "sha512-WN/583nKJZkKmKg5ha+eErOGWF9GV6A5EngC7WHQX5b910X9rTlOlxzdKlUy/dDcsTRMZEtHV0Sy2gLPYsVQCQ==",
+      "version": "4.0.9",
+      "resolved": "https://registry.npmjs.org/react-pose/-/react-pose-4.0.9.tgz",
+      "integrity": "sha512-NCAgAIzH8MkNYhW+M6Dnps88lOo8nr08SoKbB7PfZH9ztbql9jRzlJxH9A5x3zLxahya6nsyxjCsi5+qLZV7ng==",
       "dev": true,
       "requires": {
         "@emotion/is-prop-valid": "^0.7.3",
@@ -21375,33 +22883,44 @@
       }
     },
     "react-reconciler": {
-      "version": "0.20.4",
-      "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.20.4.tgz",
-      "integrity": "sha512-kxERc4H32zV2lXMg/iMiwQHOtyqf15qojvkcZ5Ja2CPkjVohHw9k70pdDBwrnQhLVetUJBSYyqU3yqrlVTOajA==",
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.21.0.tgz",
+      "integrity": "sha512-h4Rl3L3O6G9V4Ff+F+tCXX8ElDVn0Psk/odT+NPWeA55Yk5G7+kHT8D+Q3yE+51C72LbrYcX6OfLmCZ/7Nx9cw==",
       "dev": true,
       "optional": true,
       "requires": {
         "loose-envify": "^1.1.0",
         "object-assign": "^4.1.1",
         "prop-types": "^15.6.2",
-        "scheduler": "^0.13.6"
+        "scheduler": "^0.15.0"
+      },
+      "dependencies": {
+        "scheduler": {
+          "version": "0.15.0",
+          "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz",
+          "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "loose-envify": "^1.1.0",
+            "object-assign": "^4.1.1"
+          }
+        }
       }
     },
     "react-select": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/react-select/-/react-select-3.0.5.tgz",
-      "integrity": "sha512-2tBXZ1XSqbk2boMUzSmKXwGl/6W46VkSMSLMy+ShccOVyD1kDTLPwLX7lugISkRMmL0v5BcLtriXOLfYwO0otw==",
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/react-select/-/react-select-3.0.8.tgz",
+      "integrity": "sha512-v9LpOhckLlRmXN5A6/mGGEft4FMrfaBFTGAnuPHcUgVId7Je42kTq9y0Z+Ye5z8/j0XDT3zUqza8gaRaI1PZIg==",
       "dev": true,
       "requires": {
         "@babel/runtime": "^7.4.4",
         "@emotion/cache": "^10.0.9",
         "@emotion/core": "^10.0.9",
         "@emotion/css": "^10.0.9",
-        "classnames": "^2.2.5",
         "memoize-one": "^5.0.0",
         "prop-types": "^15.6.0",
-        "raf": "^3.4.0",
-        "react-input-autosize": "^2.2.1",
+        "react-input-autosize": "^2.2.2",
         "react-transition-group": "^2.2.1"
       }
     },
@@ -21416,21 +22935,21 @@
       }
     },
     "react-test-renderer": {
-      "version": "16.8.6",
-      "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.6.tgz",
-      "integrity": "sha512-H2srzU5IWYT6cZXof6AhUcx/wEyJddQ8l7cLM/F7gDXYyPr4oq+vCIxJYXVGhId1J706sqziAjuOEjyNkfgoEw==",
+      "version": "16.10.2",
+      "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.10.2.tgz",
+      "integrity": "sha512-k9Qzyev6cTIcIfrhgrFlYQAFxh5EEDO6ALNqYqmKsWVA7Q/rUMTay5nD3nthi6COmYsd4ghVYyi8U86aoeMqYQ==",
       "dev": true,
       "requires": {
         "object-assign": "^4.1.1",
         "prop-types": "^15.6.2",
         "react-is": "^16.8.6",
-        "scheduler": "^0.13.6"
+        "scheduler": "^0.16.2"
       },
       "dependencies": {
         "react-is": {
-          "version": "16.8.6",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
-          "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==",
+          "version": "16.10.2",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz",
+          "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==",
           "dev": true
         }
       }
@@ -21771,9 +23290,9 @@
       }
     },
     "regjsgen": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
-      "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
+      "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
       "dev": true
     },
     "regjsparser": {
@@ -22217,9 +23736,9 @@
       }
     },
     "scheduler": {
-      "version": "0.13.6",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz",
-      "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==",
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.16.2.tgz",
+      "integrity": "sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg==",
       "dev": true,
       "requires": {
         "loose-envify": "^1.1.0",
@@ -22252,12 +23771,12 @@
       "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
     },
     "selfsigned": {
-      "version": "1.10.6",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.6.tgz",
-      "integrity": "sha512-i3+CeqxL7DpAazgVpAGdKMwHuL63B5nhJMh9NQ7xmChGkA3jNFflq6Jyo1LLJYcr3idWiNOPWHCrm4zMayLG4w==",
+      "version": "1.10.7",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz",
+      "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==",
       "dev": true,
       "requires": {
-        "node-forge": "0.8.2"
+        "node-forge": "0.9.0"
       }
     },
     "semver": {
@@ -22466,9 +23985,9 @@
       "dev": true
     },
     "simple-icons": {
-      "version": "1.16.0",
-      "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-1.16.0.tgz",
-      "integrity": "sha512-uUsVbiN+SMfCElZlHy2SOl4Wr9HbBquFrdGiROCxhCzUFoG1kUrgnxn0MabLrWgrQSlyGD535B74UN+qJV/lWw=="
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-1.19.1.tgz",
+      "integrity": "sha512-tZpdvsJ98C0lrym8eFtAbXUeMpLbpN/UKek333fGDIZ6CRhPtpMloA3HvDcGTtfOAi4KDev7yJe3H4LI9iLH8g=="
     },
     "simple-swizzle": {
       "version": "0.2.2",
@@ -22607,9 +24126,9 @@
       }
     },
     "snap-shot-core": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmjs.org/snap-shot-core/-/snap-shot-core-10.1.1.tgz",
-      "integrity": "sha512-xrltUg35pvs+d3VliYUJxe2sma45O4kenSf0i4XUoQtG6KZd/hJufu4OtlMDNCjA8cq12bgHZqy7ok/rRAwW+g==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/snap-shot-core/-/snap-shot-core-10.2.0.tgz",
+      "integrity": "sha512-FsP+Wd4SCA4bLSm3vi6OVgfmGQcAQkUhwy45zDjZDm/6dZ5SDIgP40ORHg7z6MgMAK2+fj2DmhW7SXyvMU55Vw==",
       "dev": true,
       "requires": {
         "arg": "4.1.0",
@@ -22666,9 +24185,9 @@
       }
     },
     "snap-shot-it": {
-      "version": "7.8.0",
-      "resolved": "https://registry.npmjs.org/snap-shot-it/-/snap-shot-it-7.8.0.tgz",
-      "integrity": "sha512-d83qtfNdlYogDF/fti8ya12P1WT/iBRcbHl3IYpIoUtFg6LP+G/QphPwF0zRDpR36SgFVqLvj9XpWDceHiHkmw==",
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/snap-shot-it/-/snap-shot-it-7.9.0.tgz",
+      "integrity": "sha512-70QaUKgITLCkeo8P7Tz9PfgHLuSPGIbtwSLHI89zOJ5g60pkhY1bV/oW4M4hDKUWeKwW493nwnHxlaIY0sDzYQ==",
       "dev": true,
       "requires": {
         "@bahmutov/data-driven": "1.0.0",
@@ -22681,7 +24200,7 @@
         "pluralize": "8.0.0",
         "ramda": "0.26.1",
         "snap-shot-compare": "2.8.3",
-        "snap-shot-core": "10.1.1"
+        "snap-shot-core": "10.2.0"
       },
       "dependencies": {
         "debug": {
@@ -22823,17 +24342,17 @@
       }
     },
     "socket.io": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz",
-      "integrity": "sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz",
+      "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==",
       "dev": true,
       "requires": {
         "debug": "~4.1.0",
-        "engine.io": "~3.3.1",
+        "engine.io": "~3.4.0",
         "has-binary2": "~1.0.2",
         "socket.io-adapter": "~1.1.0",
-        "socket.io-client": "2.2.0",
-        "socket.io-parser": "~3.3.0"
+        "socket.io-client": "2.3.0",
+        "socket.io-parser": "~3.4.0"
       },
       "dependencies": {
         "debug": {
@@ -22859,17 +24378,17 @@
       "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs="
     },
     "socket.io-client": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz",
-      "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
+      "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
       "dev": true,
       "requires": {
         "backo2": "1.0.2",
         "base64-arraybuffer": "0.1.5",
         "component-bind": "1.0.0",
         "component-emitter": "1.2.1",
-        "debug": "~3.1.0",
-        "engine.io-client": "~3.3.1",
+        "debug": "~4.1.0",
+        "engine.io-client": "~3.4.0",
         "has-binary2": "~1.0.2",
         "has-cors": "1.1.0",
         "indexof": "0.0.1",
@@ -22881,34 +24400,74 @@
       },
       "dependencies": {
         "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "ms": "^2.1.1"
+          }
+        },
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "socket.io-parser": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
+          "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
+          "dev": true,
+          "requires": {
+            "component-emitter": "1.2.1",
+            "debug": "~3.1.0",
+            "isarray": "2.0.1"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+              "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+              "dev": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            },
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+              "dev": true
+            }
           }
         }
       }
     },
     "socket.io-parser": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
-      "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz",
+      "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==",
       "dev": true,
       "requires": {
         "component-emitter": "1.2.1",
-        "debug": "~3.1.0",
+        "debug": "~4.1.0",
         "isarray": "2.0.1"
       },
       "dependencies": {
         "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "ms": "^2.1.1"
           }
         },
         "isarray": {
@@ -22916,6 +24475,12 @@
           "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
           "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
           "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
         }
       }
     },
@@ -23228,9 +24793,9 @@
       "dev": true
     },
     "stackframe": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz",
-      "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.0.tgz",
+      "integrity": "sha512-Vx6W1Yvy+AM1R/ckVwcHQHV147pTPBKWCRLrXMuPrFVfvBUc3os7PR1QLIWCMhPpRg5eX9ojzbQIMLGBwyLjqg==",
       "dev": true
     },
     "standard-as-callback": {
@@ -23239,31 +24804,35 @@
       "integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg=="
     },
     "start-server-and-test": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.2.tgz",
-      "integrity": "sha512-CDJGFi+qlE4KFh7QgDRz51rKn30XGpWRVRuyuuA43tZw5BEh/mkusr7aHqvT0q19xtgChYXW/uhgOq817sb+7w==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.6.tgz",
+      "integrity": "sha512-Gr/TDePT4JczaoBiKZLZRIWmYgRcoGcFQePtPEHEvZFUuxbdUqTZozx8dqrlKl/67+pipg5OOtBH21U1oJXJIQ==",
       "dev": true,
       "requires": {
-        "bluebird": "3.5.5",
+        "bluebird": "3.7.1",
         "check-more-types": "2.24.0",
         "debug": "4.1.1",
-        "execa": "2.0.4",
+        "execa": "2.1.0",
         "lazy-ass": "1.6.0",
         "ps-tree": "1.2.0",
         "wait-on": "3.3.0"
       },
       "dependencies": {
+        "bluebird": {
+          "version": "3.7.1",
+          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz",
+          "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==",
+          "dev": true
+        },
         "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
+          "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
           "dev": true,
           "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
           }
         },
         "debug": {
@@ -23276,12 +24845,12 @@
           }
         },
         "execa": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz",
-          "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==",
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
+          "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
           "dev": true,
           "requires": {
-            "cross-spawn": "^6.0.5",
+            "cross-spawn": "^7.0.0",
             "get-stream": "^5.0.0",
             "is-stream": "^2.0.0",
             "merge-stream": "^2.0.0",
@@ -23326,14 +24895,6 @@
           "dev": true,
           "requires": {
             "path-key": "^3.0.0"
-          },
-          "dependencies": {
-            "path-key": {
-              "version": "3.1.0",
-              "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
-              "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
-              "dev": true
-            }
           }
         },
         "onetime": {
@@ -23351,11 +24912,35 @@
           "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
           "dev": true
         },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+        "path-key": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
+          "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
           "dev": true
+        },
+        "which": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
+          "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
         }
       }
     },
@@ -23684,6 +25269,60 @@
         "function-bind": "^1.0.2"
       }
     },
+    "string.prototype.trimleft": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
+      "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "function-bind": "^1.1.1"
+      },
+      "dependencies": {
+        "define-properties": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+          "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+          "dev": true,
+          "requires": {
+            "object-keys": "^1.0.12"
+          }
+        },
+        "object-keys": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+          "dev": true
+        }
+      }
+    },
+    "string.prototype.trimright": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
+      "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "function-bind": "^1.1.1"
+      },
+      "dependencies": {
+        "define-properties": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+          "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+          "dev": true,
+          "requires": {
+            "object-keys": "^1.0.12"
+          }
+        },
+        "object-keys": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+          "dev": true
+        }
+      }
+    },
     "string_decoder": {
       "version": "0.10.31",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
@@ -23763,15 +25402,18 @@
       }
     },
     "style-value-types": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-3.1.0.tgz",
-      "integrity": "sha512-7eaMZ8RKWIQUKHPQK7qv3zLYmvZNb2pCmO4WguXdVFymd2Qj9xqSUoo7LQ8Wd8eiLuoSd+uqzsvcodyvD8nn6Q==",
-      "dev": true
-    },
-    "styled-components": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.3.2.tgz",
-      "integrity": "sha512-NppHzIFavZ3TsIU3R1omtddJ0Bv1+j50AKh3ZWyXHuFvJq1I8qkQ5mZ7uQgD89Y8zJNx2qRo6RqAH1BmoVafHw==",
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-3.1.6.tgz",
+      "integrity": "sha512-AxcfUr/06AHyyyxkNB1O8ypvwa8/qK+sxwelxEN5x+jxW+RXutRE2TuHEQbFq9OBY7ym83CPKvVIsGd6lvKb0Q==",
+      "dev": true,
+      "requires": {
+        "hey-listen": "^1.0.8"
+      }
+    },
+    "styled-components": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.4.1.tgz",
+      "integrity": "sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g==",
       "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.0.0",
@@ -23790,18 +25432,18 @@
       },
       "dependencies": {
         "@emotion/is-prop-valid": {
-          "version": "0.8.2",
-          "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.2.tgz",
-          "integrity": "sha512-ZQIMAA2kLUWiUeMZNJDTeCwYRx1l8SQL0kHktze4COT22occKpDML1GDUXP5/sxhOMrZO8vZw773ni4H5Snrsg==",
+          "version": "0.8.4",
+          "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.4.tgz",
+          "integrity": "sha512-QBW8h6wVQgeQ55F52rNaprEJxtVR+/ScOP8/V1ScSpPzKqHdFB9QVqby0Z50sqS8mcaeIl5vR1vQpKwJbIS6NQ==",
           "dev": true,
           "requires": {
-            "@emotion/memoize": "0.7.2"
+            "@emotion/memoize": "0.7.3"
           }
         },
         "@emotion/memoize": {
-          "version": "0.7.2",
-          "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.2.tgz",
-          "integrity": "sha512-hnHhwQzvPCW1QjBWFyBtsETdllOM92BfrKWbUTmh9aeOlcVOiXvlPsK4104xH8NsaKfg86PTFsWkueQeUfMA/w==",
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.3.tgz",
+          "integrity": "sha512-2Md9mH6mvo+ygq1trTeVp2uzAKwE2P7In0cRpD/M9Q70aH8L+rxMLbb3JCN2JoSWsV2O+DdFjfbbXoMoLBczow==",
           "dev": true
         },
         "has-flag": {
@@ -23822,14 +25464,15 @@
       }
     },
     "stylefire": {
-      "version": "2.4.3",
-      "resolved": "https://registry.npmjs.org/stylefire/-/stylefire-2.4.3.tgz",
-      "integrity": "sha512-8rckFzuDlVWSyrkmnyTg8avadQavk2t6YkFKUUocsXoj/8NScOjb+/avbB4nrmoPtzD0kN7IyuhKq8jimIBTBQ==",
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/stylefire/-/stylefire-4.1.4.tgz",
+      "integrity": "sha512-bp9nNTTFHdIQp/4szBuF2z85rMAq5oySeAHdpNgPTcVlXDrwsi1FjjOLug/4+yx1p8eMFFGrkAex7b5/M95ivg==",
       "dev": true,
       "requires": {
+        "@popmotion/popcorn": "^0.4.0",
         "framesync": "^4.0.0",
-        "hey-listen": "^1.0.4",
-        "style-value-types": "^3.0.6"
+        "hey-listen": "^1.0.8",
+        "style-value-types": "^3.1.4"
       }
     },
     "stylehacks": {
@@ -23844,14 +25487,35 @@
       },
       "dependencies": {
         "browserslist": {
-          "version": "4.7.0",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
-          "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
+          "version": "4.7.2",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
+          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
           "dev": true,
           "requires": {
-            "caniuse-lite": "^1.0.30000989",
-            "electron-to-chromium": "^1.3.247",
-            "node-releases": "^1.1.29"
+            "caniuse-lite": "^1.0.30001004",
+            "electron-to-chromium": "^1.3.295",
+            "node-releases": "^1.1.38"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001008",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz",
+          "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.306",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz",
+          "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.39",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz",
+          "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.3.0"
           }
         },
         "postcss-selector-parser": {
@@ -24105,9 +25769,9 @@
       }
     },
     "terser": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.1.tgz",
-      "integrity": "sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==",
+      "version": "4.3.9",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz",
+      "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==",
       "dev": true,
       "requires": {
         "commander": "^2.20.0",
@@ -24116,9 +25780,9 @@
       },
       "dependencies": {
         "commander": {
-          "version": "2.20.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
-          "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
           "dev": true
         },
         "source-map": {
@@ -24347,9 +26011,9 @@
       }
     },
     "thunky": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
-      "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
       "dev": true
     },
     "timed-out": {
@@ -24696,9 +26360,9 @@
       }
     },
     "typescript": {
-      "version": "3.6.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.3.tgz",
-      "integrity": "sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==",
+      "version": "3.6.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz",
+      "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==",
       "dev": true
     },
     "ua-parser-js": {
@@ -24940,6 +26604,12 @@
         }
       }
     },
+    "untildify": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz",
+      "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==",
+      "dev": true
+    },
     "unzip-response": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
@@ -25234,9 +26904,9 @@
       }
     },
     "vm-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
-      "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
       "dev": true
     },
     "wait-on": {
@@ -25265,9 +26935,9 @@
           }
         },
         "core-js": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
-          "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==",
+          "version": "2.6.10",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz",
+          "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==",
           "dev": true
         }
       }
@@ -25347,9 +27017,9 @@
       "optional": true
     },
     "webpack": {
-      "version": "4.40.2",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.40.2.tgz",
-      "integrity": "sha512-5nIvteTDCUws2DVvP9Qe+JPla7kWPPIDFZv55To7IycHWZ+Z5qBdaBYPyuXWdhggTufZkQwfIK+5rKQTVovm2A==",
+      "version": "4.41.2",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz",
+      "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==",
       "dev": true,
       "requires": {
         "@webassemblyjs/ast": "1.8.5",
@@ -25395,6 +27065,16 @@
             "uri-js": "^4.2.2"
           }
         },
+        "eslint-scope": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+          "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.1.0",
+            "estraverse": "^4.1.1"
+          }
+        },
         "fast-deep-equal": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
@@ -25427,9 +27107,9 @@
       }
     },
     "webpack-dev-middleware": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.1.tgz",
-      "integrity": "sha512-5MWu9SH1z3hY7oHOV6Kbkz5x7hXbxK56mGHNqHTe6d+ewxOwKUxoUJBs7QIaJb33lPjl9bJZ3X0vCoooUzC36A==",
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
+      "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
       "dev": true,
       "requires": {
         "memory-fs": "^0.4.1",
@@ -25448,41 +27128,41 @@
       }
     },
     "webpack-dev-server": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz",
-      "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==",
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz",
+      "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==",
       "dev": true,
       "requires": {
         "ansi-html": "0.0.7",
         "bonjour": "^3.5.0",
-        "chokidar": "^2.1.6",
+        "chokidar": "^2.1.8",
         "compression": "^1.7.4",
         "connect-history-api-fallback": "^1.6.0",
         "debug": "^4.1.1",
         "del": "^4.1.1",
         "express": "^4.17.1",
         "html-entities": "^1.2.1",
-        "http-proxy-middleware": "^0.19.1",
+        "http-proxy-middleware": "0.19.1",
         "import-local": "^2.0.0",
         "internal-ip": "^4.3.0",
         "ip": "^1.1.5",
-        "is-absolute-url": "^3.0.0",
+        "is-absolute-url": "^3.0.3",
         "killable": "^1.0.1",
-        "loglevel": "^1.6.3",
+        "loglevel": "^1.6.4",
         "opn": "^5.5.0",
         "p-retry": "^3.0.1",
-        "portfinder": "^1.0.21",
+        "portfinder": "^1.0.25",
         "schema-utils": "^1.0.0",
-        "selfsigned": "^1.10.4",
+        "selfsigned": "^1.10.7",
         "semver": "^6.3.0",
         "serve-index": "^1.9.1",
         "sockjs": "0.3.19",
-        "sockjs-client": "1.3.0",
+        "sockjs-client": "1.4.0",
         "spdy": "^4.0.1",
         "strip-ansi": "^3.0.1",
         "supports-color": "^6.1.0",
         "url": "^0.11.0",
-        "webpack-dev-middleware": "^3.7.0",
+        "webpack-dev-middleware": "^3.7.2",
         "webpack-log": "^2.0.0",
         "ws": "^6.2.1",
         "yargs": "12.0.5"
@@ -25753,9 +27433,9 @@
           }
         },
         "sockjs-client": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
-          "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
+          "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
           "dev": true,
           "requires": {
             "debug": "^3.2.5",
@@ -25910,9 +27590,9 @@
       "dev": true
     },
     "whatwg-url": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
-      "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+      "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
       "dev": true,
       "requires": {
         "lodash.sortby": "^4.7.0",
@@ -26201,28 +27881,55 @@
         "js-yaml": "^3.5.2"
       }
     },
-    "yargs-unparser": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz",
-      "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==",
+    "yargs": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz",
+      "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=",
       "dev": true,
       "requires": {
-        "flat": "^4.1.0",
-        "lodash": "^4.17.11",
-        "yargs": "^12.0.5"
+        "camelcase": "^4.1.0",
+        "cliui": "^3.2.0",
+        "decamelize": "^1.1.1",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^2.0.0",
+        "read-pkg-up": "^2.0.0",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^1.0.1",
+        "set-blocking": "^2.0.0",
+        "string-width": "^2.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^3.2.1",
+        "yargs-parser": "^7.0.0"
       },
       "dependencies": {
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
           "dev": true,
           "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wrap-ansi": "^2.0.0"
+          },
+          "dependencies": {
+            "string-width": {
+              "version": "1.0.2",
+              "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+              "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+              "dev": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            }
           }
         },
         "decamelize": {
@@ -26231,54 +27938,92 @@
           "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
           "dev": true
         },
-        "execa": {
+        "is-fullwidth-code-point": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
           "dev": true,
           "requires": {
-            "cross-spawn": "^6.0.0",
-            "get-stream": "^4.0.0",
-            "is-stream": "^1.1.0",
-            "npm-run-path": "^2.0.0",
-            "p-finally": "^1.0.0",
-            "signal-exit": "^3.0.0",
-            "strip-eof": "^1.0.0"
+            "number-is-nan": "^1.0.0"
           }
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+      "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^4.1.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        }
+      }
+    },
+    "yargs-unparser": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
+      "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+      "dev": true,
+      "requires": {
+        "flat": "^4.1.0",
+        "lodash": "^4.17.15",
+        "yargs": "^13.3.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
         },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
           "dev": true,
           "requires": {
-            "locate-path": "^3.0.0"
+            "color-convert": "^1.9.0"
           }
         },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
           "dev": true,
           "requires": {
-            "pump": "^3.0.0"
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
           }
         },
-        "invert-kv": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
-          "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+        "decamelize": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+          "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
           "dev": true
         },
-        "lcid": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-          "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
           "dev": true,
           "requires": {
-            "invert-kv": "^2.0.0"
+            "locate-path": "^3.0.0"
           }
         },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+          "dev": true
+        },
         "locate-path": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
@@ -26289,82 +28034,89 @@
             "path-exists": "^3.0.0"
           }
         },
-        "mem": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
-          "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
+        "p-limit": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+          "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
           "dev": true,
           "requires": {
-            "map-age-cleaner": "^0.1.1",
-            "mimic-fn": "^2.0.0",
-            "p-is-promise": "^2.0.0"
+            "p-try": "^2.0.0"
           }
         },
-        "mimic-fn": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
           "dev": true
         },
-        "os-locale": {
+        "string-width": {
           "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-          "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
           "dev": true,
           "requires": {
-            "execa": "^1.0.0",
-            "lcid": "^2.0.0",
-            "mem": "^4.0.0"
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
           }
         },
-        "p-limit": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
-          "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "dev": true,
           "requires": {
-            "p-try": "^2.0.0"
+            "ansi-regex": "^4.1.0"
           }
         },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
           "dev": true,
           "requires": {
-            "p-limit": "^2.0.0"
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
           }
         },
-        "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+        "y18n": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+          "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
           "dev": true
         },
         "yargs": {
-          "version": "12.0.5",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
-          "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+          "version": "13.3.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
+          "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
           "dev": true,
           "requires": {
-            "cliui": "^4.0.0",
-            "decamelize": "^1.2.0",
+            "cliui": "^5.0.0",
             "find-up": "^3.0.0",
-            "get-caller-file": "^1.0.1",
-            "os-locale": "^3.0.0",
+            "get-caller-file": "^2.0.1",
             "require-directory": "^2.1.1",
-            "require-main-filename": "^1.0.1",
+            "require-main-filename": "^2.0.0",
             "set-blocking": "^2.0.0",
-            "string-width": "^2.0.0",
+            "string-width": "^3.0.0",
             "which-module": "^2.0.0",
-            "y18n": "^3.2.1 || ^4.0.0",
-            "yargs-parser": "^11.1.1"
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.1"
           }
         },
         "yargs-parser": {
-          "version": "11.1.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
-          "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+          "version": "13.1.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
+          "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
           "dev": true,
           "requires": {
             "camelcase": "^5.0.0",
@@ -26413,32 +28165,41 @@
       "optional": true
     },
     "yurnalist": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-1.0.5.tgz",
-      "integrity": "sha512-EuLjqX3Q15iVM0UtZa5Ju536uRmklKd2kKhdE5D5fIh8RZmh+pJ8c6wj2oGo0TA+T/Ii2o79cIHCTMfciW8jlA==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-1.1.1.tgz",
+      "integrity": "sha512-WMk8SL262zU/3Cr8twpfx/kdhPDAkhWN9HukNeb1U1xVrwU9iIAsCgYI8J5QMZTz+5N3Et/ZKzvOzVCjd/dAWA==",
       "dev": true,
       "requires": {
         "babel-runtime": "^6.26.0",
-        "chalk": "^2.1.0",
+        "chalk": "^2.4.2",
         "cli-table3": "^0.5.1",
-        "debug": "^4.1.0",
-        "deep-equal": "^1.0.1",
-        "detect-indent": "^5.0.0",
-        "inquirer": "^6.2.0",
+        "debug": "^4.1.1",
+        "deep-equal": "^1.1.0",
+        "detect-indent": "^6.0.0",
+        "inquirer": "^7.0.0",
         "invariant": "^2.2.0",
         "is-builtin-module": "^3.0.0",
         "is-ci": "^2.0.0",
-        "leven": "^2.0.0",
-        "loud-rejection": "^1.2.0",
-        "node-emoji": "^1.6.1",
+        "leven": "^3.1.0",
+        "loud-rejection": "^2.2.0",
+        "node-emoji": "^1.10.0",
         "object-path": "^0.11.2",
         "read": "^1.0.7",
-        "rimraf": "^2.5.0",
-        "semver": "^5.1.0",
-        "strip-ansi": "^5.0.0",
-        "strip-bom": "^3.0.0"
+        "rimraf": "^3.0.0",
+        "semver": "^6.3.0",
+        "strip-ansi": "^5.2.0",
+        "strip-bom": "^4.0.0"
       },
       "dependencies": {
+        "ansi-escapes": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
+          "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.5.2"
+          }
+        },
         "ansi-regex": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
@@ -26457,6 +28218,15 @@
           "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
           "dev": true
         },
+        "cli-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+          "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^3.1.0"
+          }
+        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -26466,6 +28236,48 @@
             "ms": "^2.1.1"
           }
         },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+          "dev": true
+        },
+        "figures": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz",
+          "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        },
+        "inquirer": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz",
+          "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^4.2.1",
+            "chalk": "^2.4.2",
+            "cli-cursor": "^3.1.0",
+            "cli-width": "^2.0.0",
+            "external-editor": "^3.0.3",
+            "figures": "^3.0.0",
+            "lodash": "^4.17.15",
+            "mute-stream": "0.0.8",
+            "run-async": "^2.2.0",
+            "rxjs": "^6.4.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^5.1.0",
+            "through": "^2.3.6"
+          }
+        },
         "is-builtin-module": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.0.0.tgz",
@@ -26484,26 +28296,69 @@
             "ci-info": "^2.0.0"
           }
         },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "loud-rejection": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz",
+          "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==",
+          "dev": true,
+          "requires": {
+            "currently-unhandled": "^0.4.1",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
           "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
           "dev": true
         },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+        "mute-stream": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+          "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
           "dev": true,
           "requires": {
-            "glob": "^7.1.3"
+            "mimic-fn": "^2.1.0"
           }
         },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
+        "restore-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+          "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+          "dev": true,
+          "requires": {
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "string-width": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz",
+          "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^5.2.0"
+          }
         },
         "strip-ansi": {
           "version": "5.2.0",
@@ -26513,6 +28368,18 @@
           "requires": {
             "ansi-regex": "^4.1.0"
           }
+        },
+        "strip-bom": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+          "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+          "dev": true
+        },
+        "type-fest": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
+          "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==",
+          "dev": true
         }
       }
     }
diff --git a/package.json b/package.json
index 6bd110d3c8fca4be17fba824829e89de13b770a0..68a87d32f5accf9e50b9215001e3fdd00d93fb7d 100644
--- a/package.json
+++ b/package.json
@@ -22,24 +22,24 @@
     "url": "https://github.com/badges/shields"
   },
   "dependencies": {
-    "@hapi/joi": "^16.1.4",
-    "@sentry/node": "^5.6.2",
+    "@hapi/joi": "^16.1.7",
+    "@sentry/node": "^5.7.1",
     "bytes": "^3.1.0",
     "camelcase": "^5.3.1",
     "camp": "~17.2.4",
     "chalk": "^2.4.2",
     "check-node-version": "^4.0.1",
     "chrome-web-store-item-property": "~1.1.2",
-    "config": "^3.2.2",
-    "cross-env": "^6.0.0",
+    "config": "^3.2.4",
+    "cross-env": "^6.0.3",
     "decamelize": "^3.2.0",
-    "dotenv": "^8.1.0",
+    "dotenv": "^8.2.0",
     "emojic": "^1.1.15",
     "escape-string-regexp": "^2.0.0",
-    "fast-xml-parser": "^3.12.20",
+    "fast-xml-parser": "^3.14.0",
     "fsos": "^1.1.6",
     "gh-badges": "file:gh-badges",
-    "glob": "^7.1.4",
+    "glob": "^7.1.6",
     "graphql": "^14.5.8",
     "graphql-tag": "^2.10.1",
     "ioredis": "4.14.1",
@@ -59,7 +59,7 @@
     "query-string": "^6.8.3",
     "request": "~2.88.0",
     "semver": "~6.3.0",
-    "simple-icons": "1.16.0",
+    "simple-icons": "1.19.1",
     "xmldom": "~0.1.27",
     "xpath": "~0.0.27"
   },
@@ -144,29 +144,29 @@
     ]
   },
   "devDependencies": {
-    "@babel/core": "^7.6.2",
-    "@babel/plugin-proposal-class-properties": "^7.5.5",
+    "@babel/core": "^7.7.2",
+    "@babel/plugin-proposal-class-properties": "^7.7.0",
     "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
-    "@babel/polyfill": "^7.6.0",
-    "@babel/preset-env": "^7.6.2",
-    "@babel/register": "7.6.2",
+    "@babel/polyfill": "^7.7.0",
+    "@babel/preset-env": "^7.7.1",
+    "@babel/register": "7.7.0",
     "@mapbox/react-click-to-select": "^2.2.0",
-    "@types/chai": "^4.2.3",
+    "@types/chai": "^4.2.4",
     "@types/chai-enzyme": "^0.6.7",
     "@types/enzyme": "^3.10.3",
     "@types/lodash.debounce": "^4.0.6",
     "@types/lodash.groupby": "^4.6.6",
     "@types/mocha": "^5.2.7",
-    "@types/node": "^12.7.5",
-    "@types/react-helmet": "^5.0.10",
-    "@types/react-modal": "^3.8.3",
-    "@types/react-select": "^3.0.4",
+    "@types/node": "^12.12.6",
+    "@types/react-helmet": "^5.0.14",
+    "@types/react-modal": "^3.10.0",
+    "@types/react-select": "^3.0.8",
     "@types/styled-components": "4.1.8",
     "@typescript-eslint/eslint-plugin": "^1.13.0",
     "@typescript-eslint/parser": "^1.13.0",
     "babel-plugin-inline-react-svg": "^1.1.0",
     "babel-plugin-istanbul": "^5.2.0",
-    "babel-preset-gatsby": "^0.2.17",
+    "babel-preset-gatsby": "^0.2.20",
     "caller": "^1.0.1",
     "chai": "^4.1.2",
     "chai-datetime": "^1.5.0",
@@ -174,72 +174,72 @@
     "chai-string": "^1.4.0",
     "child-process-promise": "^2.2.1",
     "clipboard-copy": "^3.1.0",
-    "concurrently": "^4.1.2",
-    "cypress": "^3.4.1",
-    "danger": "^9.2.1",
+    "concurrently": "^5.0.0",
+    "cypress": "^3.6.0",
+    "danger": "^9.2.4",
     "danger-plugin-no-test-shortcuts": "^2.0.0",
     "enzyme": "^3.10.0",
-    "enzyme-adapter-react-16": "^1.14.0",
+    "enzyme-adapter-react-16": "^1.15.1",
     "eslint": "^5.16.0",
-    "eslint-config-prettier": "^6.3.0",
+    "eslint-config-prettier": "^6.5.0",
     "eslint-config-standard": "^12.0.0",
     "eslint-config-standard-jsx": "^8.1.0",
     "eslint-config-standard-react": "^9.0.0",
-    "eslint-plugin-chai-friendly": "^0.4.1",
+    "eslint-plugin-chai-friendly": "^0.5.0",
     "eslint-plugin-cypress": "^2.7.0",
     "eslint-plugin-import": "^2.18.2",
-    "eslint-plugin-jsdoc": "^15.9.4",
-    "eslint-plugin-mocha": "^6.1.1",
+    "eslint-plugin-jsdoc": "^17.1.1",
+    "eslint-plugin-mocha": "^6.2.1",
     "eslint-plugin-no-extension-in-require": "^0.2.0",
     "eslint-plugin-node": "^10.0.0",
     "eslint-plugin-promise": "^4.2.1",
-    "eslint-plugin-react": "^7.14.3",
-    "eslint-plugin-react-hooks": "^2.0.1",
+    "eslint-plugin-react": "^7.16.0",
+    "eslint-plugin-react-hooks": "^2.2.0",
     "eslint-plugin-sort-class-members": "^1.6.0",
     "eslint-plugin-standard": "^4.0.1",
     "fetch-ponyfill": "^6.1.0",
     "fs-readfile-promise": "^3.0.1",
-    "gatsby": "2.15.15",
-    "gatsby-plugin-catch-links": "^2.1.12",
-    "gatsby-plugin-page-creator": "^2.1.23",
-    "gatsby-plugin-react-helmet": "^3.1.10",
-    "gatsby-plugin-remove-trailing-slashes": "^2.1.7",
-    "gatsby-plugin-styled-components": "^3.1.6",
-    "gatsby-plugin-typescript": "^2.1.9",
+    "gatsby": "2.17.10",
+    "gatsby-plugin-catch-links": "^2.1.15",
+    "gatsby-plugin-page-creator": "^2.1.28",
+    "gatsby-plugin-react-helmet": "^3.1.13",
+    "gatsby-plugin-remove-trailing-slashes": "^2.1.12",
+    "gatsby-plugin-styled-components": "^3.1.11",
+    "gatsby-plugin-typescript": "^2.1.15",
     "got": "^9.6.0",
     "humanize-string": "^2.1.0",
-    "husky": "^3.0.5",
+    "husky": "^3.0.9",
     "icedfrisby": "3.0.0",
     "icedfrisby-nock": "^2.0.0",
     "is-png": "^2.0.0",
     "is-svg": "^4.2.0",
     "js-yaml-loader": "^1.2.2",
     "jsdoc": "^3.6.3",
-    "lint-staged": "^9.4.0",
+    "lint-staged": "^9.4.2",
     "lodash.debounce": "^4.0.8",
     "lodash.difference": "^4.5.0",
     "lodash.groupby": "^4.6.0",
     "minimist": "^1.2.0",
     "mkdirp": "^0.5.1",
-    "mocha": "^6.2.0",
+    "mocha": "^6.2.2",
     "mocha-env-reporter": "^4.0.0",
     "mocha-junit-reporter": "^1.23.1",
     "mocha-yaml-loader": "^1.0.3",
-    "nock": "11.3.5",
+    "nock": "11.7.0",
     "node-mocks-http": "^1.8.0",
-    "nodemon": "^1.19.2",
+    "nodemon": "^1.19.4",
     "npm-run-all": "^4.1.5",
     "nyc": "^14.1.1",
     "opn-cli": "^5.0.0",
-    "portfinder": "^1.0.24",
+    "portfinder": "^1.0.25",
     "prettier": "1.18.2",
-    "react": "^16.9.0",
-    "react-dom": "^16.9.0",
-    "react-error-overlay": "^6.0.2",
+    "react": "^16.11.0",
+    "react-dom": "^16.11.0",
+    "react-error-overlay": "^6.0.3",
     "react-helmet": "^5.2.1",
-    "react-modal": "^3.10.1",
-    "react-pose": "^4.0.8",
-    "react-select": "^3.0.5",
+    "react-modal": "^3.11.1",
+    "react-pose": "^4.0.9",
+    "react-select": "^3.0.8",
     "read-all-stdin-sync": "^1.0.5",
     "redis-server": "^1.2.2",
     "require-hacker": "^3.0.1",
@@ -247,12 +247,12 @@
     "sazerac": "^1.1.0",
     "sinon": "^7.5.0",
     "sinon-chai": "^3.3.0",
-    "snap-shot-it": "^7.8.0",
-    "start-server-and-test": "^1.10.2",
-    "styled-components": "^4.3.2",
+    "snap-shot-it": "^7.9.0",
+    "start-server-and-test": "^1.10.6",
+    "styled-components": "^4.4.1",
     "tmp": "0.1.0",
     "ts-mocha": "^6.0.0",
-    "typescript": "^3.6.3",
+    "typescript": "^3.6.4",
     "url": "^0.11.0",
     "walkdir": "0.4.1"
   },
diff --git a/services/aur/aur.service.js b/services/aur/aur.service.js
index 442e386b00fc20224af2aa57ade8b03eb45f65e7..604db37bcbe7a84e0d276a418ffdedd66f0176f0 100644
--- a/services/aur/aur.service.js
+++ b/services/aur/aur.service.js
@@ -13,7 +13,9 @@ const aurSchema = Joi.object({
       .length(0)
       .required(),
     Joi.object({
-      License: Joi.string().required(),
+      License: Joi.string()
+        .required()
+        .allow(null),
       NumVotes: nonNegativeInteger,
       Version: Joi.string().required(),
       OutOfDate: nonNegativeInteger.allow(null),
@@ -61,8 +63,8 @@ class AurLicense extends BaseAurService {
     return [
       {
         title: 'AUR license',
-        namedParams: { packageName: 'pac' },
-        staticPreview: this.render({ license: 'MIT' }),
+        namedParams: { packageName: 'android-studio' },
+        staticPreview: this.render({ license: 'Apache' }),
       },
     ]
   }
@@ -75,9 +77,19 @@ class AurLicense extends BaseAurService {
     return { message: license, color: 'blue' }
   }
 
+  transform(json) {
+    const license = json.results.License
+    if (!license) {
+      throw new NotFound({ prettyMessage: 'not specified' })
+    }
+
+    return { license }
+  }
+
   async handle({ packageName }) {
     const json = await this.fetch({ packageName })
-    return this.constructor.render({ license: json.results.License })
+    const { license } = this.transform(json)
+    return this.constructor.render({ license })
   }
 }
 
diff --git a/services/aur/aur.tester.js b/services/aur/aur.tester.js
index 7aca54d00dd2e67990cefbfe1dd19faa95dadd0d..c6b4d8d9d4e9957c3c2f4d6f1e732d58fe449ecf 100644
--- a/services/aur/aur.tester.js
+++ b/services/aur/aur.tester.js
@@ -14,7 +14,7 @@ const t = (module.exports = new ServiceTester({
 // version tests
 
 t.create('version (valid)')
-  .get('/version/dropbox.json')
+  .get('/version/visual-studio-code-bin.json')
   .expectBadge({
     label: 'aur',
     message: isVPlusDottedVersionNClausesWithOptionalSuffix,
@@ -49,9 +49,13 @@ t.create('votes (not found)')
 // license tests
 
 t.create('license (valid)')
-  .get('/license/pac.json')
+  .get('/license/vscodium-bin.json')
   .expectBadge({ label: 'license', message: 'MIT' })
 
-t.create('license (not found)')
+t.create('license (no license)')
+  .get('/license/dns-zone-blacklist-git.json')
+  .expectBadge({ label: 'license', message: 'not specified' })
+
+t.create('license (package not found)')
   .get('/license/not-a-package.json')
   .expectBadge({ label: 'license', message: 'package not found' })
diff --git a/services/bugzilla/bugzilla.service.js b/services/bugzilla/bugzilla.service.js
index a610406ec06ce676228acd8842b1634f930a6fc6..b7473c213832033815fe958d5fced28d6ab440e0 100644
--- a/services/bugzilla/bugzilla.service.js
+++ b/services/bugzilla/bugzilla.service.js
@@ -13,7 +13,9 @@ const schema = Joi.object({
     .items(
       Joi.object({
         status: Joi.string().required(),
-        resolution: Joi.string().required(),
+        resolution: Joi.string()
+          .allow('')
+          .required(),
       }).required()
     )
     .min(1)
diff --git a/services/categories.js b/services/categories.js
index 985718576a0906e1b4e34e183a23ef9550a2b616..fc45a33520bd7d39fa6c026f7977d5772b782576 100644
--- a/services/categories.js
+++ b/services/categories.js
@@ -1,21 +1,25 @@
 'use strict'
 
 module.exports = [
-  { id: 'build', name: 'Build' },
-  { id: 'coverage', name: 'Code Coverage' },
-  { id: 'analysis', name: 'Analysis' },
-  { id: 'chat', name: 'Chat' },
-  { id: 'dependencies', name: 'Dependencies' },
-  { id: 'size', name: 'Size' },
-  { id: 'downloads', name: 'Downloads' },
-  { id: 'funding', name: 'Funding' },
-  { id: 'issue-tracking', name: 'Issue Tracking' },
-  { id: 'license', name: 'License' },
-  { id: 'rating', name: 'Rating' },
-  { id: 'social', name: 'Social' },
-  { id: 'version', name: 'Version' },
-  { id: 'platform-support', name: 'Platform & Version Support' },
-  { id: 'monitoring', name: 'Monitoring' },
-  { id: 'activity', name: 'Activity' },
-  { id: 'other', name: 'Other' },
+  { id: 'build', name: 'Build', keywords: ['build'] },
+  { id: 'coverage', name: 'Code Coverage', keywords: ['coverage'] },
+  { id: 'analysis', name: 'Analysis', keywords: ['analysis'] },
+  { id: 'chat', name: 'Chat', keywords: ['chat'] },
+  { id: 'dependencies', name: 'Dependencies', keywords: ['dependencies'] },
+  { id: 'size', name: 'Size', keywords: ['size'] },
+  { id: 'downloads', name: 'Downloads', keywords: ['downloads'] },
+  { id: 'funding', name: 'Funding', keywords: ['funding'] },
+  { id: 'issue-tracking', name: 'Issue Tracking', keywords: ['issue'] },
+  { id: 'license', name: 'License', keywords: ['license'] },
+  { id: 'rating', name: 'Rating', keywords: ['rating'] },
+  { id: 'social', name: 'Social', keywords: ['social'] },
+  { id: 'version', name: 'Version', keywords: ['version'] },
+  {
+    id: 'platform-support',
+    name: 'Platform & Version Support',
+    keywords: ['platform'],
+  },
+  { id: 'monitoring', name: 'Monitoring', keywords: ['monitoring'] },
+  { id: 'activity', name: 'Activity', keywords: ['activity'] },
+  { id: 'other', name: 'Other', keywords: [] },
 ]
diff --git a/services/codeclimate/codeclimate-analysis.service.js b/services/codeclimate/codeclimate-analysis.service.js
index 9d72feb183d267ead890b580501b573bcc78a44f..f1fdb3c5f01b9a4cd1c821920f65937038e7c062 100644
--- a/services/codeclimate/codeclimate-analysis.service.js
+++ b/services/codeclimate/codeclimate-analysis.service.js
@@ -109,7 +109,7 @@ module.exports = class CodeclimateAnalysis extends BaseJsonService {
         namedParams: {
           format: 'maintainability',
           user: 'angular',
-          repo: 'angular.js',
+          repo: 'angular',
         },
         staticPreview: this.render({
           variant: 'maintainability',
@@ -130,7 +130,7 @@ module.exports = class CodeclimateAnalysis extends BaseJsonService {
       {
         title: 'Code Climate technical debt',
         pattern: 'tech-debt/:user/:repo',
-        namedParams: { user: 'jekyll', repo: 'jekyll' },
+        namedParams: { user: 'angular', repo: 'angular' },
         staticPreview: this.render({
           variant: 'tech-debt',
           techDebtPercentage: 3.0,
diff --git a/services/codeclimate/codeclimate-analysis.tester.js b/services/codeclimate/codeclimate-analysis.tester.js
index 1b2dc6d70a0ba3dadd00fc2248193a0983322ea5..c3f5773b51a74bdd62968f2197d2da15dd08c56c 100644
--- a/services/codeclimate/codeclimate-analysis.tester.js
+++ b/services/codeclimate/codeclimate-analysis.tester.js
@@ -5,7 +5,7 @@ const { isIntegerPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('issues count')
-  .get('/issues/angular/angular.js.json')
+  .get('/issues/angular/angular.json')
   .expectBadge({
     label: 'issues',
     message: Joi.number()
@@ -14,21 +14,21 @@ t.create('issues count')
   })
 
 t.create('technical debt percentage')
-  .get('/tech-debt/angular/angular.js.json')
+  .get('/tech-debt/angular/angular.json')
   .expectBadge({
     label: 'technical debt',
     message: isIntegerPercentage,
   })
 
 t.create('maintainability percentage')
-  .get('/maintainability-percentage/angular/angular.js.json')
+  .get('/maintainability-percentage/angular/angular.json')
   .expectBadge({
     label: 'maintainability',
     message: isIntegerPercentage,
   })
 
 t.create('maintainability letter')
-  .get('/maintainability/angular/angular.js.json')
+  .get('/maintainability/angular/angular.json')
   .expectBadge({
     label: 'maintainability',
     message: Joi.equal('A', 'B', 'C', 'D', 'E', 'F'),
@@ -49,10 +49,10 @@ t.create('maintainability letter for repo without snapshots')
   })
 
 t.create('malformed response for outer user repos query')
-  .get('/maintainability/angular/angular.js.json')
+  .get('/maintainability/angular/angular.json')
   .intercept(nock =>
     nock('https://api.codeclimate.com')
-      .get('/v1/repos?github_slug=angular%2Fangular.js')
+      .get('/v1/repos?github_slug=angular%2Fangular')
       .reply(200, {
         data: [{}], // No relationships in the list of data elements.
       })
@@ -63,7 +63,7 @@ t.create('malformed response for outer user repos query')
   })
 
 t.create('malformed response for inner specific repo query')
-  .get('/maintainability/angular/angular.js.json')
+  .get('/maintainability/angular/angular.json')
   .intercept(nock =>
     nock('https://api.codeclimate.com', { allowUnmocked: true })
       .get(/\/v1\/repos\/[a-z0-9]+\/snapshots\/[a-z0-9]+/)
diff --git a/services/codefactor/codefactor-helpers.js b/services/codefactor/codefactor-helpers.js
index 854086a3e0f3edf860045d92fddf767f2f14e244..e27c73c7b1eb72835cf7a627d9bf6666168fd6e1 100644
--- a/services/codefactor/codefactor-helpers.js
+++ b/services/codefactor/codefactor-helpers.js
@@ -3,7 +3,9 @@
 const Joi = require('@hapi/joi')
 
 // https://support.codefactor.io/i14-glossary
+// https://github.com/badges/shields/issues/4269
 const colorMap = {
+  'A+': 'brightgreen',
   A: 'brightgreen',
   'A-': 'green',
   'B+': 'yellowgreen',
diff --git a/services/crates/crates-base.js b/services/crates/crates-base.js
index 2552ccc8b455e613677238ae687b6093f7f2e42a..00a5742378426338ea16d17b5b934e4b7f8b40a4 100644
--- a/services/crates/crates-base.js
+++ b/services/crates/crates-base.js
@@ -9,6 +9,7 @@ const keywords = ['Rust']
 const crateSchema = Joi.object({
   crate: Joi.object({
     downloads: nonNegativeInteger,
+    recent_downloads: nonNegativeInteger,
     max_version: Joi.string().required(),
   }).required(),
   versions: Joi.array()
diff --git a/services/crates/crates-downloads.service.js b/services/crates/crates-downloads.service.js
index 4e34e9bcf4f7c57901e41c5881c2d9277e3c213b..0a636b1e3fb6579ab119809116a7e0a6c17cc375 100644
--- a/services/crates/crates-downloads.service.js
+++ b/services/crates/crates-downloads.service.js
@@ -3,6 +3,7 @@
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseCratesService, keywords } = require('./crates-base')
+const { InvalidParameter, NotFound } = require('..')
 
 module.exports = class CratesDownloads extends BaseCratesService {
   static get category() {
@@ -12,7 +13,7 @@ module.exports = class CratesDownloads extends BaseCratesService {
   static get route() {
     return {
       base: 'crates',
-      pattern: ':variant(d|dv)/:crate/:version?',
+      pattern: ':variant(d|dv|dr)/:crate/:version?',
     }
   }
 
@@ -20,34 +21,56 @@ module.exports = class CratesDownloads extends BaseCratesService {
     return [
       {
         title: 'Crates.io',
-        pattern: ':variant(d|dv)/:crate',
-        namedParams: { variant: 'd', crate: 'rustc-serialize' },
-        staticPreview: this.render({ downloads: 5000000 }),
+        pattern: 'd/:crate',
+        namedParams: {
+          crate: 'rustc-serialize',
+        },
+        staticPreview: this.render({ variant: 'd', downloads: 5000000 }),
         keywords,
       },
       {
-        title: 'Crates.io',
-        pattern: ':variant(d|dv)/:crate/:version',
+        title: 'Crates.io (latest)',
+        pattern: 'dv/:crate',
+        namedParams: {
+          crate: 'rustc-serialize',
+        },
+        staticPreview: this.render({ variant: 'dv', downloads: 2000000 }),
+        keywords,
+      },
+      {
+        title: 'Crates.io (version)',
+        pattern: 'dv/:crate/:version',
         namedParams: {
-          variant: 'd',
           crate: 'rustc-serialize',
           version: '0.3.24',
         },
-        staticPreview: this.render({ downloads: 2000000, version: '0.3.24' }),
+        staticPreview: this.render({
+          variant: 'dv',
+          downloads: 2000000,
+          version: '0.3.24',
+        }),
+        keywords,
+      },
+      {
+        title: 'Crates.io (recent)',
+        pattern: 'dr/:crate',
+        namedParams: {
+          crate: 'rustc-serialize',
+        },
+        staticPreview: this.render({ variant: 'dr', downloads: 2000000 }),
         keywords,
       },
     ]
   }
 
   static _getLabel(version, variant) {
-    if (version) {
-      return `downloads@${version}`
-    } else {
-      if (variant === 'dv') {
-        return 'downloads@latest'
-      } else {
-        return 'downloads'
-      }
+    switch (variant) {
+      case 'dv':
+        return version ? `downloads@${version}` : 'downloads@latest'
+      case 'dr':
+        return 'recent downloads'
+      default:
+        return version ? `downloads@${version}` : 'downloads'
     }
   }
 
@@ -59,7 +82,27 @@ module.exports = class CratesDownloads extends BaseCratesService {
     }
   }
 
+  transform({ variant, json }) {
+    switch (variant) {
+      case 'dv':
+        return json.crate ? json.versions[0].downloads : json.version.downloads
+      case 'dr':
+        return json.crate.recent_downloads
+      default:
+        return json.crate ? json.crate.downloads : json.version.downloads
+    }
+  }
+
   async handle({ variant, crate, version }) {
+    if (variant === 'dr' && version) {
+      /* crates.io doesn't currently expose
+         recent download counts for individual
+         versions */
+      throw new InvalidParameter({
+        prettyMessage: 'recent downloads not supported for specific versions',
+      })
+    }
+
     const json = await this.fetch({ crate, version })
 
     if (json.errors) {
@@ -68,17 +111,11 @@ module.exports = class CratesDownloads extends BaseCratesService {
          or
          https://crates.io/api/v1/crates/libc/0.1.76
          returns a 200 OK with an errors object */
-      return { message: json.errors[0].detail }
+      throw new NotFound({ prettyMessage: json.errors[0].detail })
     }
 
-    let downloads
-    if (variant === 'dv') {
-      downloads = json.version
-        ? json.version.downloads
-        : json.versions[0].downloads
-    } else {
-      downloads = json.crate ? json.crate.downloads : json.version.downloads
-    }
+    const downloads = this.transform({ variant, json })
+
     return this.constructor.render({ variant, downloads, version })
   }
 }
diff --git a/services/crates/crates-downloads.tester.js b/services/crates/crates-downloads.tester.js
index 1f81301dec5f713c38fc86625d83ab7d2a1965fd..b56f956255a8822513787c3444651f2ecd013ed6 100644
--- a/services/crates/crates-downloads.tester.js
+++ b/services/crates/crates-downloads.tester.js
@@ -34,6 +34,20 @@ t.create('downloads for version (with version)')
     message: isMetric,
   })
 
+t.create('recent downloads')
+  .get('/dr/libc.json')
+  .expectBadge({
+    label: 'recent downloads',
+    message: isMetric,
+  })
+
+t.create('recent downloads (with version)')
+  .get('/dr/libc/0.2.31.json')
+  .expectBadge({
+    label: 'crates.io',
+    message: 'recent downloads not supported for specific versions',
+  })
+
 t.create('downloads (invalid version)')
   .get('/d/libc/7.json')
   .expectBadge({ label: 'crates.io', message: 'invalid semver: 7' })
diff --git a/services/discord/discord.service.js b/services/discord/discord.service.js
index 3791781be0ae7091cbbea706e797e1756ef91747..61acbe235551a616ea070b2b8b77033903b4b158 100644
--- a/services/discord/discord.service.js
+++ b/services/discord/discord.service.js
@@ -9,6 +9,22 @@ const discordSchema = Joi.object({
     .required(),
 }).required()
 
+const documentation = `
+<p>
+  The Discord badge requires the <code>SERVER ID</code> in order access the Discord JSON API.
+</p>
+<p>
+  The <code>SERVER ID</code> can be located in the url of the channel that the badge is accessing.
+</p>
+<img
+  src="https://user-images.githubusercontent.com/6025893/39329897-b08f8290-4997-11e8-8f8f-7b85ff61882f.png"
+  alt="SERVER ID is after the channel part at the end of the url" />
+<p>
+  To use the Discord badge a Discord server admin must enable the widget setting on the server.
+</p>
+<iframe src="https://player.vimeo.com/video/364220040" width="640" height="210" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>
+`
+
 module.exports = class Discord extends BaseJsonService {
   static get category() {
     return 'chat'
@@ -27,6 +43,7 @@ module.exports = class Discord extends BaseJsonService {
         title: 'Discord',
         namedParams: { serverId: '102860784329052160' },
         staticPreview: this.render({ members: 23 }),
+        documentation,
       },
     ]
   }
diff --git a/services/dynamic/dynamic-xml.service.js b/services/dynamic/dynamic-xml.service.js
index d39ad95a36315642d7a9163a648bd6b3e09c90b4..0182024f693c2b3005d12afb7fe5c3ee3b7780cc 100644
--- a/services/dynamic/dynamic-xml.service.js
+++ b/services/dynamic/dynamic-xml.service.js
@@ -27,18 +27,11 @@ module.exports = class DynamicXml extends BaseService {
     }
   }
 
-  async handle(namedParams, { url, query: pathExpression, prefix, suffix }) {
+  transform({ pathExpression, buffer }) {
     // e.g. //book[2]/@id
     const pathIsAttr = (
       pathExpression.split('/').slice(-1)[0] || ''
     ).startsWith('@')
-
-    const { buffer } = await this._request({
-      url,
-      options: { headers: { Accept: 'application/xml, text/xml' } },
-      errorMessages,
-    })
-
     const parsed = new DOMParser().parseFromString(buffer)
 
     let values
@@ -47,14 +40,50 @@ module.exports = class DynamicXml extends BaseService {
     } catch (e) {
       throw new InvalidParameter({ prettyMessage: e.message })
     }
-    values = values.map((node, i) =>
-      pathIsAttr ? node.value : node.firstChild.data
-    )
+
+    if (
+      typeof values === 'string' ||
+      typeof values === 'number' ||
+      typeof values === 'boolean'
+    ) {
+      values = [values]
+    } else if (Array.isArray(values)) {
+      values = values.reduce((accum, node) => {
+        if (pathIsAttr) {
+          accum.push(node.value)
+        } else if (node.firstChild) {
+          accum.push(node.firstChild.data)
+        } else {
+          accum.push(node.data)
+        }
+
+        return accum
+      }, [])
+    } else {
+      throw new InvalidResponse({
+        prettyMessage: 'unsupported query',
+      })
+    }
 
     if (!values.length) {
       throw new InvalidResponse({ prettyMessage: 'no result' })
     }
 
-    return renderDynamicBadge({ value: values, prefix, suffix })
+    return { values }
+  }
+
+  async handle(_namedParams, { url, query: pathExpression, prefix, suffix }) {
+    const { buffer } = await this._request({
+      url,
+      options: { headers: { Accept: 'application/xml, text/xml' } },
+      errorMessages,
+    })
+
+    const { values: value } = this.transform({
+      pathExpression,
+      buffer,
+    })
+
+    return renderDynamicBadge({ value, prefix, suffix })
   }
 }
diff --git a/services/dynamic/dynamic-xml.spec.js b/services/dynamic/dynamic-xml.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..dd0c92c3e0a36c0a1e0ddcc0989053f6c5e8d903
--- /dev/null
+++ b/services/dynamic/dynamic-xml.spec.js
@@ -0,0 +1,132 @@
+'use strict'
+
+const { expect } = require('chai')
+const sinon = require('sinon')
+const xpath = require('xpath')
+const { test, given } = require('sazerac')
+const DynamicXml = require('./dynamic-xml.service')
+const { InvalidResponse } = require('..')
+
+const exampleXml = `<?xml version="1.0"?>
+<catalog>
+   <book id="bk101">
+      <title>XML Developer's Guide</title>
+      <price>44.95</price>
+      <genre>Computer</genre>
+   </book>
+   <book id="bk102">
+      <title>Midnight Rain</title>
+      <price>5.95</price>
+      <genre></genre>
+   </book>
+</catalog>
+`
+
+describe('DynamicXml', function() {
+  describe('transform()', function() {
+    beforeEach(function() {
+      sinon.stub(xpath, 'select').returns(undefined)
+    })
+
+    afterEach(function() {
+      sinon.restore()
+    })
+
+    it('throws InvalidResponse on unsupported query', function() {
+      expect(() =>
+        DynamicXml.prototype.transform({
+          pathExpression: '//book/title',
+          buffer: exampleXml,
+        })
+      )
+        .to.throw(InvalidResponse)
+        .with.property('prettyMessage', 'unsupported query')
+    })
+  })
+
+  test(DynamicXml.prototype.transform, () => {
+    given({
+      pathExpression: '//book[1]/title/text()',
+      buffer: exampleXml,
+    }).expect({
+      values: ["XML Developer's Guide"],
+    })
+    given({ pathExpression: '//book/title/text()', buffer: exampleXml }).expect(
+      {
+        values: ["XML Developer's Guide", 'Midnight Rain'],
+      }
+    )
+    given({
+      pathExpression: 'string(//book[1]/title)',
+      buffer: exampleXml,
+    }).expect({
+      values: ["XML Developer's Guide"],
+    })
+    given({
+      pathExpression: 'string(//book/title)',
+      buffer: exampleXml,
+    }).expect({
+      values: ["XML Developer's Guide"],
+    })
+    given({
+      pathExpression: 'string(//book[1]/@id)',
+      buffer: exampleXml,
+    }).expect({
+      values: ['bk101'],
+    })
+    given({
+      pathExpression: 'substring(//book[1]/title, 5, 9)',
+      buffer: exampleXml,
+    }).expect({
+      values: ['Developer'],
+    })
+    given({
+      pathExpression: 'number(//book[1]/price)',
+      buffer: exampleXml,
+    }).expect({
+      values: [44.95],
+    })
+    given({
+      pathExpression: 'boolean(string(//book[1]/genre))',
+      buffer: exampleXml,
+    }).expect({
+      values: [true],
+    })
+    given({
+      pathExpression: 'boolean(string(//book[2]/genre))',
+      buffer: exampleXml,
+    }).expect({
+      values: [false],
+    })
+    given({
+      pathExpression: 'count(//book)',
+      buffer: exampleXml,
+    }).expect({
+      values: [2],
+    })
+    given({
+      pathExpression: 'floor(//book[1]/price)',
+      buffer: exampleXml,
+    }).expect({
+      values: [44],
+    })
+    given({
+      pathExpression: "//p[lang('en')]",
+      buffer: '<p xml:lang="en">Midnight Rain</p>',
+    }).expect({
+      values: ['Midnight Rain'],
+    })
+    given({
+      pathExpression: 'normalize-space(string(/title))',
+      buffer: '<title> Midnight  Rain   </title>',
+    }).expect({
+      values: ['Midnight Rain'],
+    })
+    given({
+      pathExpression: '//book[1]/title | //book[1]/price',
+      buffer: exampleXml,
+    }).expect({
+      values: ["XML Developer's Guide", '44.95'],
+    })
+  })
+})
diff --git a/services/dynamic/dynamic-xml.tester.js b/services/dynamic/dynamic-xml.tester.js
index d560bff15939361acf312b5aa5564e2d5035e66a..adca35606b4a6000644d20a51531173735c41160 100644
--- a/services/dynamic/dynamic-xml.tester.js
+++ b/services/dynamic/dynamic-xml.tester.js
@@ -176,3 +176,45 @@ t.create('request should set Accept header')
       .reply(200, exampleXml)
   )
   .expectBadge({ label: 'custom badge', message: 'Midnight Rain' })
+
+t.create('query with node function')
+  .get(
+    `.json?${queryString.stringify({
+      url: exampleUrl,
+      query: '//book[1]/title/text()',
+    })}`
+  )
+  .intercept(withExampleXml)
+  .expectBadge({
+    label: 'custom badge',
+    message: "XML Developer's Guide",
+    color: 'blue',
+  })
+
+t.create('query with type convertion to string')
+  .get(
+    `.json?${queryString.stringify({
+      url: exampleUrl,
+      query: 'string(//book[1]/title)',
+    })}`
+  )
+  .intercept(withExampleXml)
+  .expectBadge({
+    label: 'custom badge',
+    message: "XML Developer's Guide",
+    color: 'blue',
+  })
+
+t.create('query with type convertion to number')
+  .get(
+    `.json?${queryString.stringify({
+      url: exampleUrl,
+      query: 'number(//book[1]/price)',
+    })}`
+  )
+  .intercept(withExampleXml)
+  .expectBadge({
+    label: 'custom badge',
+    message: '44.95',
+    color: 'blue',
+  })
diff --git a/services/github/github-common-fetch.js b/services/github/github-common-fetch.js
index 7defc30804df5c93edf59bdaca63b7798ea73a3e..fefd786176cc96d9e0f08b44eeccb42f7a081ebe 100644
--- a/services/github/github-common-fetch.js
+++ b/services/github/github-common-fetch.js
@@ -24,37 +24,55 @@ const contentSchema = Joi.object({
   encoding: Joi.equal('base64').required(),
 }).required()
 
-async function fetchJsonFromRepo(
+async function fetchRepoContent(
   serviceInstance,
-  { schema, user, repo, branch = 'master', filename }
+  { user, repo, branch = 'master', filename }
 ) {
   const errorMessages = errorMessagesFor(
     `repo not found, branch not found, or ${filename} missing`
   )
   if (serviceInstance.staticAuthConfigured) {
-    const url = `/repos/${user}/${repo}/contents/${filename}`
-    const options = { qs: { ref: branch } }
     const { content } = await serviceInstance._requestJson({
       schema: contentSchema,
-      url,
-      options,
+      url: `/repos/${user}/${repo}/contents/${filename}`,
+      options: { qs: { ref: branch } },
       errorMessages,
     })
 
-    let decoded
     try {
-      decoded = Buffer.from(content, 'base64').toString('utf-8')
+      return Buffer.from(content, 'base64').toString('utf-8')
     } catch (e) {
       throw new InvalidResponse({ prettyMessage: 'undecodable content' })
     }
-    const json = serviceInstance._parseJson(decoded)
+  } else {
+    const { buffer } = await serviceInstance._request({
+      url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filename}`,
+      errorMessages,
+    })
+    return buffer
+  }
+}
+
+async function fetchJsonFromRepo(
+  serviceInstance,
+  { schema, user, repo, branch = 'master', filename }
+) {
+  if (serviceInstance.staticAuthConfigured) {
+    const buffer = await fetchRepoContent(serviceInstance, {
+      user,
+      repo,
+      branch,
+      filename,
+    })
+    const json = serviceInstance._parseJson(buffer)
     return serviceInstance.constructor._validate(json, schema)
   } else {
-    const url = `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filename}`
     return serviceInstance._requestJson({
       schema,
-      url,
-      errorMessages,
+      url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filename}`,
+      errorMessages: errorMessagesFor(
+        `repo not found, branch not found, or ${filename} missing`
+      ),
     })
   }
 }
@@ -79,6 +97,7 @@ async function fetchLatestRelease(serviceInstance, { user, repo }) {
 
 module.exports = {
   fetchIssue,
+  fetchRepoContent,
   fetchJsonFromRepo,
   fetchLatestRelease,
   releaseInfoSchema,
diff --git a/services/github/github-contributors.tester.js b/services/github/github-contributors.tester.js
index 49a669f3625938e2366340d6a4123ea7bb7c31da..bc5cc3ace9887fdf60a59969e8baff1c5acbec82 100644
--- a/services/github/github-contributors.tester.js
+++ b/services/github/github-contributors.tester.js
@@ -4,14 +4,14 @@ const t = (module.exports = require('../tester').createServiceTester())
 const { isMetric } = require('../test-validators')
 
 t.create('Contributors')
-  .get('/contributors/cdnjs/cdnjs.json')
+  .get('/contributors/badges/shields.json')
   .expectBadge({
     label: 'contributors',
     message: isMetric,
   })
 
 t.create('1 contributor')
-  .get('/contributors/paulmelnikow/local-credential-storage.json')
+  .get('/contributors/badges/shields-tests.json')
   .expectBadge({
     label: 'contributors',
     message: '1',
diff --git a/services/github/github-downloads.service.js b/services/github/github-downloads.service.js
index 4b28158250b2fe616893c09f410a83c39e14697d..8c1ea820beceb9ec33eb552390db6b0b1319b2bb 100644
--- a/services/github/github-downloads.service.js
+++ b/services/github/github-downloads.service.js
@@ -22,8 +22,6 @@ const releaseArraySchema = Joi.alternatives().try(
   Joi.array().length(0)
 )
 
-const keywords = ['github download']
-
 module.exports = class GithubDownloads extends GithubAuthV3Service {
   static get category() {
     return 'downloads'
@@ -50,7 +48,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service {
           downloadCount: 857000,
         }),
         documentation,
-        keywords,
       },
       {
         title: 'GitHub Releases',
@@ -66,7 +63,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service {
           downloadCount: 27000,
         }),
         documentation,
-        keywords,
       },
       {
         title: 'GitHub Pre-Releases',
@@ -82,7 +78,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service {
           downloadCount: 2000,
         }),
         documentation,
-        keywords,
       },
       {
         title: 'GitHub Releases (by Release)',
@@ -98,7 +93,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service {
           downloadCount: 490000,
         }),
         documentation,
-        keywords,
       },
       {
         title: 'GitHub Releases (by Asset)',
@@ -115,7 +109,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service {
           downloadCount: 3000,
         }),
         documentation,
-        keywords,
       },
       {
         title: 'GitHub Pre-Releases (by Asset)',
@@ -132,7 +125,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service {
           downloadCount: 237,
         }),
         documentation,
-        keywords,
       },
     ]
   }
diff --git a/services/github/github-forks.service.js b/services/github/github-forks.service.js
index 65e84f717034dc9d6b01a4ab17b0e7ec864dd005..97a9bcae49b58a8ddc0f88d85b7a910acbf2afa2 100644
--- a/services/github/github-forks.service.js
+++ b/services/github/github-forks.service.js
@@ -10,9 +10,7 @@ const { documentation, transformErrors } = require('./github-helpers')
 const schema = Joi.object({
   data: Joi.object({
     repository: Joi.object({
-      forks: Joi.object({
-        totalCount: nonNegativeInteger,
-      }).required(),
+      forkCount: nonNegativeInteger,
     }).required(),
   }).required(),
 }).required()
@@ -78,9 +76,7 @@ module.exports = class GithubForks extends GithubAuthV4Service {
       query: gql`
         query($user: String!, $repo: String!) {
           repository(owner: $user, name: $repo) {
-            forks {
-              totalCount
-            }
+            forkCount
           }
         }
       `,
@@ -91,7 +87,7 @@ module.exports = class GithubForks extends GithubAuthV4Service {
     return this.constructor.render({
       user,
       repo,
-      forkCount: json.data.repository.forks.totalCount,
+      forkCount: json.data.repository.forkCount,
     })
   }
 }
diff --git a/services/github/github-go-mod.service.js b/services/github/github-go-mod.service.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8f7f010d09adab1bd18ca8ff7a858eaae952057
--- /dev/null
+++ b/services/github/github-go-mod.service.js
@@ -0,0 +1,109 @@
+'use strict'
+
+const Joi = require('@hapi/joi')
+const { renderVersionBadge } = require('../version')
+const { ConditionalGithubAuthV3Service } = require('./github-auth-service')
+const { fetchRepoContent } = require('./github-common-fetch')
+const { documentation } = require('./github-helpers')
+const { InvalidResponse } = require('..')
+
+const queryParamSchema = Joi.object({
+  filename: Joi.string(),
+}).required()
+
+const goVersionRegExp = new RegExp('^go (.+)$', 'm')
+
+const keywords = ['golang']
+
+module.exports = class GithubGoModGoVersion extends ConditionalGithubAuthV3Service {
+  static get category() {
+    return 'version'
+  }
+
+  static get route() {
+    return {
+      base: 'github/go-mod/go-version',
+      pattern: ':user/:repo/:branch*',
+      queryParamSchema,
+    }
+  }
+
+  static get examples() {
+    return [
+      {
+        title: 'GitHub go.mod Go version',
+        pattern: ':user/:repo',
+        namedParams: { user: 'gohugoio', repo: 'hugo' },
+        staticPreview: this.render({ version: '1.12' }),
+        documentation,
+        keywords,
+      },
+      {
+        title: 'GitHub go.mod Go version (branch)',
+        pattern: ':user/:repo/:branch',
+        namedParams: {
+          user: 'gohugoio',
+          repo: 'hugo',
+          branch: 'master',
+        },
+        staticPreview: this.render({ version: '1.12', branch: 'master' }),
+        documentation,
+        keywords,
+      },
+      {
+        title: 'GitHub go.mod Go version (subfolder of monorepo)',
+        pattern: ':user/:repo',
+        namedParams: { user: 'golang', repo: 'go' },
+        queryParams: { filename: 'src/go.mod' },
+        staticPreview: this.render({ version: '1.14' }),
+        documentation,
+        keywords,
+      },
+      {
+        title: 'GitHub go.mod Go version (branch & subfolder of monorepo)',
+        pattern: ':user/:repo/:branch',
+        namedParams: { user: 'golang', repo: 'go', branch: 'master' },
+        queryParams: { filename: 'src/go.mod' },
+        staticPreview: this.render({ version: '1.14' }),
+        documentation,
+        keywords,
+      },
+    ]
+  }
+
+  static get defaultBadgeData() {
+    return { label: 'Go' }
+  }
+
+  static render({ version, branch }) {
+    return renderVersionBadge({
+      version,
+      tag: branch,
+      defaultLabel: 'Go',
+    })
+  }
+
+  static transform(content) {
+    const match = goVersionRegExp.exec(content)
+    if (!match) {
+      throw new InvalidResponse({
+        prettyMessage: 'Go version missing in go.mod',
+      })
+    }
+
+    return {
+      go: match[1],
+    }
+  }
+
+  async handle({ user, repo, branch }, { filename = 'go.mod' }) {
+    const content = await fetchRepoContent(this, {
+      user,
+      repo,
+      branch,
+      filename,
+    })
+    const { go } = this.constructor.transform(content)
+    return this.constructor.render({ version: go, branch })
+  }
+}
diff --git a/services/github/github-go-mod.tester.js b/services/github/github-go-mod.tester.js
new file mode 100644
index 0000000000000000000000000000000000000000..9780d6c88ce8a46553bc36efc6073fbec2aab28e
--- /dev/null
+++ b/services/github/github-go-mod.tester.js
@@ -0,0 +1,39 @@
+'use strict'
+
+const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
+const t = (module.exports = require('../tester').createServiceTester())
+
+t.create('Go version')
+  .get('/gohugoio/hugo.json')
+  .expectBadge({
+    label: 'Go',
+    message: isVPlusDottedVersionAtLeastOne,
+  })
+
+t.create('Go version (from branch)')
+  .get('/gohugoio/hugo/master.json')
+  .expectBadge({
+    label: 'Go@master',
+    message: isVPlusDottedVersionAtLeastOne,
+  })
+
+t.create('Go version (mongorepo)')
+  .get(`/golang/go.json?filename=${encodeURIComponent('src/go.mod')}`)
+  .expectBadge({
+    label: 'Go',
+    message: isVPlusDottedVersionAtLeastOne,
+  })
+
+t.create('Go version (repo not found)')
+  .get('/badges/not-existing-repo.json')
+  .expectBadge({
+    label: 'Go',
+    message: 'repo not found, branch not found, or go.mod missing',
+  })
+
+t.create('Go version (missing Go version in go.mod)')
+  .get('/calebcartwright/ci-detective.json')
+  .expectBadge({
+    label: 'Go',
+    message: 'Go version missing in go.mod',
+  })
diff --git a/services/github/github-hacktoberfest.service.js b/services/github/github-hacktoberfest.service.js
new file mode 100644
index 0000000000000000000000000000000000000000..0192793a3904773f32dc1d2804671f2e8180aaba
--- /dev/null
+++ b/services/github/github-hacktoberfest.service.js
@@ -0,0 +1,215 @@
+'use strict'
+
+const gql = require('graphql-tag')
+const Joi = require('@hapi/joi')
+const moment = require('moment')
+const { metric, maybePluralize } = require('../text-formatters')
+const { nonNegativeInteger } = require('../validators')
+const { GithubAuthV4Service } = require('./github-auth-service')
+const {
+  documentation: githubDocumentation,
+  transformErrors,
+} = require('./github-helpers')
+
+const documentation = `
+  <p>
+    This badge is designed for projects hosted on GitHub which are
+    participating in
+    <a href="https://hacktoberfest.digitalocean.com">Hacktoberfest</a>,
+    an initiative to encourage participating in open-source projects. The
+    badge can be added to the project readme to encourage potential
+    contributors to review the suggested issues and to celebrate the
+    contributions that have already been made.
+
+    The badge displays three pieces of information:
+    <ul>
+      <li>
+        The number of suggested issues. By default this will count open
+        issues with the <strong>hacktoberfest</strong> label, however you
+        can pick a different label (e.g.
+        <code>?suggestion_label=good%20first%20issue</code>).
+      </li>
+      <li>
+        The number of pull requests opened in October. This excludes any
+        PR with the <strong>invalid</strong> label.
+      </li>
+      <li>The number of days left of October.</li>
+    </ul>
+
+  </p>
+
+  ${githubDocumentation}
+`
+
+const schema = Joi.object({
+  data: Joi.object({
+    repository: Joi.object({
+      issues: Joi.object({
+        totalCount: nonNegativeInteger,
+      }).required(),
+    }).required(),
+    search: Joi.object({
+      issueCount: nonNegativeInteger,
+    }).required(),
+  }).required(),
+}).required()
+
+const queryParamSchema = Joi.object({
+  suggestion_label: Joi.string(),
+}).required()
+
+module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Service {
+  static get category() {
+    return 'issue-tracking'
+  }
+
+  static get route() {
+    return {
+      base: 'github/hacktoberfest/2019',
+      pattern: ':user/:repo',
+      queryParamSchema,
+    }
+  }
+
+  static get examples() {
+    return [
+      {
+        title: 'GitHub Hacktoberfest combined status',
+        namedParams: {
+          user: 'snyk',
+          repo: 'snyk',
+        },
+        staticPreview: this.render({
+          suggestedIssueCount: 12,
+          contributionCount: 8,
+          daysLeft: 15,
+        }),
+        documentation,
+      },
+      {
+        title:
+          'GitHub Hacktoberfest combined status (suggestion label override)',
+        namedParams: {
+          user: 'tmrowco',
+          repo: 'tmrowapp-contrib',
+        },
+        queryParams: {
+          suggestion_label: 'help wanted',
+        },
+        staticPreview: this.render({
+          suggestedIssueCount: 12,
+          contributionCount: 8,
+          daysLeft: 15,
+        }),
+        documentation,
+      },
+    ]
+  }
+
+  static get defaultBadgeData() {
+    return {
+      label: 'hacktoberfest',
+      color: 'orange',
+    }
+  }
+
+  static render({ suggestedIssueCount, contributionCount, daysLeft }) {
+    if (daysLeft === undefined) {
+      // The global cutoff time is 11/1 noon UTC.
+      // https://github.com/badges/shields/pull/4109#discussion_r330782093
+      // We want to show "1 day left" on the last day so we add 1.
+      daysLeft = moment('2019-11-01 12:00:00 Z').diff(moment(), 'days') + 1
+    }
+    if (daysLeft < 0) {
+      return {
+        message: `is over! (${metric(contributionCount)} ${maybePluralize(
+          'PR',
+          contributionCount
+        )} opened)`,
+      }
+    }
+    const message =
+      [
+        suggestedIssueCount
+          ? `${metric(suggestedIssueCount)} ${maybePluralize(
+              'open issue',
+              suggestedIssueCount
+            )}`
+          : '',
+        contributionCount
+          ? `${metric(contributionCount)} ${maybePluralize(
+              'PR',
+              contributionCount
+            )}`
+          : '',
+        daysLeft > 0
+          ? `${daysLeft} ${maybePluralize('day', daysLeft)} left`
+          : '',
+      ]
+        .filter(Boolean)
+        .join(', ') || 'is over!'
+
+    return { message }
+  }
+
+  async fetch({ user, repo, suggestionLabel = 'hacktoberfest' }) {
+    const isValidOctoberPR = [
+      `repo:${user}/${repo}`,
+      'is:pr',
+      'created:2019-10-01..2019-10-31',
+      `-label:invalid`,
+    ]
+      .filter(Boolean)
+      .join(' ')
+    const {
+      data: {
+        repository: {
+          issues: { totalCount: suggestedIssueCount },
+        },
+        search: { issueCount: contributionCount },
+      },
+    } = await this._requestGraphql({
+      query: gql`
+        query(
+          $user: String!
+          $repo: String!
+          $suggestionLabel: String!
+          $isValidOctoberPR: String!
+        ) {
+          repository(owner: $user, name: $repo) {
+            issues(states: [OPEN], labels: [$suggestionLabel]) {
+              totalCount
+            }
+          }
+          search(query: $isValidOctoberPR, type: ISSUE, last: 0) {
+            issueCount
+          }
+        }
+      `,
+      variables: {
+        user,
+        repo,
+        suggestionLabel,
+        isValidOctoberPR,
+      },
+      schema,
+      transformErrors,
+    })
+    return {
+      suggestedIssueCount,
+      contributionCount,
+    }
+  }
+
+  async handle({ user, repo }, { suggestion_label: suggestionLabel }) {
+    const { suggestedIssueCount, contributionCount } = await this.fetch({
+      user,
+      repo,
+      suggestionLabel,
+    })
+    return this.constructor.render({
+      suggestedIssueCount,
+      contributionCount,
+    })
+  }
+}
diff --git a/services/github/github-hacktoberfest.spec.js b/services/github/github-hacktoberfest.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..b62bbe765a61bbd91a6ce571e856010f33ba16be
--- /dev/null
+++ b/services/github/github-hacktoberfest.spec.js
@@ -0,0 +1,22 @@
+'use strict'
+
+const { test, given } = require('sazerac')
+const GitHubHacktoberfest = require('./github-hacktoberfest.service')
+
+describe('GitHubHacktoberfest', function() {
+  test(GitHubHacktoberfest.render, () => {
+    given({
+      daysLeft: -1,
+      contributionCount: 12,
+    }).expect({
+      message: 'is over! (12 PRs opened)',
+    })
+    given({
+      daysLeft: 10,
+      contributionCount: 27,
+      suggestedIssueCount: 54,
+    }).expect({
+      message: '54 open issues, 27 PRs, 10 days left',
+    })
+  })
+})
diff --git a/services/github/github-hacktoberfest.tester.js b/services/github/github-hacktoberfest.tester.js
new file mode 100644
index 0000000000000000000000000000000000000000..51eb74c164840d911be7d2846e9996d9ddecdcde
--- /dev/null
+++ b/services/github/github-hacktoberfest.tester.js
@@ -0,0 +1,38 @@
+'use strict'
+
+const Joi = require('@hapi/joi')
+const t = (module.exports = require('../tester').createServiceTester())
+
+const isHacktoberfestNoIssuesStatus = Joi.string().regex(
+  /^[0-9]+ PRs?(, [0-9]+ days? left)?$/
+)
+const isHacktoberfestNoPRsStatus = Joi.string().regex(
+  /^([0-9]+ open issues?)?[0-9]+ days? left$/
+)
+const isHacktoberfestCombinedStatus = Joi.string().regex(
+  /^[0-9]+ open issues?(, [0-9]+ PRs?)?(, [0-9]+ days? left)?$/
+)
+const isHacktoberfestStatus = Joi.alternatives().try(
+  isHacktoberfestNoIssuesStatus,
+  isHacktoberfestNoPRsStatus,
+  isHacktoberfestCombinedStatus,
+  /^is over! \([0-9]+ PRs? opened\)$/
+)
+
+t.create('GitHub Hacktoberfest combined status')
+  .get('/badges/shields.json')
+  .expectBadge({
+    label: 'hacktoberfest',
+    message: isHacktoberfestStatus,
+  })
+
+t.create('GitHub Hacktoberfest combined status (suggestion label override)')
+  .get(
+    `/badges/shields.json?suggestion_label=${encodeURIComponent(
+      'good first issue'
+    )}`
+  )
+  .expectBadge({
+    label: 'hacktoberfest',
+    message: isHacktoberfestStatus,
+  })
diff --git a/services/github/github-helpers.js b/services/github/github-helpers.js
index 18430fdd3a92d45f37a07bd7f782869a6239b2ba..edf44ce9c76461345b218380033f389752d39c56 100644
--- a/services/github/github-helpers.js
+++ b/services/github/github-helpers.js
@@ -7,10 +7,9 @@ const { InvalidResponse, NotFound } = require('..')
 const documentation = `
 <p>
   If your GitHub badge errors, it might be because you hit GitHub's rate limits.
-  <br>
   You can increase Shields.io's rate limit by
-  <a href="https://img.shields.io/github-auth">going to this page</a> to add
-  Shields as a GitHub application on your GitHub account.
+  <a href="https://img.shields.io/github-auth">adding the Shields GitHub
+  application</a> using your GitHub account.
 </p>
 `
 
diff --git a/services/github/github-issues.service.js b/services/github/github-issues.service.js
index ef5b0064cd937e047d9ab8f4e73da8a91121b538..52e580dfa1bd9a30752c8647941b3d6b3306b576 100644
--- a/services/github/github-issues.service.js
+++ b/services/github/github-issues.service.js
@@ -1,10 +1,31 @@
 'use strict'
 
+const gql = require('graphql-tag')
 const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
-const { GithubAuthV3Service } = require('./github-auth-service')
-const { documentation, errorMessagesFor } = require('./github-helpers')
+const { GithubAuthV4Service } = require('./github-auth-service')
+const { documentation, transformErrors } = require('./github-helpers')
+
+const issueCountSchema = Joi.object({
+  data: Joi.object({
+    repository: Joi.object({
+      issues: Joi.object({
+        totalCount: nonNegativeInteger,
+      }).required(),
+    }).required(),
+  }).required(),
+}).required()
+
+const pullRequestCountSchema = Joi.object({
+  data: Joi.object({
+    repository: Joi.object({
+      pullRequests: Joi.object({
+        totalCount: nonNegativeInteger,
+      }).required(),
+    }).required(),
+  }).required(),
+}).required()
 
 const isPRVariant = {
   'issues-pr': true,
@@ -16,11 +37,7 @@ const isClosedVariant = {
   'issues-pr-closed': true,
 }
 
-const schema = Joi.object({
-  total_count: nonNegativeInteger,
-}).required()
-
-module.exports = class GithubIssues extends GithubAuthV3Service {
+module.exports = class GithubIssues extends GithubAuthV4Service {
   static get category() {
     return 'issue-tracking'
   }
@@ -223,8 +240,8 @@ module.exports = class GithubIssues extends GithubAuthV3Service {
     }
   }
 
-  static render({ variant, numIssues, raw, label }) {
-    const state = isClosedVariant[variant] ? 'closed' : 'open'
+  static render({ isPR, isClosed, issueCount, raw, label }) {
+    const state = isClosed ? 'closed' : 'open'
 
     let labelPrefix = ''
     let messageSuffix = ''
@@ -238,35 +255,98 @@ module.exports = class GithubIssues extends GithubAuthV3Service {
     const labelText = label
       ? `${isGhLabelMultiWord ? `"${label}"` : label} `
       : ''
-    const labelSuffix = isPRVariant[variant] ? 'pull requests' : 'issues'
+    const labelSuffix = isPR ? 'pull requests' : 'issues'
 
     return {
       label: `${labelPrefix}${labelText}${labelSuffix}`,
-      message: `${metric(numIssues)} ${messageSuffix}`,
-      color: numIssues > 0 ? 'yellow' : 'brightgreen',
+      message: `${metric(issueCount)} ${messageSuffix}`,
+      color: issueCount > 0 ? 'yellow' : 'brightgreen',
     }
   }
 
-  async fetch({ variant, user, repo, label }) {
-    const isPR = isPRVariant[variant]
-    const isClosed = isClosedVariant[variant]
-    const query = `repo:${user}/${repo}${isPR ? ' is:pr' : ' is:issue'}${
-      isClosed ? ' is:closed' : ' is:open'
-    }${label ? ` label:"${label}"` : ''}`
-    const options = { qs: { q: query } }
-    return this._requestJson({
-      url: `/search/issues`,
-      options,
-      schema,
-      errorMessages: errorMessagesFor('repo not found'),
-    })
+  async fetch({ isPR, isClosed, user, repo, label }) {
+    const commonVariables = {
+      user,
+      repo,
+      labels: label ? [label] : undefined,
+    }
+    if (isPR) {
+      const {
+        data: {
+          repository: {
+            pullRequests: { totalCount },
+          },
+        },
+      } = await this._requestGraphql({
+        query: gql`
+          query(
+            $user: String!
+            $repo: String!
+            $states: [PullRequestState!]
+            $labels: [String!]
+          ) {
+            repository(owner: $user, name: $repo) {
+              pullRequests(states: $states, labels: $labels) {
+                totalCount
+              }
+            }
+          }
+        `,
+        variables: {
+          ...commonVariables,
+          states: isClosed ? ['MERGED', 'CLOSED'] : ['OPEN'],
+        },
+        schema: pullRequestCountSchema,
+        transformErrors,
+      })
+      return { issueCount: totalCount }
+    } else {
+      const {
+        data: {
+          repository: {
+            issues: { totalCount },
+          },
+        },
+      } = await this._requestGraphql({
+        query: gql`
+          query(
+            $user: String!
+            $repo: String!
+            $states: [IssueState!]
+            $labels: [String!]
+          ) {
+            repository(owner: $user, name: $repo) {
+              issues(states: $states, labels: $labels) {
+                totalCount
+              }
+            }
+          }
+        `,
+        variables: {
+          ...commonVariables,
+          states: isClosed ? ['CLOSED'] : ['OPEN'],
+        },
+        schema: issueCountSchema,
+        transformErrors,
+      })
+      return { issueCount: totalCount }
+    }
   }
 
   async handle({ variant, raw, user, repo, label }) {
-    const json = await this.fetch({ variant, user, repo, label })
+    const isPR = isPRVariant[variant]
+    const isClosed = isClosedVariant[variant]
+    const { issueCount } = await this.fetch({
+      isPR,
+      isClosed,
+      user,
+      repo,
+      label,
+    })
     return this.constructor.render({
-      variant,
-      numIssues: json.total_count,
+      isPR,
+      isClosed,
+      issueCount,
       raw,
       label,
     })
diff --git a/services/github/github-last-commit.service.js b/services/github/github-last-commit.service.js
index e7a28983c62ef4930ddb9f49f2fa08dd4fb22abc..499b928a904af2b2ea3987a637a36c0b9b583394 100644
--- a/services/github/github-last-commit.service.js
+++ b/services/github/github-last-commit.service.js
@@ -6,7 +6,7 @@ const { age: ageColor } = require('../color-formatters')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
 const commonExampleAttrs = {
-  keywords: ['activity', 'latest'],
+  keywords: ['latest'],
   documentation,
 }
 
diff --git a/services/github/github-license.service.js b/services/github/github-license.service.js
index bd33d1ab0b3be29cb2a51400d5d5aa4bca61bfea..21787c206eab86d7656b8aac9d018ba97b39a47f 100644
--- a/services/github/github-license.service.js
+++ b/services/github/github-license.service.js
@@ -32,7 +32,6 @@ module.exports = class GithubLicense extends GithubAuthV3Service {
           message: 'MIT',
           color: 'green',
         },
-        keywords: ['license'],
         documentation,
       },
     ]
diff --git a/services/github/github-package-json.service.js b/services/github/github-package-json.service.js
index a4d81e663dbc49c2560e7e6d18e21634ea154850..36dab5e031be4ea53dffebf36f355aefc56fb409 100644
--- a/services/github/github-package-json.service.js
+++ b/services/github/github-package-json.service.js
@@ -78,6 +78,10 @@ class GithubPackageJsonVersion extends ConditionalGithubAuthV3Service {
   }
 }
 
+const dependencyQueryParamSchema = Joi.object({
+  filename: Joi.string(),
+}).required()
+
 class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service {
   static get category() {
     return 'platform-support'
@@ -88,6 +92,7 @@ class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service
       base: 'github/package-json/dependency-version',
       pattern:
         ':user/:repo/:kind(dev|peer)?/:scope(@[^/]+)?/:packageName/:branch*',
+      queryParamSchema: dependencyQueryParamSchema,
     }
   }
 
@@ -125,6 +130,24 @@ class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service
         documentation,
         keywords,
       },
+      {
+        title: 'GitHub package.json dependency version (subfolder of monorepo)',
+        pattern: ':user/:repo/:packageName',
+        namedParams: {
+          user: 'metabolize',
+          repo: 'anafanafo',
+          packageName: 'puppeteer',
+        },
+        queryParams: {
+          filename: 'packages/char-width-table-builder/package.json',
+        },
+        staticPreview: this.render({
+          dependency: 'puppeteer',
+          range: '^1.14.0',
+        }),
+        documentation,
+        keywords,
+      },
     ]
   }
 
@@ -142,7 +165,10 @@ class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service
     }
   }
 
-  async handle({ user, repo, kind, branch = 'master', scope, packageName }) {
+  async handle(
+    { user, repo, kind, branch = 'master', scope, packageName },
+    { filename = 'package.json' }
+  ) {
     const {
       dependencies,
       devDependencies,
@@ -152,7 +178,7 @@ class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service
       user,
       repo,
       branch,
-      filename: 'package.json',
+      filename,
     })
 
     const wantedDependency = scope ? `${scope}/${packageName}` : packageName
diff --git a/services/github/github-package-json.tester.js b/services/github/github-package-json.tester.js
index e9548029c4774d47ca3721ce68c28cffb6eb6644..9349b85924831327768d0ae830a704b95b729672 100644
--- a/services/github/github-package-json.tester.js
+++ b/services/github/github-package-json.tester.js
@@ -60,13 +60,24 @@ t.create('Dev dependency version')
     message: semverRange,
   })
 
-t.create('Prod prod dependency version')
+t.create('Prod dependency version')
   .get('/dependency-version/paulmelnikow/react-boxplot/simple-statistics.json')
   .expectBadge({
     label: 'simple-statistics',
     message: semverRange,
   })
 
+t.create('Prod dependency version (monorepo)')
+  .get(
+    `/dependency-version/metabolize/anafanafo/puppeteer.json?filename=${encodeURIComponent(
+      'packages/char-width-table-builder/package.json'
+    )}`
+  )
+  .expectBadge({
+    label: 'puppeteer',
+    message: semverRange,
+  })
+
 t.create('Scoped dependency')
   .get('/dependency-version/badges/shields/dev/@babel/core.json')
   .expectBadge({
diff --git a/services/github/github-pipenv.service.js b/services/github/github-pipenv.service.js
new file mode 100644
index 0000000000000000000000000000000000000000..eeeae1753df23f2deed4ee9734052adc0082cd02
--- /dev/null
+++ b/services/github/github-pipenv.service.js
@@ -0,0 +1,202 @@
+'use strict'
+
+const { renderVersionBadge } = require('../version')
+const { isLockfile, getDependencyVersion } = require('../pipenv-helpers')
+const { addv } = require('../text-formatters')
+const { ConditionalGithubAuthV3Service } = require('./github-auth-service')
+const { fetchJsonFromRepo } = require('./github-common-fetch')
+const { documentation: githubDocumentation } = require('./github-helpers')
+const { NotFound } = require('..')
+
+const keywords = ['pipfile']
+
+const documentation = `
+<p>
+  <a href="https://github.com/pypa/pipenv">Pipenv</a> is a dependency
+  manager for Python which manages a
+  <a href="https://virtualenv.pypa.io/en/latest/">virtualenv</a> for
+  projects. It adds/removes packages from your <code>Pipfile</code> as
+  you install/uninstall packages and generates the ever-important
+  <code>Pipfile.lock</code>, which can be checked in to source control
+  in order to produce deterministic builds.
+</p>
+
+<p>
+  The GitHub Pipenv badges are intended for applications using Pipenv
+  which are hosted on GitHub.
+</p>
+
+<p>
+  When <code>Pipfile.lock</code> is checked in, the <strong>GitHub Pipenv
+  locked dependency version</strong> badge displays the locked version of
+  a dependency listed in <code>[packages]</code> or
+  <code>[dev-packages]</code> (or any of their transitive dependencies).
+</p>
+
+<p>
+  Usually a Python version is specified in the <code>Pipfile</code>, which
+  <code>pipenv lock</code> then places in <code>Pipfile.lock</code>. The
+  <strong>GitHub Pipenv Python version</strong> badge displays that version.
+</p>
+
+${githubDocumentation}
+`
+
+class GithubPipenvLockedPythonVersion extends ConditionalGithubAuthV3Service {
+  static get category() {
+    return 'platform-support'
+  }
+
+  static get route() {
+    return {
+      base: 'github/pipenv/locked/python-version',
+      pattern: ':user/:repo/:branch*',
+    }
+  }
+
+  static get examples() {
+    return [
+      {
+        title: 'GitHub Pipenv locked Python version',
+        pattern: ':user/:repo',
+        namedParams: {
+          user: 'metabolize',
+          repo: 'rq-dashboard-on-heroku',
+        },
+        staticPreview: this.render({ version: '3.7' }),
+        documentation,
+        keywords,
+      },
+      {
+        title: 'GitHub Pipenv locked Python version (branch)',
+        pattern: ':user/:repo/:branch',
+        namedParams: {
+          user: 'metabolize',
+          repo: 'rq-dashboard-on-heroku',
+          branch: 'master',
+        },
+        staticPreview: this.render({ version: '3.7', branch: 'master' }),
+        documentation,
+        keywords,
+      },
+    ]
+  }
+
+  static get defaultBadgeData() {
+    return {
+      label: 'python',
+    }
+  }
+
+  static render({ version, branch }) {
+    return renderVersionBadge({
+      version,
+      tag: branch,
+      defaultLabel: 'python',
+    })
+  }
+
+  async handle({ user, repo, branch }) {
+    const {
+      _meta: {
+        requires: { python_version: version },
+      },
+    } = await fetchJsonFromRepo(this, {
+      schema: isLockfile,
+      user,
+      repo,
+      branch,
+      filename: 'Pipfile.lock',
+    })
+    if (version === undefined) {
+      throw new NotFound({ prettyMessage: 'version not specified' })
+    }
+    return this.constructor.render({ version, branch })
+  }
+}
+
+class GithubPipenvLockedDependencyVersion extends ConditionalGithubAuthV3Service {
+  static get category() {
+    return 'dependencies'
+  }
+
+  static get route() {
+    return {
+      base: 'github/pipenv/locked/dependency-version',
+      pattern: ':user/:repo/:kind(dev)?/:packageName/:branch*',
+    }
+  }
+
+  static get examples() {
+    return [
+      {
+        title: 'GitHub Pipenv locked dependency version',
+        pattern: ':user/:repo/:kind(dev)?/:packageName',
+        namedParams: {
+          user: 'metabolize',
+          repo: 'rq-dashboard-on-heroku',
+          packageName: 'flask',
+        },
+        staticPreview: this.render({
+          dependency: 'flask',
+          version: '1.1.1',
+        }),
+        documentation,
+        keywords: ['python', ...keywords],
+      },
+      {
+        title: 'GitHub Pipenv locked dependency version (branch)',
+        pattern: ':user/:repo/:kind(dev)?/:packageName/:branch',
+        namedParams: {
+          user: 'metabolize',
+          repo: 'rq-dashboard-on-heroku',
+          kind: 'dev',
+          packageName: 'black',
+          branch: 'master',
+        },
+        staticPreview: this.render({ dependency: 'black', version: '19.3b0' }),
+        documentation,
+        keywords: ['python', ...keywords],
+      },
+    ]
+  }
+
+  static get defaultBadgeData() {
+    return {
+      label: 'dependency',
+    }
+  }
+
+  static render({ dependency, version, ref }) {
+    return {
+      label: dependency,
+      message: version ? addv(version) : ref,
+      color: 'blue',
+    }
+  }
+
+  async handle({ user, repo, kind, branch, packageName }) {
+    const lockfileData = await fetchJsonFromRepo(this, {
+      schema: isLockfile,
+      user,
+      repo,
+      branch,
+      filename: 'Pipfile.lock',
+    })
+    const { version, ref } = getDependencyVersion({
+      kind,
+      wantedDependency: packageName,
+      lockfileData,
+    })
+    return this.constructor.render({
+      dependency: packageName,
+      version,
+      ref,
+    })
+  }
+}
+
+module.exports = [
+  GithubPipenvLockedPythonVersion,
+  GithubPipenvLockedDependencyVersion,
+]
diff --git a/services/github/github-pipenv.tester.js b/services/github/github-pipenv.tester.js
new file mode 100644
index 0000000000000000000000000000000000000000..88019391a8ff5bd0f6668203c1a600822c2d12cb
--- /dev/null
+++ b/services/github/github-pipenv.tester.js
@@ -0,0 +1,93 @@
+'use strict'
+
+const Joi = require('@hapi/joi')
+const { ServiceTester } = require('../tester')
+const {
+  isVPlusDottedVersionAtLeastOne,
+  isVPlusDottedVersionNClausesWithOptionalSuffix,
+} = require('../test-validators')
+
+// e.g. v19.3b0
+const isBlackVersion = Joi.string().regex(/^v\d+(\.\d+)*(.*)?$/)
+const isShortSha = Joi.string().regex(/[0-9a-f]{7}/)
+
+const t = (module.exports = new ServiceTester({
+  id: 'GithubPipenv',
+  title: 'GithubPipenv',
+  pathPrefix: '/github/pipenv',
+}))
+
+t.create('Locked Python version')
+  .get('/locked/python-version/metabolize/rq-dashboard-on-heroku.json')
+  .expectBadge({
+    label: 'python',
+    message: isVPlusDottedVersionAtLeastOne,
+  })
+
+t.create('Locked Python version (no pipfile.lock)')
+  .get('/locked/python-version/metabolize/react-flexbox-svg.json')
+  .expectBadge({
+    label: 'python',
+    message: 'repo not found, branch not found, or Pipfile.lock missing',
+  })
+
+t.create('Locked Python version (pipfile.lock has no python version)')
+  .get('/locked/python-version/fikovnik/ShiftIt.json')
+  .expectBadge({
+    label: 'python',
+    message: 'version not specified',
+  })
+
+t.create('Locked version of default dependency')
+  .get(
+    '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/rq-dashboard.json'
+  )
+  .expectBadge({
+    label: 'rq-dashboard',
+    message: isVPlusDottedVersionNClausesWithOptionalSuffix,
+  })
+
+t.create('Locked version of default dependency (branch)')
+  .get(
+    '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/rq-dashboard/master.json'
+  )
+  .expectBadge({
+    label: 'rq-dashboard',
+    message: isVPlusDottedVersionNClausesWithOptionalSuffix,
+  })
+
+t.create('Locked version of dev dependency')
+  .get(
+    '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/dev/black.json'
+  )
+  .expectBadge({
+    label: 'black',
+    message: isBlackVersion,
+  })
+
+t.create('Locked version of dev dependency (branch)')
+  .get(
+    '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/dev/black/master.json'
+  )
+  .expectBadge({
+    label: 'black',
+    message: isBlackVersion,
+  })
+
+t.create('Locked version of unknown dependency')
+  .get(
+    '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/dev/i-made-this-up.json'
+  )
+  .expectBadge({
+    label: 'dependency',
+    message: 'dev dependency not found',
+  })
+
+t.create('Locked version of VCS dependency')
+  .get(
+    '/locked/dependency-version/DemocracyClub/aggregator-api/dc-base-theme.json'
+  )
+  .expectBadge({
+    label: 'dc-base-theme',
+    message: isShortSha,
+  })
diff --git a/services/github/github-release.service.js b/services/github/github-release.service.js
index a61283466786b2cc4189324acb02f98febc476c9..d6e83c2889446798faeb42da9ab809cd92f26116 100644
--- a/services/github/github-release.service.js
+++ b/services/github/github-release.service.js
@@ -19,9 +19,10 @@ const queryParamSchema = Joi.object({
     .default('date'),
 }).required()
 
-const releaseInfoArraySchema = Joi.array()
-  .items(releaseInfoSchema)
-  .required()
+const releaseInfoArraySchema = Joi.alternatives().try(
+  Joi.array().items(releaseInfoSchema),
+  Joi.array().length(0)
+)
 
 class GithubRelease extends GithubAuthV3Service {
   static get category() {
@@ -117,13 +118,14 @@ class GithubRelease extends GithubAuthV3Service {
       )
       return { tag_name: latestRelease, prerelease: kvpairs[latestRelease] }
     }
+
     if (!includePrereleases) {
       const stableReleases = releases.filter(release => !release.prerelease)
       if (stableReleases.length > 0) {
         return stableReleases[0]
       }
-      return releases[0]
     }
+
     return releases[0]
   }
 
@@ -131,9 +133,8 @@ class GithubRelease extends GithubAuthV3Service {
     const sort = queryParams.sort
     const includePrereleases = queryParams.include_prereleases !== undefined
 
-    let latestRelease
     if (!includePrereleases && sort === 'date') {
-      latestRelease = await fetchLatestRelease(this, { user, repo })
+      const latestRelease = await fetchLatestRelease(this, { user, repo })
       return this.constructor.render({
         version: latestRelease.tag_name,
         sort,
@@ -142,9 +143,10 @@ class GithubRelease extends GithubAuthV3Service {
     }
 
     const releases = await this.fetchReleases({ user, repo })
-    if (releases.length === 0)
-      throw new NotFound({ prettyMessage: 'no releases found' })
-    latestRelease = this.constructor.getLatestRelease({
+    if (releases.length === 0) {
+      throw new NotFound({ prettyMessage: 'no releases' })
+    }
+    const latestRelease = this.constructor.getLatestRelease({
       releases,
       sort,
       includePrereleases,
diff --git a/services/github/github-release.tester.js b/services/github/github-release.tester.js
index 273f84a80242a513e002624f48a5057b26bac210..f8835542361b7ca7b0f339a6c8aec94390041acc 100644
--- a/services/github/github-release.tester.js
+++ b/services/github/github-release.tester.js
@@ -28,6 +28,10 @@ t.create('Release (No releases)')
   .get('/v/release/badges/daily-tests.json')
   .expectBadge({ label: 'release', message: 'no releases or repo not found' })
 
+t.create('Prerelease (No releases)')
+  .get('/v/release/badges/daily-tests.json?include_prereleases')
+  .expectBadge({ label: 'release', message: 'no releases' })
+
 t.create('Release (repo not found)')
   .get('/v/release/badges/helmets.json')
   .expectBadge({ label: 'release', message: 'no releases or repo not found' })
diff --git a/services/gitlab/gitlab-pipeline-status.service.js b/services/gitlab/gitlab-pipeline-status.service.js
index 7d6dee42c5b969ea4217cdea74d94686a0ec10f0..50e75e327ff0683fb81e9d860a4a3d47b3c19805 100644
--- a/services/gitlab/gitlab-pipeline-status.service.js
+++ b/services/gitlab/gitlab-pipeline-status.service.js
@@ -15,6 +15,25 @@ const queryParamSchema = Joi.object({
   gitlab_url: optionalUrl,
 }).required()
 
+const documentation = `
+<p>
+  Important: If your project is publicly visible, but the badge is like this:
+  <img src="https://img.shields.io/badge/build-not&nbsp;found-red" alt="build not found"/>
+</p>
+<p>
+  Check if your pipelines are publicly visible as well.<br />
+  Navigate to your project settings on GitLab and choose General Pipelines under CI/CD.<br />
+  Then tick the setting Public pipelines.
+</p>
+<p>
+  Now your settings should look like this:
+</p>
+<img src="https://user-images.githubusercontent.com/12065866/67156911-e225a180-f324-11e9-93ad-10aafbb3e69e.png" alt="Setting Public pipelines set"/>
+<p>
+  Your badge should be working fine now.
+</p>
+`
+
 module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService {
   static get category() {
     return 'build'
@@ -35,6 +54,7 @@ module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService {
         pattern: ':user/:repo',
         namedParams: { user: 'gitlab-org', repo: 'gitlab-ce' },
         staticPreview: this.render({ status: 'passed' }),
+        documentation,
       },
       {
         title: 'Gitlab pipeline status (branch)',
@@ -45,6 +65,7 @@ module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService {
           branch: 'master',
         },
         staticPreview: this.render({ status: 'passed' }),
+        documentation,
       },
       {
         title: 'Gitlab pipeline status (self-hosted)',
@@ -52,6 +73,7 @@ module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService {
         namedParams: { user: 'GNOME', repo: 'pango' },
         queryParams: { gitlab_url: 'https://gitlab.gnome.org' },
         staticPreview: this.render({ status: 'passed' }),
+        documentation,
       },
     ]
   }
@@ -69,6 +91,7 @@ module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService {
       url: `${baseUrl}/${user}/${repo}/badges/${branch}/pipeline.svg`,
       errorMessages: {
         401: 'repo not found',
+        404: 'repo not found',
       },
     })
     if (status === 'unknown') {
diff --git a/services/homebrew/homebrew-cask.service.js b/services/homebrew/homebrew-cask.service.js
new file mode 100644
index 0000000000000000000000000000000000000000..7fff101127b8521e52d2084ab42a5261f7c16e3b
--- /dev/null
+++ b/services/homebrew/homebrew-cask.service.js
@@ -0,0 +1,48 @@
+'use strict'
+
+const Joi = require('@hapi/joi')
+const { renderVersionBadge } = require('../version')
+const { BaseJsonService } = require('..')
+
+const schema = Joi.object({
+  version: Joi.string().required(),
+}).required()
+
+module.exports = class HomebrewCask extends BaseJsonService {
+  static get category() {
+    return 'version'
+  }
+
+  static get route() {
+    return {
+      base: 'homebrew/cask/v',
+      pattern: ':cask',
+    }
+  }
+
+  static get examples() {
+    return [
+      {
+        title: 'homebrew cask',
+        namedParams: { cask: 'iterm2' },
+        staticPreview: renderVersionBadge({ version: 'v3.2.5' }),
+      },
+    ]
+  }
+
+  static get defaultBadgeData() {
+    return { label: 'homebrew cask' }
+  }
+
+  async fetch({ cask }) {
+    return this._requestJson({
+      schema,
+      url: `https://formulae.brew.sh/api/cask/${cask}.json`,
+    })
+  }
+
+  async handle({ cask }) {
+    const data = await this.fetch({ cask })
+    return renderVersionBadge({ version: data.version })
+  }
+}
diff --git a/services/homebrew/homebrew-cask.tester.js b/services/homebrew/homebrew-cask.tester.js
new file mode 100644
index 0000000000000000000000000000000000000000..95deb03812edb9792d71e3c4b6af1ed1b2d8d00a
--- /dev/null
+++ b/services/homebrew/homebrew-cask.tester.js
@@ -0,0 +1,24 @@
+'use strict'
+
+const { isVPlusTripleDottedVersion } = require('../test-validators')
+const t = (module.exports = require('../tester').createServiceTester())
+
+t.create('homebrew cask (valid)')
+  .get('/iterm2.json')
+  .expectBadge({
+    label: 'homebrew cask',
+    message: isVPlusTripleDottedVersion,
+  })
+
+t.create('homebrew cask (valid)')
+  .get('/iterm2.json')
+  .intercept(nock =>
+    nock('https://formulae.brew.sh')
+      .get('/api/cask/iterm2.json')
+      .reply(200, { version: '3.3.6' })
+  )
+  .expectBadge({ label: 'homebrew cask', message: 'v3.3.6' })
+
+t.create('homebrew cask (not found)')
+  .get('/not-a-package.json')
+  .expectBadge({ label: 'homebrew cask', message: 'not found' })
diff --git a/services/jenkins/jenkins-coverage.service.js b/services/jenkins/jenkins-coverage.service.js
index 9f30530f2ba37569868c1b30998152e216c92a54..c0d7f8aa2f1c7fb429f0057d9d1df4985ed855d5 100644
--- a/services/jenkins/jenkins-coverage.service.js
+++ b/services/jenkins/jenkins-coverage.service.js
@@ -21,6 +21,7 @@ const formatMap = {
     }).required(),
     treeQueryParam: 'instructionCoverage[percentage]',
     transform: json => ({ coverage: json.instructionCoverage.percentage }),
+    pluginSpecificPath: 'jacoco',
   },
   cobertura: {
     schema: Joi.object({
@@ -47,9 +48,48 @@ const formatMap = {
       )
       return { coverage: lineCoverage.ratio }
     },
+    pluginSpecificPath: 'cobertura',
+  },
+  api: {
+    schema: Joi.object({
+      results: Joi.object({
+        elements: Joi.array()
+          .items(
+            Joi.object({
+              name: Joi.string().required(),
+              ratio: Joi.number()
+                .min(0)
+                .max(100)
+                .required(),
+            })
+          )
+          .has(Joi.object({ name: 'Line' }))
+          .min(1)
+          .required(),
+      }).required(),
+    }).required(),
+    treeQueryParam: 'results[elements[name,ratio]]',
+    transform: json => {
+      const lineCoverage = json.results.elements.find(
+        element => element.name === 'Line'
+      )
+      return { coverage: lineCoverage.ratio }
+    },
+    pluginSpecificPath: 'coverage/result',
   },
 }
 
+const documentation = `
+<p>
+  We support coverage metrics from a variety of Jenkins plugins:
+  <ul>
+    <li><a href="https://plugins.jenkins.io/jacoco">JaCoCo</a></li>
+    <li><a href="https://plugins.jenkins.io/cobertura">Cobertura</a></li>
+    <li>Any plugin which integrates with the <a href="https://plugins.jenkins.io/code-coverage-api">Code Coverage API</a> (e.g. llvm-cov, Cobertura 1.13+, etc.)</li>
+  </ul>
+</p>
+`
+
 module.exports = class JenkinsCoverage extends JenkinsBase {
   static get category() {
     return 'coverage'
@@ -58,7 +98,8 @@ module.exports = class JenkinsCoverage extends JenkinsBase {
   static get route() {
     return {
       base: 'jenkins/coverage',
-      pattern: ':format(jacoco|cobertura)/:protocol(http|https)/:host/:job+',
+      pattern:
+        ':format(jacoco|cobertura|api)/:protocol(http|https)/:host/:job+',
       queryParamSchema,
     }
   }
@@ -73,8 +114,9 @@ module.exports = class JenkinsCoverage extends JenkinsBase {
           host: 'jenkins.sqlalchemy.org',
           job: 'job/alembic_coverage',
         },
-        keywords: ['jacoco', 'cobertura'],
+        keywords: ['jacoco', 'cobertura', 'llvm-cov', 'istanbul'],
         staticPreview: this.render({ coverage: 95 }),
+        documentation,
       },
     ]
   }
@@ -91,9 +133,11 @@ module.exports = class JenkinsCoverage extends JenkinsBase {
   }
 
   async handle({ format, protocol, host, job }, { disableStrictSSL }) {
-    const { schema, transform, treeQueryParam } = formatMap[format]
+    const { schema, transform, treeQueryParam, pluginSpecificPath } = formatMap[
+      format
+    ]
     const json = await this.fetch({
-      url: buildUrl({ protocol, host, job, plugin: format }),
+      url: buildUrl({ protocol, host, job, plugin: pluginSpecificPath }),
       schema,
       qs: buildTreeParamQueryString(treeQueryParam),
       disableStrictSSL,
diff --git a/services/jenkins/jenkins-coverage.tester.js b/services/jenkins/jenkins-coverage.tester.js
index 0c68b9bbcac7f6458771c230f398f89a1429b840..1394407e2341df3650897ee15194bf888890fe74 100644
--- a/services/jenkins/jenkins-coverage.tester.js
+++ b/services/jenkins/jenkins-coverage.tester.js
@@ -23,3 +23,13 @@ t.create('cobertura: job not found')
 t.create('cobertura: job found')
   .get('/cobertura/https/jenkins.sqlalchemy.org/alembic_coverage.json')
   .expectBadge({ label: 'coverage', message: isIntegerPercentage })
+
+t.create('code coverage API: job not found')
+  .get('/api/https/jenkins.library.illinois.edu/job/does-not-exist.json')
+  .expectBadge({ label: 'coverage', message: 'job or coverage not found' })
+
+t.create('code coverage API: job found')
+  .get(
+    '/api/https/jenkins.library.illinois.edu/job/OpenSourceProjects/job/Speedwagon/job/master.json'
+  )
+  .expectBadge({ label: 'coverage', message: isIntegerPercentage })
diff --git a/services/jira/jira-sprint.service.js b/services/jira/jira-sprint.service.js
index a75ca1e3b84c187415e32e1e37e4264068302ce1..5fe1f48bc1c832be6fefa119314f9a3929f36f91 100644
--- a/services/jira/jira-sprint.service.js
+++ b/services/jira/jira-sprint.service.js
@@ -64,7 +64,6 @@ module.exports = class JiraSprint extends BaseJsonService {
           numTotalIssues: 28,
         }),
         documentation,
-        keywords: ['issues'],
       },
     ]
   }
diff --git a/services/jsdelivr/jsdelivr-hits-github.tester.js b/services/jsdelivr/jsdelivr-hits-github.tester.js
index ec8fd1e9179e7b4a13cfaabfba680d9913987cd7..3c15ff5d0a22d67f80583a7cad9a821a036feb72 100644
--- a/services/jsdelivr/jsdelivr-hits-github.tester.js
+++ b/services/jsdelivr/jsdelivr-hits-github.tester.js
@@ -28,7 +28,7 @@ t.create('jquery/jquery hits/month')
   })
 
 t.create('jquery/jquery hits/year')
-  .timeout(10000)
+  .timeout(25000)
   .get('/hy/jquery/jquery.json')
   .expectBadge({
     label: 'jsdelivr',
diff --git a/services/jsdelivr/jsdelivr-hits-npm.tester.js b/services/jsdelivr/jsdelivr-hits-npm.tester.js
index c35fc44a9c8bdef31a39e1b7c4af61172ecf8868..f1ce84c12e6ae98ba1bcf4bea5387efee4f120a5 100644
--- a/services/jsdelivr/jsdelivr-hits-npm.tester.js
+++ b/services/jsdelivr/jsdelivr-hits-npm.tester.js
@@ -28,7 +28,7 @@ t.create('jquery hits/month')
   })
 
 t.create('jquery hits/year')
-  .timeout(10000)
+  .timeout(25000)
   .get('/hy/ky.json')
   .expectBadge({
     label: 'jsdelivr',
diff --git a/services/librariesio/librariesio-common.js b/services/librariesio/librariesio-common.js
index a56014b92cf9a9b7b743516de11a5098ffd80e44..59b56e346c40f0591cd09fbf829029237c159b15 100644
--- a/services/librariesio/librariesio-common.js
+++ b/services/librariesio/librariesio-common.js
@@ -11,10 +11,12 @@ const projectSchema = Joi.object({
   rank: anyInteger,
 }).required()
 
-async function fetchProject(serviceInstance, { platform, packageName }) {
+async function fetchProject(serviceInstance, { platform, scope, packageName }) {
   return serviceInstance._requestJson({
     schema: projectSchema,
-    url: `https://libraries.io/api/${platform}/${packageName}`,
+    url: `https://libraries.io/api/${encodeURIComponent(platform)}/${
+      scope ? encodeURIComponent(`${scope}/`) : ''
+    }${encodeURIComponent(packageName)}`,
     errorMessages: { 404: 'package not found' },
   })
 }
diff --git a/services/librariesio/librariesio-dependencies.service.js b/services/librariesio/librariesio-dependencies.service.js
index c8f36bc4a5e6608c5183845b368b29b994db701e..4eb4f928af7406d73120de7a9f75e967135b0a80 100644
--- a/services/librariesio/librariesio-dependencies.service.js
+++ b/services/librariesio/librariesio-dependencies.service.js
@@ -30,7 +30,7 @@ class LibrariesIoProjectDependencies extends BaseJsonService {
   static get route() {
     return {
       base: 'librariesio/release',
-      pattern: ':platform/:packageName/:version?',
+      pattern: ':platform/:scope(@[^/]+)?/:packageName/:version?',
     }
   }
 
@@ -61,13 +61,42 @@ class LibrariesIoProjectDependencies extends BaseJsonService {
           outdatedCount: 3,
         }),
       },
+      {
+        title:
+          'Libraries.io dependency status for latest release, scoped npm package',
+        pattern: ':platform/:scope/:packageName',
+        namedParams: {
+          platform: 'npm',
+          scope: '@babel',
+          packageName: 'core',
+        },
+        staticPreview: renderDependenciesBadge({
+          deprecatedCount: 8,
+          outdatedCount: 0,
+        }),
+      },
+      {
+        title:
+          'Libraries.io dependency status for specific release, scoped npm package',
+        pattern: ':platform/:scope/:packageName/:version',
+        namedParams: {
+          platform: 'npm',
+          scope: '@babel',
+          packageName: 'core',
+          version: '7.0.0',
+        },
+        staticPreview: renderDependenciesBadge({
+          deprecatedCount: 12,
+          outdatedCount: 0,
+        }),
+      },
     ]
   }
 
-  async handle({ platform, packageName, version = 'latest' }) {
-    const url = `https://libraries.io/api/${encodeURIComponent(
-      platform
-    )}/${encodeURIComponent(packageName)}/${encodeURIComponent(
+  async handle({ platform, scope, packageName, version = 'latest' }) {
+    const url = `https://libraries.io/api/${encodeURIComponent(platform)}/${
+      scope ? encodeURIComponent(`${scope}/`) : ''
+    }${encodeURIComponent(packageName)}/${encodeURIComponent(
       version
     )}/dependencies`
     const json = await this._requestJson({
diff --git a/services/librariesio/librariesio-dependencies.tester.js b/services/librariesio/librariesio-dependencies.tester.js
index 4843f361c22485f1cd3fa8c27a616afa9cdaaab3..45bcabddbe6d72a56bc22ca086ba74116bdd0a46 100644
--- a/services/librariesio/librariesio-dependencies.tester.js
+++ b/services/librariesio/librariesio-dependencies.tester.js
@@ -9,6 +9,7 @@ const t = (module.exports = new ServiceTester({
 }))
 
 t.create('dependencies for package (project name contains dot)')
+  .timeout(10000)
   .get('/release/nuget/Newtonsoft.Json.json')
   .expectBadge({
     label: 'dependencies',
@@ -16,13 +17,31 @@ t.create('dependencies for package (project name contains dot)')
   })
 
 t.create('dependencies for package with version')
+  .timeout(10000)
   .get('/release/hex/phoenix/1.0.3.json')
   .expectBadge({
     label: 'dependencies',
     message: isDependencyState,
   })
 
+t.create('dependencies for scoped npm package')
+  .timeout(10000)
+  .get('/release/npm/@babel/core.json')
+  .expectBadge({
+    label: 'dependencies',
+    message: isDependencyState,
+  })
+
+t.create('dependencies for scoped npm package with version')
+  .timeout(10000)
+  .get('/release/npm/@babel/core/7.0.0-rc.0.json')
+  .expectBadge({
+    label: 'dependencies',
+    message: isDependencyState,
+  })
+
 t.create('version not found')
+  .timeout(10000)
   .get('/release/hex/phoenix/9.9.99.json')
   .expectBadge({
     label: 'dependencies',
@@ -30,6 +49,7 @@ t.create('version not found')
   })
 
 t.create('package not found')
+  .timeout(10000)
   .get('/release/hex/invalid/4.0.4.json')
   .expectBadge({
     label: 'dependencies',
@@ -37,6 +57,7 @@ t.create('package not found')
   })
 
 t.create('dependencies for repo')
+  .timeout(10000)
   .get('/github/pyvesb/notepad4e.json')
   .expectBadge({
     label: 'dependencies',
@@ -44,6 +65,7 @@ t.create('dependencies for repo')
   })
 
 t.create('repo not found')
+  .timeout(10000)
   .get('/github/foobar/is-not-a-repo.json')
   .expectBadge({
     label: 'dependencies',
diff --git a/services/librariesio/librariesio-dependent-repos.service.js b/services/librariesio/librariesio-dependent-repos.service.js
index e02e6826b9cb69fd5d5ddf5d79e0ca3a43d79dda..fe363eff2ae694a7788ee6e5b447101ce6aab03c 100644
--- a/services/librariesio/librariesio-dependent-repos.service.js
+++ b/services/librariesio/librariesio-dependent-repos.service.js
@@ -13,7 +13,7 @@ module.exports = class LibrariesIoDependentRepos extends BaseJsonService {
   static get route() {
     return {
       base: 'librariesio/dependent-repos',
-      pattern: ':platform/:packageName',
+      pattern: ':platform/:scope(@[^/]+)?/:packageName',
     }
   }
 
@@ -21,12 +21,23 @@ module.exports = class LibrariesIoDependentRepos extends BaseJsonService {
     return [
       {
         title: 'Dependent repos (via libraries.io)',
+        pattern: ':platform/:packageName',
         namedParams: {
           platform: 'npm',
           packageName: 'got',
         },
         staticPreview: this.render({ dependentReposCount: 84000 }),
       },
+      {
+        title: 'Dependent repos (via libraries.io), scoped npm package',
+        pattern: ':platform/:scope/:packageName',
+        namedParams: {
+          platform: 'npm',
+          scope: '@babel',
+          packageName: 'core',
+        },
+        staticPreview: this.render({ dependentReposCount: 50 }),
+      },
     ]
   }
 
@@ -43,11 +54,12 @@ module.exports = class LibrariesIoDependentRepos extends BaseJsonService {
     }
   }
 
-  async handle({ platform, packageName }) {
+  async handle({ platform, scope, packageName }) {
     const { dependent_repos_count: dependentReposCount } = await fetchProject(
       this,
       {
         platform,
+        scope,
         packageName,
       }
     )
diff --git a/services/librariesio/librariesio-dependent-repos.tester.js b/services/librariesio/librariesio-dependent-repos.tester.js
index 7c8e1badabac3fa3b5cf4da4b4e7bf2652bbb719..f15fe079cda71a65c26a7614ece9a7c5408be4c8 100644
--- a/services/librariesio/librariesio-dependent-repos.tester.js
+++ b/services/librariesio/librariesio-dependent-repos.tester.js
@@ -4,15 +4,24 @@ const { isMetric } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('dependent repo count')
+  .timeout(10000)
   .get('/npm/got.json')
   .expectBadge({
     label: 'dependent repos',
     message: isMetric,
   })
 
+t.create('dependent repo count (scoped npm package)')
+  .timeout(10000)
+  .get('/npm/@babel/core.json')
+  .expectBadge({
+    label: 'dependent repos',
+    message: isMetric,
+  })
+
 t.create('dependent repo count (not a package)')
-  .get('/npm/foobar-is-not-package.json')
   .timeout(10000)
+  .get('/npm/foobar-is-not-package.json')
   .expectBadge({
     label: 'dependent repos',
     message: 'package not found',
diff --git a/services/librariesio/librariesio-dependents.service.js b/services/librariesio/librariesio-dependents.service.js
index 8d030b36292641c470d4fa137b4d2d9feb4ca59b..978397f852c93d2506b58f743636e4a5a060458d 100644
--- a/services/librariesio/librariesio-dependents.service.js
+++ b/services/librariesio/librariesio-dependents.service.js
@@ -13,7 +13,7 @@ module.exports = class LibrariesIoDependents extends BaseJsonService {
   static get route() {
     return {
       base: 'librariesio/dependents',
-      pattern: ':platform/:packageName',
+      pattern: ':platform/:scope(@[^/]+)?/:packageName',
     }
   }
 
@@ -21,12 +21,23 @@ module.exports = class LibrariesIoDependents extends BaseJsonService {
     return [
       {
         title: 'Dependents (via libraries.io)',
+        pattern: ':platform/:packageName',
         namedParams: {
           platform: 'npm',
           packageName: 'got',
         },
         staticPreview: this.render({ dependentCount: 2000 }),
       },
+      {
+        title: 'Dependents (via libraries.io), scoped npm package',
+        pattern: ':platform/:scope/:packageName',
+        namedParams: {
+          platform: 'npm',
+          scope: '@babel',
+          packageName: 'core',
+        },
+        staticPreview: this.render({ dependentCount: 94 }),
+      },
     ]
   }
 
@@ -43,9 +54,10 @@ module.exports = class LibrariesIoDependents extends BaseJsonService {
     }
   }
 
-  async handle({ platform, packageName }) {
+  async handle({ platform, scope, packageName }) {
     const { dependents_count: dependentCount } = await fetchProject(this, {
       platform,
+      scope,
       packageName,
     })
     return this.constructor.render({ dependentCount })
diff --git a/services/librariesio/librariesio-dependents.tester.js b/services/librariesio/librariesio-dependents.tester.js
index deeed2174087a2596123955f379efd7c27480251..e5cfcd29c2863c4cc55375bb053f7dda758024f6 100644
--- a/services/librariesio/librariesio-dependents.tester.js
+++ b/services/librariesio/librariesio-dependents.tester.js
@@ -4,15 +4,24 @@ const { isMetric } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('dependent count')
+  .timeout(10000)
   .get('/npm/got.json')
   .expectBadge({
     label: 'dependents',
     message: isMetric,
   })
 
+t.create('dependent count (scoped npm package)')
+  .timeout(10000)
+  .get('/npm/@babel/core.json')
+  .expectBadge({
+    label: 'dependents',
+    message: isMetric,
+  })
+
 t.create('dependent count (nonexistent package)')
-  .get('/npm/foobar-is-not-package.json')
   .timeout(10000)
+  .get('/npm/foobar-is-not-package.json')
   .expectBadge({
     label: 'dependents',
     message: 'package not found',
diff --git a/services/librariesio/librariesio-sourcerank.service.js b/services/librariesio/librariesio-sourcerank.service.js
index 0fc732884b5b6a38360c409e7aa45155f115c26e..869ddd00c6a9f23b213971ea666198da0e82182a 100644
--- a/services/librariesio/librariesio-sourcerank.service.js
+++ b/services/librariesio/librariesio-sourcerank.service.js
@@ -14,7 +14,7 @@ module.exports = class LibrariesIoSourcerank extends BaseJsonService {
   static get route() {
     return {
       base: 'librariesio/sourcerank',
-      pattern: ':platform/:packageName',
+      pattern: ':platform/:scope(@[^/]+)?/:packageName',
     }
   }
 
@@ -22,12 +22,23 @@ module.exports = class LibrariesIoSourcerank extends BaseJsonService {
     return [
       {
         title: 'Libraries.io SourceRank',
+        pattern: ':platform/:packageName',
         namedParams: {
           platform: 'npm',
           packageName: 'got',
         },
         staticPreview: this.render({ rank: 25 }),
       },
+      {
+        title: 'Libraries.io SourceRank, scoped npm package',
+        pattern: ':platform/:scope/:packageName',
+        namedParams: {
+          platform: 'npm',
+          scope: '@babel',
+          packageName: 'core',
+        },
+        staticPreview: this.render({ rank: 3 }),
+      },
     ]
   }
 
@@ -44,9 +55,10 @@ module.exports = class LibrariesIoSourcerank extends BaseJsonService {
     }
   }
 
-  async handle({ platform, packageName }) {
+  async handle({ platform, scope, packageName }) {
     const { rank } = await fetchProject(this, {
       platform,
+      scope,
       packageName,
     })
     return this.constructor.render({ rank })
diff --git a/services/librariesio/librariesio-sourcerank.tester.js b/services/librariesio/librariesio-sourcerank.tester.js
index 9c63dd26bd0b731c6af78ac0b5fbbd4b080842d5..2a8450fa82e37105c2af4752722303fac2a0e568 100644
--- a/services/librariesio/librariesio-sourcerank.tester.js
+++ b/services/librariesio/librariesio-sourcerank.tester.js
@@ -4,13 +4,23 @@ const { anyInteger } = require('../validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('sourcerank')
+  .timeout(10000)
   .get('/npm/got.json')
   .expectBadge({
     label: 'sourcerank',
     message: anyInteger,
   })
 
-t.create('dependent count (not a package)')
+t.create('sourcerank (scoped npm package)')
+  .timeout(10000)
+  .get('/npm/@babel/core.json')
+  .expectBadge({
+    label: 'sourcerank',
+    message: anyInteger,
+  })
+
+t.create('sourcerank (not a package)')
+  .timeout(10000)
   .get('/npm/foobar-is-not-package.json')
   .expectBadge({
     label: 'sourcerank',
diff --git a/services/maven-central/maven-central.tester.js b/services/maven-central/maven-central.tester.js
index f41f4cca330422b4b6e1bccdbec60d093208da27..cde5e050cc004a26c28d85025d71733b0a4245dc 100644
--- a/services/maven-central/maven-central.tester.js
+++ b/services/maven-central/maven-central.tester.js
@@ -50,4 +50,4 @@ t.create('version ending with zero')
       `
       )
   )
-  .expectBadge({ label: 'maven-central', message: /^v1\.30$/ })
+  .expectBadge({ label: 'maven-central', message: 'v1.30' })
diff --git a/services/maven-metadata/maven-metadata.service.js b/services/maven-metadata/maven-metadata.service.js
index ed37f9fc9d0a0140974f54af70dd667bdd6843fc..b58284123fceb2ceb531b91bf03863d98bc55652 100644
--- a/services/maven-metadata/maven-metadata.service.js
+++ b/services/maven-metadata/maven-metadata.service.js
@@ -14,9 +14,7 @@ const schema = Joi.object({
     versioning: Joi.object({
       versions: Joi.object({
         version: Joi.array()
-          .items(
-            Joi.alternatives(Joi.string().required(), Joi.number().required())
-          )
+          .items(Joi.string().required())
           .single()
           .required(),
       }).required(),
@@ -56,7 +54,11 @@ module.exports = class MavenMetadata extends BaseXmlService {
   }
 
   async fetch({ metadataUrl }) {
-    return this._requestXml({ schema, url: metadataUrl })
+    return this._requestXml({
+      schema,
+      url: metadataUrl,
+      parserOptions: { parseNodeValue: false },
+    })
   }
 
   async handle(_namedParams, { metadataUrl }) {
diff --git a/services/maven-metadata/maven-metadata.tester.js b/services/maven-metadata/maven-metadata.tester.js
index 23c348ed8aa0adf4775501bbc8897c22906b1429..566344fdf5e6478a96f5647a4942038b871c90b5 100644
--- a/services/maven-metadata/maven-metadata.tester.js
+++ b/services/maven-metadata/maven-metadata.tester.js
@@ -12,6 +12,33 @@ t.create('valid maven-metadata.xml uri')
     message: isVPlusDottedVersionAtLeastOne,
   })
 
+t.create('version ending with zero')
+  .get(
+    '/v.json?metadataUrl=http://central.maven.org/maven2/mocked-group-id/mocked-artifact-id/maven-metadata.xml'
+  )
+  .intercept(nock =>
+    nock('http://central.maven.org/maven2')
+      .get('/mocked-group-id/mocked-artifact-id/maven-metadata.xml')
+      .reply(
+        200,
+        `
+      <metadata>
+        <groupId>mocked-group-id</groupId>
+        <artifactId>mocked-artifact-id</artifactId>
+        <versioning>
+          <latest>1.30</latest>
+          <release>1.30</release>
+          <versions>
+            <version>1.30</version>
+          </versions>
+          <lastUpdated>20190902002617</lastUpdated>
+        </versioning>
+      </metadata>
+      `
+      )
+  )
+  .expectBadge({ label: 'maven', message: 'v1.30' })
+
 t.create('invalid maven-metadata.xml uri')
   .get(
     '/v.json?metadataUrl=http://central.maven.org/maven2/com/google/code/gson/gson/foobar.xml'
diff --git a/services/microbadger/microbadger-layers.tester.js b/services/microbadger/microbadger-layers.tester.js
index 59bc15314b899b154b86a46b11936349b5e95674..d2fd1a828babb3b41e21d09c38df08f58df6ca0d 100644
--- a/services/microbadger/microbadger-layers.tester.js
+++ b/services/microbadger/microbadger-layers.tester.js
@@ -1,24 +1,22 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const { nonNegativeInteger } = require('../validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('layers without a specified tag')
   .get('/_/alpine.json')
+  .timeout(150000)
   .expectBadge({
     label: 'layers',
-    message: Joi.number()
-      .integer()
-      .positive(),
+    message: nonNegativeInteger,
   })
 
 t.create('layers with a specified tag')
   .get('/_/alpine/2.7.json')
+  .timeout(150000)
   .expectBadge({
     label: 'layers',
-    message: Joi.number()
-      .integer()
-      .positive(),
+    message: nonNegativeInteger,
   })
 
 t.create('specified tag when repository has only one')
diff --git a/services/microbadger/microbadger-size.tester.js b/services/microbadger/microbadger-size.tester.js
index e4e84b1447c4b2c52169f1e71329c301cd15ccad..4e6613e6e7f0fcabbe18f66432bfe2b2851608c8 100644
--- a/services/microbadger/microbadger-size.tester.js
+++ b/services/microbadger/microbadger-size.tester.js
@@ -5,6 +5,7 @@ const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('image size without a specified tag')
   .get('/fedora/apache.json')
+  .timeout(150000)
   .expectBadge({
     label: 'image size',
     message: isFileSize,
@@ -12,6 +13,7 @@ t.create('image size without a specified tag')
 
 t.create('image size with a specified tag')
   .get('/fedora/apache/latest.json')
+  .timeout(150000)
   .expectBadge({
     label: 'image size',
     message: isFileSize,
diff --git a/services/mozilla-observatory/mozilla-observatory.tester.js b/services/mozilla-observatory/mozilla-observatory.tester.js
index 8a6f32f43937a4977edff4a066813ff925a1f4a7..d9e6febbd0a438e474f840d566bc0700851562c7 100644
--- a/services/mozilla-observatory/mozilla-observatory.tester.js
+++ b/services/mozilla-observatory/mozilla-observatory.tester.js
@@ -3,7 +3,6 @@
 const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
-const validColors = ['brightgreen', 'green', 'yellow', 'orange', 'red']
 const isMessage = Joi.alternatives()
   .try(
     Joi.string().regex(/^[ABCDEF][+-]? \([0-9]{1,3}\/100\)$/),
@@ -11,24 +10,20 @@ const isMessage = Joi.alternatives()
   )
   .required()
 
-const isColor = Joi.string()
-  .valid(...validColors)
-  .required()
-
 t.create('request on observatory.mozilla.org')
+  .timeout(10000)
   .get('/grade-score/observatory.mozilla.org.json')
   .expectBadge({
     label: 'observatory',
     message: isMessage,
-    color: isColor,
   })
 
 t.create('request on observatory.mozilla.org with inclusion in public results')
+  .timeout(10000)
   .get('/grade-score/observatory.mozilla.org.json?publish')
   .expectBadge({
     label: 'observatory',
     message: isMessage,
-    color: isColor,
   })
 
 t.create('grade without score (mock)')
diff --git a/services/packagist/packagist-base.js b/services/packagist/packagist-base.js
index 3e6c2b87a935c07debe81699566291664a639bf9..ff25c293867317369434fefc795074fab2d6e957 100644
--- a/services/packagist/packagist-base.js
+++ b/services/packagist/packagist-base.js
@@ -3,26 +3,61 @@
 const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
+const packageSchema = Joi.object()
+  .pattern(
+    /^/,
+    Joi.object({
+      version: Joi.string(),
+      require: Joi.object({
+        php: Joi.string(),
+      }),
+    }).required()
+  )
+  .required()
+
 const allVersionsSchema = Joi.object({
-  package: Joi.object({
-    versions: Joi.object()
-      .pattern(
-        /^/,
-        Joi.object({
-          version: Joi.string(),
-          require: Joi.object({
-            php: Joi.string(),
-          }),
-        })
-      )
-      .required(),
-  }).required(),
+  packages: Joi.object()
+    .pattern(/^/, packageSchema)
+    .required(),
 }).required()
-
 const keywords = ['PHP']
 
 class BasePackagistService extends BaseJsonService {
+  /**
+   * Default fetch method.
+   *
+   * This method utilize composer metadata API which
+   * "... is the preferred way to access the data as it is always up to date,
+   * and dumped to static files so it is very efficient on our end." (comment from official documentation).
+   * For more information please refer to https://packagist.org/apidoc#get-package-data.
+   *
+   * @returns {object} Parsed response
+   */
   async fetch({ user, repo, schema, server = 'https://packagist.org' }) {
+    const url = `${server}/p/${user}/${repo}.json`
+
+    return this._requestJson({
+      schema,
+      url,
+    })
+  }
+
+  /**
+   * It is highly recommended to use base fetch method!
+   *
+   * JSON API includes additional information about downloads, dependents count, github info, etc.
+   * However, responses from JSON API are cached for twelve hours by packagist servers,
+   * so data fetch from this method might be outdated.
+   * For more information please refer to https://packagist.org/apidoc#get-package-data.
+   *
+   * @returns {object} Parsed response
+   */
+  async fetchByJsonAPI({
+    user,
+    repo,
+    schema,
+    server = 'https://packagist.org',
+  }) {
     const url = `${server}/packages/${user}/${repo}.json`
 
     return this._requestJson({
@@ -30,14 +65,30 @@ class BasePackagistService extends BaseJsonService {
       url,
     })
   }
+
+  getPackageName(user, repo) {
+    return `${user}/${repo}`
+  }
 }
 
-const documentation =
-  'Note that only network-accessible packagist.org and other self-hosted Packagist instances are supported.'
+const customServerDocumentationFragment = `
+    <p>
+        Note that only network-accessible packagist.org and other self-hosted Packagist instances are supported.
+    </p>
+    `
+
+const cacheDocumentationFragment = `
+  <p>
+      Displayed data may be slightly outdated.
+      Due to performance reasons, data fetched from packagist JSON API is cached for twelve hours on packagist infrastructure.
+      For more information please refer to <a target="_blank" href="https://packagist.org/apidoc#get-package-data">official packagist documentation</a>.
+  </p>
+  `
 
 module.exports = {
   allVersionsSchema,
   keywords,
   BasePackagistService,
-  documentation,
+  customServerDocumentationFragment,
+  cacheDocumentationFragment,
 }
diff --git a/services/packagist/packagist-downloads.service.js b/services/packagist/packagist-downloads.service.js
index f9aac50779d5a8c2f827b063234c262aaaf9bf72..aff7a321d1271b090ab35919d95ee9ce84c31108 100644
--- a/services/packagist/packagist-downloads.service.js
+++ b/services/packagist/packagist-downloads.service.js
@@ -7,7 +7,8 @@ const { optionalUrl } = require('../validators')
 const {
   keywords,
   BasePackagistService,
-  documentation,
+  customServerDocumentationFragment,
+  cacheDocumentationFragment,
 } = require('./packagist-base')
 
 const periodMap = {
@@ -66,6 +67,7 @@ module.exports = class PackagistDownloads extends BasePackagistService {
           interval: 'dm',
         }),
         keywords,
+        documentation: cacheDocumentationFragment,
       },
       {
         title: 'Packagist (custom server)',
@@ -80,7 +82,8 @@ module.exports = class PackagistDownloads extends BasePackagistService {
         }),
         queryParams: { server: 'https://packagist.org' },
         keywords,
-        documentation,
+        documentation:
+          customServerDocumentationFragment + cacheDocumentationFragment,
       },
     ]
   }
@@ -101,7 +104,7 @@ module.exports = class PackagistDownloads extends BasePackagistService {
   async handle({ interval, user, repo }, { server }) {
     const {
       package: { downloads },
-    } = await this.fetch({ user, repo, schema, server })
+    } = await this.fetchByJsonAPI({ user, repo, schema, server })
 
     return this.constructor.render({
       downloads: downloads[periodMap[interval].field],
diff --git a/services/packagist/packagist-license.service.js b/services/packagist/packagist-license.service.js
index 4842d5ba71b9c142b317a683b995a41076b2655a..ba3e3445ef3a82157135567f1ed8b4d78d7973cb 100644
--- a/services/packagist/packagist-license.service.js
+++ b/services/packagist/packagist-license.service.js
@@ -6,17 +6,23 @@ const { optionalUrl } = require('../validators')
 const {
   keywords,
   BasePackagistService,
-  documentation,
+  customServerDocumentationFragment,
 } = require('./packagist-base')
+const { NotFound } = require('..')
+
+const packageSchema = Joi.object()
+  .pattern(
+    /^/,
+    Joi.object({
+      license: Joi.array().required(),
+    }).required()
+  )
+  .required()
 
 const schema = Joi.object({
-  package: Joi.object({
-    versions: Joi.object({
-      'dev-master': Joi.object({
-        license: Joi.array().required(),
-      }).required(),
-    }).required(),
-  }).required(),
+  packages: Joi.object()
+    .pattern(/^/, packageSchema)
+    .required(),
 }).required()
 
 const queryParamSchema = Joi.object({
@@ -50,7 +56,7 @@ module.exports = class PackagistLicense extends BasePackagistService {
         queryParams: { server: 'https://packagist.org' },
         staticPreview: renderLicenseBadge({ license: 'MIT' }),
         keywords,
-        documentation,
+        documentation: customServerDocumentationFragment,
       },
     ]
   }
@@ -61,13 +67,19 @@ module.exports = class PackagistLicense extends BasePackagistService {
     }
   }
 
-  transform({ json }) {
-    return { license: json.package.versions['dev-master'].license }
+  transform({ json, user, repo }) {
+    const packageName = this.getPackageName(user, repo)
+    const branch = json.packages[packageName]['dev-master']
+    if (!branch) {
+      throw new NotFound({ prettyMessage: 'default branch not found' })
+    }
+    const { license } = branch
+    return { license }
   }
 
   async handle({ user, repo }, { server }) {
     const json = await this.fetch({ user, repo, schema, server })
-    const { license } = this.transform({ json })
+    const { license } = this.transform({ json, user, repo })
     return renderLicenseBadge({ license })
   }
 }
diff --git a/services/packagist/packagist-license.spec.js b/services/packagist/packagist-license.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f9f6acf7e9ba8a444b0ba9cb831e872f499029a
--- /dev/null
+++ b/services/packagist/packagist-license.spec.js
@@ -0,0 +1,27 @@
+'use strict'
+
+const { expect } = require('chai')
+const PackagistLicense = require('./packagist-license.service')
+const { NotFound } = require('..')
+
+describe('PackagistLicense', function() {
+  it('should throw NotFound when default branch is missing', function() {
+    const json = {
+      packages: {
+        'doctrine/orm': {},
+        'elhadraoui/doctrine-orm': {
+          'dev-master': { license: 'MIT' },
+        },
+      },
+    }
+    expect(() =>
+      PackagistLicense.prototype.transform({
+        json,
+        user: 'doctrine',
+        repo: 'orm',
+      })
+    )
+      .to.throw(NotFound)
+      .with.property('prettyMessage', 'default branch not found')
+  })
+})
diff --git a/services/packagist/packagist-php-version.service.js b/services/packagist/packagist-php-version.service.js
index c491075dc8b1e8fb085781f3bf63b60bd937573f..ac1e9aae1a3c19e769900046a1904882ee319341 100644
--- a/services/packagist/packagist-php-version.service.js
+++ b/services/packagist/packagist-php-version.service.js
@@ -5,7 +5,7 @@ const { optionalUrl } = require('../validators')
 const {
   allVersionsSchema,
   BasePackagistService,
-  documentation,
+  customServerDocumentationFragment,
 } = require('./packagist-base')
 const { NotFound } = require('..')
 
@@ -58,7 +58,7 @@ module.exports = class PackagistPhpVersion extends BasePackagistService {
           server: 'https://packagist.org',
         },
         staticPreview: this.render({ php: '^7.1.3' }),
-        documentation,
+        documentation: customServerDocumentationFragment,
       },
     ]
   }
@@ -84,11 +84,14 @@ module.exports = class PackagistPhpVersion extends BasePackagistService {
       server,
     })
 
-    if (!allData.package.versions.hasOwnProperty(version)) {
+    if (
+      !allData.packages[this.getPackageName(user, repo)].hasOwnProperty(version)
+    ) {
       throw new NotFound({ prettyMessage: 'invalid version' })
     }
 
-    const packageVersion = allData.package.versions[version]
+    const packageVersion =
+      allData.packages[this.getPackageName(user, repo)][version]
     if (!packageVersion.require || !packageVersion.require.php) {
       throw new NotFound({ prettyMessage: 'version requirement not found' })
     }
diff --git a/services/packagist/packagist-version.service.js b/services/packagist/packagist-version.service.js
index ee1e243fd021a4b46903c59b879bab3a1236c23a..d3b1dc6eb4bfbfd3f7b886b318c9a3d82ef438c3 100644
--- a/services/packagist/packagist-version.service.js
+++ b/services/packagist/packagist-version.service.js
@@ -8,24 +8,26 @@ const {
   allVersionsSchema,
   keywords,
   BasePackagistService,
-  documentation,
+  customServerDocumentationFragment,
 } = require('./packagist-base')
 const { NotFound } = require('..')
 
+const packageSchema = Joi.object()
+  .pattern(
+    /^/,
+    Joi.object({
+      version: Joi.string(),
+      extra: Joi.object({
+        'branch-alias': Joi.object().pattern(/^/, Joi.string()),
+      }),
+    }).required()
+  )
+  .required()
+
 const schema = Joi.object({
-  package: Joi.object({
-    versions: Joi.object()
-      .pattern(
-        /^/,
-        Joi.object({
-          version: Joi.string().required(),
-          extra: Joi.object({
-            'branch-alias': Joi.object().pattern(/^/, Joi.string()),
-          }),
-        })
-      )
-      .required(),
-  }).required(),
+  packages: Joi.object()
+    .pattern(/^/, packageSchema)
+    .required(),
 }).required()
 
 const queryParamSchema = Joi.object({
@@ -79,7 +81,7 @@ module.exports = class PackagistVersion extends BasePackagistService {
         },
         staticPreview: renderVersionBadge({ version: '4.2.2' }),
         keywords,
-        documentation,
+        documentation: customServerDocumentationFragment,
       },
     ]
   }
@@ -97,8 +99,8 @@ module.exports = class PackagistVersion extends BasePackagistService {
     return renderVersionBadge({ version })
   }
 
-  transform({ type, json }) {
-    const versionsData = json.package.versions
+  transform({ type, json, user, repo }) {
+    const versionsData = json.packages[this.getPackageName(user, repo)]
     let versions = Object.keys(versionsData)
     const aliasesMap = {}
     versions.forEach(version => {
@@ -137,7 +139,7 @@ module.exports = class PackagistVersion extends BasePackagistService {
       schema: type === 'v' ? allVersionsSchema : schema,
       server,
     })
-    const { version } = this.transform({ type, json })
+    const { version } = this.transform({ type, json, user, repo })
     return this.constructor.render({ version })
   }
 }
diff --git a/services/packagist/packagist-version.spec.js b/services/packagist/packagist-version.spec.js
deleted file mode 100644
index 762acd967b38cc0a87b19fc4ffa6045c1769e6bb..0000000000000000000000000000000000000000
--- a/services/packagist/packagist-version.spec.js
+++ /dev/null
@@ -1,6 +0,0 @@
-'use strict'
-
-// const { expect } = require('chai')
-// const PackagistVersion = require('./packagist-version.service')
-
-describe('PackagistVersion', function() {})
diff --git a/services/pipenv-helpers.js b/services/pipenv-helpers.js
new file mode 100644
index 0000000000000000000000000000000000000000..c77b7babf2e7a30318c1d087be99bfbf9fd6960e
--- /dev/null
+++ b/services/pipenv-helpers.js
@@ -0,0 +1,58 @@
+'use strict'
+
+const Joi = require('@hapi/joi')
+const { InvalidParameter } = require('.')
+
+const isDependency = Joi.alternatives(
+  Joi.object({
+    version: Joi.string().required(),
+  }).required(),
+  Joi.object({
+    ref: Joi.string().required(),
+  }).required()
+)
+
+const isLockfile = Joi.object({
+  _meta: Joi.object({
+    requires: Joi.object({
+      python_version: Joi.string(),
+    }).required(),
+  }).required(),
+  default: Joi.object().pattern(Joi.string().required(), isDependency),
+  develop: Joi.object().pattern(Joi.string().required(), isDependency),
+}).required()
+
+function getDependencyVersion({
+  kind = 'default',
+  wantedDependency,
+  lockfileData,
+}) {
+  let dependenciesOfKind
+  if (kind === 'dev') {
+    dependenciesOfKind = lockfileData.develop
+  } else if (kind === 'default') {
+    dependenciesOfKind = lockfileData.default
+  } else {
+    throw Error(`Not very kind: ${kind}`)
+  }
+
+  if (!(wantedDependency in dependenciesOfKind)) {
+    throw new InvalidParameter({
+      prettyMessage: `${kind} dependency not found`,
+    })
+  }
+
+  const { version, ref } = dependenciesOfKind[wantedDependency]
+
+  if (version) {
+    // Strip the `==` which is always present.
+    return { version: version.replace('==', '') }
+  } else {
+    return { ref: ref.substring(1, 8) }
+  }
+}
+
+module.exports = {
+  isLockfile,
+  getDependencyVersion,
+}
diff --git a/services/pypi/pypi-python-versions.tester.js b/services/pypi/pypi-python-versions.tester.js
index b55749d8a5e70b5b39e19854b10e33e8b3571d79..25552ab4f2306a481b373cdeebe683682c717971 100644
--- a/services/pypi/pypi-python-versions.tester.js
+++ b/services/pypi/pypi-python-versions.tester.js
@@ -3,7 +3,6 @@
 const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
-// These regexes are the same, but declared separately for clarity.
 const isPipeSeparatedPythonVersions = Joi.string().regex(
   /^([0-9]+\.[0-9]+(?: \| )?)+$/
 )
diff --git a/services/scrutinizer/scrutinizer-base.js b/services/scrutinizer/scrutinizer-base.js
index 7f1424f714d358f437c494518f89fc78d65316a1..b2a7c59cab8492f42076cd5f99863a75c7808858 100644
--- a/services/scrutinizer/scrutinizer-base.js
+++ b/services/scrutinizer/scrutinizer-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const { BaseJsonService, NotFound } = require('..')
+const { BaseJsonService, NotFound, InvalidResponse } = require('..')
 
 module.exports = class ScrutinizerBase extends BaseJsonService {
   // https://scrutinizer-ci.com/docs/api/#repository-details
@@ -30,13 +30,17 @@ module.exports = class ScrutinizerBase extends BaseJsonService {
   }
 
   transformBranchInfoMetricValue({ json, branch, metric }) {
+    const branchInfo = this.transformBranchInfo({ json, wantedBranch: branch })
+    if (!branchInfo.index) {
+      throw new InvalidResponse({ prettyMessage: 'metrics missing for branch' })
+    }
     const {
       index: {
         _embedded: {
           project: { metric_values: metricValues },
         },
       },
-    } = this.transformBranchInfo({ json, wantedBranch: branch })
+    } = branchInfo
 
     return { value: metricValues[metric] }
   }
diff --git a/services/scrutinizer/scrutinizer-coverage.service.js b/services/scrutinizer/scrutinizer-coverage.service.js
index d8bdeb4445d89ff84d37ac0915105bb6ef057c86..243549b12fd6112873889ce76bc511b46468c37d 100644
--- a/services/scrutinizer/scrutinizer-coverage.service.js
+++ b/services/scrutinizer/scrutinizer-coverage.service.js
@@ -19,7 +19,7 @@ const schema = Joi.object({
               }).required(),
             }).required(),
           }).required(),
-        }).required(),
+        }),
       })
     )
     .required(),
diff --git a/services/scrutinizer/scrutinizer-coverage.spec.js b/services/scrutinizer/scrutinizer-coverage.spec.js
index ffe58da93a09aad35054ef93178f5641edbd9790..d16d90aef7123798d109446eb3dc4b80ae0a76ec 100644
--- a/services/scrutinizer/scrutinizer-coverage.spec.js
+++ b/services/scrutinizer/scrutinizer-coverage.spec.js
@@ -3,7 +3,7 @@
 const { expect } = require('chai')
 const { test, given } = require('sazerac')
 const [ScrutinizerCoverage] = require('./scrutinizer-coverage.service')
-const { NotFound } = require('..')
+const { InvalidResponse, NotFound } = require('..')
 
 describe('ScrutinizerCoverage', function() {
   test(ScrutinizerCoverage.render, () => {
@@ -50,5 +50,24 @@ describe('ScrutinizerCoverage', function() {
         expect(e.prettyMessage).to.equal('coverage not found')
       }
     })
+    it('throws InvalidResponse error when branch is missing statistics', function() {
+      expect(() =>
+        ScrutinizerCoverage.prototype.transform({
+          branch: 'gh-pages',
+          json: {
+            applications: {
+              master: { index: {} },
+              'gh-pages': {
+                build_status: {
+                  status: 'unknown',
+                },
+              },
+            },
+          },
+        })
+      )
+        .to.throw(InvalidResponse)
+        .with.property('prettyMessage', 'metrics missing for branch')
+    })
   })
 })
diff --git a/services/scrutinizer/scrutinizer-quality.service.js b/services/scrutinizer/scrutinizer-quality.service.js
index 74f7f4d227da8a45fa8d95edf70de252e9c15989..514351e529af94b2540049f642d41d3e9c4ba30a 100644
--- a/services/scrutinizer/scrutinizer-quality.service.js
+++ b/services/scrutinizer/scrutinizer-quality.service.js
@@ -18,7 +18,7 @@ const schema = Joi.object({
               }).required(),
             }).required(),
           }).required(),
-        }).required(),
+        }),
       })
     )
     .required(),
diff --git a/services/security-headers/security-headers.service.js b/services/security-headers/security-headers.service.js
index 24e148dc8d059ec65826212019099e1ad7db73ed..f3776bdf25923b68abfc3f85e3482b9c066eb53a 100644
--- a/services/security-headers/security-headers.service.js
+++ b/services/security-headers/security-headers.service.js
@@ -69,7 +69,7 @@ module.exports = class SecurityHeaders extends BaseService {
     }
   }
 
-  async handle({}, { url }) {
+  async handle(namedParams, { url }) {
     const { res } = await this._request({
       url: `https://securityheaders.com`,
       options: {
diff --git a/services/sonar/sonar-base.js b/services/sonar/sonar-base.js
index 3c29dbbff16ec80ef861dfb0c9ef93de1bdc1abc..05d0a4ed6623958dc7b1f51deafb56e99fe729b9 100644
--- a/services/sonar/sonar-base.js
+++ b/services/sonar/sonar-base.js
@@ -2,7 +2,19 @@
 
 const Joi = require('@hapi/joi')
 const { isLegacyVersion } = require('./sonar-helpers')
-const { BaseJsonService } = require('..')
+const { BaseJsonService, NotFound } = require('..')
+
+// It is possible to see HTTP 404 response codes and HTTP 200 responses
+// with empty arrays of metric values, with both the legacy (pre v5.3) and modern APIs.
+//
+// 404 responses can occur with non-existent component keys, as well as unknown/unsupported metrics.
+//
+// 200 responses with empty arrays can occur when the metric key is valid, but the data
+// is unavailable for the specified component, for example using the metric key `tests` with a
+// component that is not capturing test results.
+// It can also happen when using an older/deprecated
+// metric key with a newer version of Sonar, for example using the metric key
+// `public_documented_api_density` with SonarQube v7.x or higher
 
 const modernSchema = Joi.object({
   component: Joi.object({
@@ -14,8 +26,9 @@ const modernSchema = Joi.object({
             Joi.number().min(0),
             Joi.allow('OK', 'ERROR')
           ).required(),
-        }).required()
+        })
       )
+      .min(0)
       .required(),
   }).required(),
 }).required()
@@ -31,7 +44,7 @@ const legacySchema = Joi.array()
               Joi.number().min(0),
               Joi.allow('OK', 'ERROR')
             ).required(),
-          }).required()
+          })
         )
         .required(),
     }).required()
@@ -83,12 +96,22 @@ module.exports = class SonarBase extends BaseJsonService {
     const metrics = {}
 
     if (useLegacyApi) {
-      json[0].msr.forEach(measure => {
+      const [{ msr: measures }] = json
+      if (!measures.length) {
+        throw new NotFound({ prettyMessage: 'metric not found' })
+      }
+      measures.forEach(measure => {
         // Most values are numeric, but not all of them.
         metrics[measure.key] = parseInt(measure.val) || measure.val
       })
     } else {
-      json.component.measures.forEach(measure => {
+      const {
+        component: { measures },
+      } = json
+      if (!measures.length) {
+        throw new NotFound({ prettyMessage: 'metric not found' })
+      }
+      measures.forEach(measure => {
         // Most values are numeric, but not all of them.
         metrics[measure.metric] = parseInt(measure.value) || measure.value
       })
diff --git a/services/sonar/sonar-coverage.tester.js b/services/sonar/sonar-coverage.tester.js
index 1957df8d06223ca558b1858320cc73224b2cfd10..feb31425c22febd0f86452b48ebc201d87e5f92e 100644
--- a/services/sonar/sonar-coverage.tester.js
+++ b/services/sonar/sonar-coverage.tester.js
@@ -3,10 +3,14 @@
 const t = (module.exports = require('../tester').createServiceTester())
 const { isIntegerPercentage } = require('../test-validators')
 
+// The service tests targeting the legacy SonarQube API are mocked
+// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances
+// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details
+// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model
+// for other service tests.
+
 t.create('Coverage')
-  .get(
-    '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com'
-  )
+  .get('/swellaby%3Aletra.json?server=https://sonarcloud.io')
   .expectBadge({
     label: 'coverage',
     message: isIntegerPercentage,
@@ -16,7 +20,27 @@ t.create('Coverage (legacy API supported)')
   .get(
     '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'coverage',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'coverage',
+              val: 83,
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'coverage',
-    message: isIntegerPercentage,
+    message: '83%',
   })
diff --git a/services/sonar/sonar-documented-api-density.tester.js b/services/sonar/sonar-documented-api-density.tester.js
index e5982f4cbcecfe2cdecef3cc8764c647a2519a11..b879d6f5b10b0c830cf90739f33e6d951ddc5d99 100644
--- a/services/sonar/sonar-documented-api-density.tester.js
+++ b/services/sonar/sonar-documented-api-density.tester.js
@@ -1,22 +1,78 @@
 'use strict'
 
-const { isIntegerPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
+// The service tests targeting the legacy SonarQube API are mocked
+// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances
+// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details
+// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model
+// for other service tests.
+
+// This metric was deprecated in SonarQube 6.2 and dropped in SonarQube 7.x+
+// https://docs.sonarqube.org/6.7/MetricDefinitions.html#src-11634682_MetricDefinitions-Documentation
+// https://docs.sonarqube.org/7.0/MetricDefinitions.html
+// https://sonarcloud.io/api/measures/component?componentKey=org.sonarsource.sonarqube:sonarqube&metricKeys=public_documented_api_density
+t.create('Documented API Density (not found)')
+  .get(
+    '/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
+  )
+  .expectBadge({
+    label: 'public documented api density',
+    message: 'metric not found',
+  })
+
 t.create('Documented API Density')
   .get(
-    '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com'
+    '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.somewhatold.com&sonarVersion=6.1'
+  )
+  .intercept(nock =>
+    nock('http://sonar.somewhatold.com/api')
+      .get('/measures/component')
+      .query({
+        componentKey: 'org.ow2.petals:petals-se-ase',
+        metricKeys: 'public_documented_api_density',
+      })
+      .reply(200, {
+        component: {
+          measures: [
+            {
+              metric: 'public_documented_api_density',
+              value: 91,
+            },
+          ],
+        },
+      })
   )
   .expectBadge({
     label: 'public documented api density',
-    message: isIntegerPercentage,
+    message: '91%',
   })
 
 t.create('Documented API Density (legacy API supported)')
   .get(
     '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'public_documented_api_density',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'public_documented_api_density',
+              val: 79,
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'public documented api density',
-    message: isIntegerPercentage,
+    message: '79%',
   })
diff --git a/services/sonar/sonar-fortify-rating.tester.js b/services/sonar/sonar-fortify-rating.tester.js
index ea1fc375eea5a001c390db843d68a8957f46ac1f..760ba28d09f59cab05c671f24a25834d73a02c03 100644
--- a/services/sonar/sonar-fortify-rating.tester.js
+++ b/services/sonar/sonar-fortify-rating.tester.js
@@ -2,7 +2,13 @@
 
 const t = (module.exports = require('../tester').createServiceTester())
 
-// The below tests are using a mocked API response because
+// The service tests targeting the legacy SonarQube API are mocked
+// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances
+// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details
+// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model
+// for other service tests.
+
+// The below tests are all using a mocked API response because
 // neither SonarCloud.io nor any known public SonarQube deployments
 // have the Fortify plugin installed and in use, so there are no
 // available live endpoints to hit.
@@ -75,3 +81,27 @@ t.create('Fortify Security Rating (nonexistent component)')
     label: 'fortify-security-rating',
     message: 'component or metric not found, or legacy API not supported',
   })
+
+t.create('Fortify Security Rating (legacy API metric not found)')
+  .get(
+    '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
+  )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'fortify-security-rating',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [],
+        },
+      ])
+  )
+  .expectBadge({
+    label: 'fortify-security-rating',
+    message: 'metric not found',
+  })
diff --git a/services/sonar/sonar-generic.tester.js b/services/sonar/sonar-generic.tester.js
index 65edbef31c9b3476304ebd8bc8a662371bdecb90..3d5bfffd52834d31759b7fef8cfd2ee86231e641 100644
--- a/services/sonar/sonar-generic.tester.js
+++ b/services/sonar/sonar-generic.tester.js
@@ -4,6 +4,7 @@ const { isMetric } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Security Rating')
+  .timeout(10000)
   .get(
     '/security_rating/com.luckybox:luckybox.json?server=https://sonarcloud.io'
   )
diff --git a/services/sonar/sonar-quality-gate.tester.js b/services/sonar/sonar-quality-gate.tester.js
index ce8a66a4d48bf4532c5100eb7c65c6250d7da07e..f7c79b1d83ae0b69da58e559a2c5f5fb4dce91a6 100644
--- a/services/sonar/sonar-quality-gate.tester.js
+++ b/services/sonar/sonar-quality-gate.tester.js
@@ -5,6 +5,12 @@ const t = (module.exports = require('../tester').createServiceTester())
 
 const isQualityGateStatus = Joi.allow('passed', 'failed')
 
+// The service tests targeting the legacy SonarQube API are mocked
+// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances
+// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details
+// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model
+// for other service tests.
+
 t.create('Quality Gate')
   .get(
     '/quality_gate/swellaby%3Aazdo-shellcheck.json?server=https://sonarcloud.io'
@@ -18,7 +24,27 @@ t.create('Quality Gate (Alert Status)')
   .get(
     '/alert_status/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'alert_status',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'alert_status',
+              val: 'OK',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'quality gate',
-    message: isQualityGateStatus,
+    message: 'passed',
   })
diff --git a/services/sonar/sonar-tech-debt.tester.js b/services/sonar/sonar-tech-debt.tester.js
index 0a16cae21d00b03fae1d5dd61edb6d08852ff396..651bc43c8ea23535b9e462ea08c58e97cb091839 100644
--- a/services/sonar/sonar-tech-debt.tester.js
+++ b/services/sonar/sonar-tech-debt.tester.js
@@ -1,22 +1,48 @@
 'use strict'
 
-const { isIntegerPercentage } = require('../test-validators')
+const { isPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
+// The service tests targeting the legacy SonarQube API are mocked
+// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances
+// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details
+// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model
+// for other service tests.
+
 t.create('Tech Debt')
   .get(
-    '/tech_debt/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com'
+    '/tech_debt/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
   )
   .expectBadge({
     label: 'tech debt',
-    message: isIntegerPercentage,
+    message: isPercentage,
   })
 
 t.create('Tech Debt (legacy API supported)')
   .get(
     '/tech_debt/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'sqale_debt_ratio',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'sqale_debt_ratio',
+              val: '7',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'tech debt',
-    message: isIntegerPercentage,
+    message: '7%',
   })
diff --git a/services/sonar/sonar-tests.tester.js b/services/sonar/sonar-tests.tester.js
index 2433ba3df27aa087947eb7877f7a469733be49d0..cc929b0f206e16c9447e7b7c39cd21a00e9301f4 100644
--- a/services/sonar/sonar-tests.tester.js
+++ b/services/sonar/sonar-tests.tester.js
@@ -21,6 +21,12 @@ const isMetricAllowZero = Joi.alternatives(
     .required()
 )
 
+// The service tests targeting the legacy SonarQube API are mocked
+// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances
+// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details
+// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model
+// for other service tests.
+
 t.create('Tests')
   .timeout(10000)
   .get(
@@ -32,13 +38,40 @@ t.create('Tests')
   })
 
 t.create('Tests (legacy API supported)')
-  .timeout(10000)
   .get(
     '/tests/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'tests,test_failures,skipped_tests',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'tests',
+              val: '71',
+            },
+            {
+              key: 'test_failures',
+              val: '2',
+            },
+            {
+              key: 'skipped_tests',
+              val: '1',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'tests',
-    message: isDefaultTestTotals,
+    message: '68 passed, 2 failed, 1 skipped',
   })
 
 t.create('Tests with compact message')
@@ -90,13 +123,32 @@ t.create('Total Test Count')
   })
 
 t.create('Total Test Count (legacy API supported)')
-  .timeout(10000)
   .get(
     '/total_tests/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'tests',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'tests',
+              val: '132',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'total tests',
-    message: isMetric,
+    message: '132',
   })
 
 t.create('Test Failures Count')
@@ -110,13 +162,32 @@ t.create('Test Failures Count')
   })
 
 t.create('Test Failures Count (legacy API supported)')
-  .timeout(10000)
   .get(
     '/test_failures/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'test_failures',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'test_failures',
+              val: '2',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'test failures',
-    message: isMetricAllowZero,
+    message: '2',
   })
 
 t.create('Test Errors Count')
@@ -130,13 +201,32 @@ t.create('Test Errors Count')
   })
 
 t.create('Test Errors Count (legacy API supported)')
-  .timeout(10000)
   .get(
     '/test_errors/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'test_errors',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'test_errors',
+              val: '3',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'test errors',
-    message: isMetricAllowZero,
+    message: '3',
   })
 
 t.create('Skipped Tests Count')
@@ -150,13 +240,32 @@ t.create('Skipped Tests Count')
   })
 
 t.create('Skipped Tests Count (legacy API supported)')
-  .timeout(10000)
   .get(
     '/skipped_tests/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'skipped_tests',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'skipped_tests',
+              val: '1',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'skipped tests',
-    message: isMetricAllowZero,
+    message: '1',
   })
 
 t.create('Test Success Rate')
@@ -170,11 +279,30 @@ t.create('Test Success Rate')
   })
 
 t.create('Test Success Rate (legacy API supported)')
-  .timeout(10000)
   .get(
     '/test_success_density/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'test_success_density',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'test_success_density',
+              val: '97',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'tests',
-    message: isIntegerPercentage,
+    message: '97%',
   })
diff --git a/services/sonar/sonar-violations.tester.js b/services/sonar/sonar-violations.tester.js
index cc9d68be948e023f7045b5098d2e6120aa7a5d8b..dc3d7e9e95eda3e1c5c8a97ad11a3fcf4c1d1e50 100644
--- a/services/sonar/sonar-violations.tester.js
+++ b/services/sonar/sonar-violations.tester.js
@@ -10,9 +10,16 @@ const isViolationsLongFormMetric = Joi.alternatives(
   )
 )
 
+// The service tests targeting the legacy SonarQube API are mocked
+// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances
+// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details
+// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model
+// for other service tests.
+
 t.create('Violations')
+  .timeout(10000)
   .get(
-    '/violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com'
+    '/violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
   )
   .expectBadge({
     label: 'violations',
@@ -23,14 +30,35 @@ t.create('Violations (legacy API supported)')
   .get(
     '/violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'violations',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'violations',
+              val: '7',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'violations',
-    message: isMetric,
+    message: '7',
   })
 
 t.create('Violations Long Format')
+  .timeout(10000)
   .get(
-    '/violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&format=long'
+    '/violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io&format=long'
   )
   .expectBadge({
     label: 'violations',
@@ -41,14 +69,56 @@ t.create('Violations Long Format (legacy API supported)')
   .get(
     '/violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2&format=long'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics:
+          'violations,blocker_violations,critical_violations,major_violations,minor_violations,info_violations',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'violations',
+              val: '10',
+            },
+            {
+              key: 'blocker_violations',
+              val: '1',
+            },
+            {
+              key: 'critical_violations',
+              val: '0',
+            },
+            {
+              key: 'major_violations',
+              val: '2',
+            },
+            {
+              key: 'minor_violations',
+              val: '0',
+            },
+            {
+              key: 'info_violations',
+              val: '7',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'violations',
-    message: isViolationsLongFormMetric,
+    message: '1 blocker, 2 major, 7 info',
   })
 
 t.create('Blocker Violations')
+  .timeout(10000)
   .get(
-    '/blocker_violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com'
+    '/blocker_violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
   )
   .expectBadge({
     label: 'blocker violations',
@@ -59,14 +129,35 @@ t.create('Blocker Violations (legacy API supported)')
   .get(
     '/blocker_violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'blocker_violations',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'blocker_violations',
+              val: '1',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'blocker violations',
-    message: isMetric,
+    message: '1',
   })
 
 t.create('Critical Violations')
+  .timeout(10000)
   .get(
-    '/critical_violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com'
+    '/critical_violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io'
   )
   .expectBadge({
     label: 'critical violations',
@@ -77,7 +168,27 @@ t.create('Critical Violations (legacy API supported)')
   .get(
     '/critical_violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2'
   )
+  .intercept(nock =>
+    nock('http://sonar.petalslink.com/api')
+      .get('/resources')
+      .query({
+        resource: 'org.ow2.petals:petals-se-ase',
+        depth: 0,
+        metrics: 'critical_violations',
+        includeTrends: true,
+      })
+      .reply(200, [
+        {
+          msr: [
+            {
+              key: 'critical_violations',
+              val: '2',
+            },
+          ],
+        },
+      ])
+  )
   .expectBadge({
     label: 'critical violations',
-    message: isMetric,
+    message: '2',
   })
diff --git a/services/suggest.integration.js b/services/suggest.integration.js
index f3c0c82fd9f2c09ddc09390209712d5526160e8f..56c790410bb0f03c3ec27953019e10c84777039d 100644
--- a/services/suggest.integration.js
+++ b/services/suggest.integration.js
@@ -8,7 +8,7 @@ const got = require('../core/got-test-client')
 const { setRoutes } = require('./suggest')
 const GithubApiProvider = require('./github/github-api-provider')
 
-describe('GitHub badge suggestions', function() {
+describe('Badge suggestions for', function() {
   const githubApiBaseUrl = process.env.GITHUB_URL || 'https://api.github.com'
 
   let token, apiProvider
@@ -46,143 +46,230 @@ describe('GitHub badge suggestions', function() {
   before(function() {
     setRoutes([origin], apiProvider, camp)
   })
-
-  context('with an existing project', function() {
-    it('returns the expected suggestions', async function() {
-      const { statusCode, body } = await got(
-        `${baseUrl}/$suggest/v1?url=${encodeURIComponent(
-          'https://github.com/atom/atom'
-        )}`,
-        {
-          json: true,
-        }
-      )
-      expect(statusCode).to.equal(200)
-      expect(body).to.deep.equal({
-        suggestions: [
-          {
-            title: 'GitHub issues',
-            link: 'https://github.com/atom/atom/issues',
-            example: {
-              pattern: '/github/issues/:user/:repo',
-              namedParams: { user: 'atom', repo: 'atom' },
-              queryParams: {},
-            },
-          },
+  describe('GitHub', function() {
+    context('with an existing project', function() {
+      it('returns the expected suggestions', async function() {
+        const { statusCode, body } = await got(
+          `${baseUrl}/$suggest/v1?url=${encodeURIComponent(
+            'https://github.com/atom/atom'
+          )}`,
           {
-            title: 'GitHub forks',
-            link: 'https://github.com/atom/atom/network',
-            example: {
-              pattern: '/github/forks/:user/:repo',
-              namedParams: { user: 'atom', repo: 'atom' },
-              queryParams: {},
+            json: true,
+          }
+        )
+        expect(statusCode).to.equal(200)
+        expect(body).to.deep.equal({
+          suggestions: [
+            {
+              title: 'GitHub issues',
+              link: 'https://github.com/atom/atom/issues',
+              example: {
+                pattern: '/github/issues/:user/:repo',
+                namedParams: { user: 'atom', repo: 'atom' },
+                queryParams: {},
+              },
             },
-          },
-          {
-            title: 'GitHub stars',
-            link: 'https://github.com/atom/atom/stargazers',
-            example: {
-              pattern: '/github/stars/:user/:repo',
-              namedParams: { user: 'atom', repo: 'atom' },
-              queryParams: {},
+            {
+              title: 'GitHub forks',
+              link: 'https://github.com/atom/atom/network',
+              example: {
+                pattern: '/github/forks/:user/:repo',
+                namedParams: { user: 'atom', repo: 'atom' },
+                queryParams: {},
+              },
             },
-          },
-          {
-            title: 'GitHub license',
-            link: 'https://github.com/atom/atom/blob/master/LICENSE.md',
-            example: {
-              pattern: '/github/license/:user/:repo',
-              namedParams: { user: 'atom', repo: 'atom' },
-              queryParams: {},
+            {
+              title: 'GitHub stars',
+              link: 'https://github.com/atom/atom/stargazers',
+              example: {
+                pattern: '/github/stars/:user/:repo',
+                namedParams: { user: 'atom', repo: 'atom' },
+                queryParams: {},
+              },
             },
-          },
-          {
-            title: 'Twitter',
-            link:
-              'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fatom%2Fatom',
-            example: {
-              pattern: '/twitter/url',
-              namedParams: {},
-              queryParams: {
-                url: 'https://github.com/atom/atom',
+            {
+              title: 'GitHub license',
+              link: 'https://github.com/atom/atom/blob/master/LICENSE.md',
+              example: {
+                pattern: '/github/license/:user/:repo',
+                namedParams: { user: 'atom', repo: 'atom' },
+                queryParams: {},
               },
             },
-            preview: {
-              style: 'social',
+            {
+              title: 'Twitter',
+              link:
+                'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fatom%2Fatom',
+              example: {
+                pattern: '/twitter/url',
+                namedParams: {},
+                queryParams: {
+                  url: 'https://github.com/atom/atom',
+                },
+              },
+              preview: {
+                style: 'social',
+              },
             },
-          },
-        ],
+          ],
+        })
       })
     })
-  })
 
-  context('with a non-existent project', function() {
-    it('returns the expected suggestions', async function() {
-      this.timeout(5000)
+    context('with a non-existent project', function() {
+      it('returns the expected suggestions', async function() {
+        this.timeout(5000)
 
-      const { statusCode, body } = await got(
-        `${baseUrl}/$suggest/v1?url=${encodeURIComponent(
-          'https://github.com/badges/not-a-real-project'
-        )}`,
-        {
-          json: true,
-        }
-      )
-      expect(statusCode).to.equal(200)
-      expect(body).to.deep.equal({
-        suggestions: [
+        const { statusCode, body } = await got(
+          `${baseUrl}/$suggest/v1?url=${encodeURIComponent(
+            'https://github.com/badges/not-a-real-project'
+          )}`,
           {
-            title: 'GitHub issues',
-            link: 'https://github.com/badges/not-a-real-project/issues',
-            example: {
-              pattern: '/github/issues/:user/:repo',
-              namedParams: { user: 'badges', repo: 'not-a-real-project' },
-              queryParams: {},
+            json: true,
+          }
+        )
+        expect(statusCode).to.equal(200)
+        expect(body).to.deep.equal({
+          suggestions: [
+            {
+              title: 'GitHub issues',
+              link: 'https://github.com/badges/not-a-real-project/issues',
+              example: {
+                pattern: '/github/issues/:user/:repo',
+                namedParams: { user: 'badges', repo: 'not-a-real-project' },
+                queryParams: {},
+              },
             },
-          },
-          {
-            title: 'GitHub forks',
-            link: 'https://github.com/badges/not-a-real-project/network',
-            example: {
-              pattern: '/github/forks/:user/:repo',
-              namedParams: { user: 'badges', repo: 'not-a-real-project' },
-              queryParams: {},
+            {
+              title: 'GitHub forks',
+              link: 'https://github.com/badges/not-a-real-project/network',
+              example: {
+                pattern: '/github/forks/:user/:repo',
+                namedParams: { user: 'badges', repo: 'not-a-real-project' },
+                queryParams: {},
+              },
             },
-          },
-          {
-            title: 'GitHub stars',
-            link: 'https://github.com/badges/not-a-real-project/stargazers',
-            example: {
-              pattern: '/github/stars/:user/:repo',
-              namedParams: { user: 'badges', repo: 'not-a-real-project' },
-              queryParams: {},
+            {
+              title: 'GitHub stars',
+              link: 'https://github.com/badges/not-a-real-project/stargazers',
+              example: {
+                pattern: '/github/stars/:user/:repo',
+                namedParams: { user: 'badges', repo: 'not-a-real-project' },
+                queryParams: {},
+              },
             },
-          },
+            {
+              title: 'GitHub license',
+              link: 'https://github.com/badges/not-a-real-project',
+              example: {
+                pattern: '/github/license/:user/:repo',
+                namedParams: { user: 'badges', repo: 'not-a-real-project' },
+                queryParams: {},
+              },
+            },
+            {
+              title: 'Twitter',
+              link:
+                'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fbadges%2Fnot-a-real-project',
+              example: {
+                pattern: '/twitter/url',
+                namedParams: {},
+                queryParams: {
+                  url: 'https://github.com/badges/not-a-real-project',
+                },
+              },
+              preview: {
+                style: 'social',
+              },
+            },
+          ],
+        })
+      })
+    })
+  })
+
+  describe('GitLab', function() {
+    context('with an existing project', function() {
+      it('returns the expected suggestions', async function() {
+        const { statusCode, body } = await got(
+          `${baseUrl}/$suggest/v1?url=${encodeURIComponent(
+            'https://gitlab.com/gitlab-org/gitlab'
+          )}`,
           {
-            title: 'GitHub license',
-            link: 'https://github.com/badges/not-a-real-project',
-            example: {
-              pattern: '/github/license/:user/:repo',
-              namedParams: { user: 'badges', repo: 'not-a-real-project' },
-              queryParams: {},
+            json: true,
+          }
+        )
+        expect(statusCode).to.equal(200)
+        expect(body).to.deep.equal({
+          suggestions: [
+            {
+              title: 'GitLab pipeline',
+              link: 'https://gitlab.com/gitlab-org/gitlab/builds',
+              example: {
+                pattern: '/gitlab/pipeline/:user/:repo',
+                namedParams: { user: 'gitlab-org', repo: 'gitlab' },
+                queryParams: {},
+              },
             },
-          },
+            {
+              title: 'Twitter',
+              link:
+                'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgitlab.com%2Fgitlab-org%2Fgitlab',
+              example: {
+                pattern: '/twitter/url',
+                namedParams: {},
+                queryParams: {
+                  url: 'https://gitlab.com/gitlab-org/gitlab',
+                },
+              },
+              preview: {
+                style: 'social',
+              },
+            },
+          ],
+        })
+      })
+    })
+
+    context('with an nonexisting project', function() {
+      it('returns the expected suggestions', async function() {
+        const { statusCode, body } = await got(
+          `${baseUrl}/$suggest/v1?url=${encodeURIComponent(
+            'https://gitlab.com/gitlab-org/not-gitlab'
+          )}`,
           {
-            title: 'Twitter',
-            link:
-              'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fbadges%2Fnot-a-real-project',
-            example: {
-              pattern: '/twitter/url',
-              namedParams: {},
-              queryParams: {
-                url: 'https://github.com/badges/not-a-real-project',
+            json: true,
+          }
+        )
+        expect(statusCode).to.equal(200)
+        expect(body).to.deep.equal({
+          suggestions: [
+            {
+              title: 'GitLab pipeline',
+              link: 'https://gitlab.com/gitlab-org/not-gitlab/builds',
+              example: {
+                pattern: '/gitlab/pipeline/:user/:repo',
+                namedParams: { user: 'gitlab-org', repo: 'not-gitlab' },
+                queryParams: {},
               },
             },
-            preview: {
-              style: 'social',
+            {
+              title: 'Twitter',
+              link:
+                'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgitlab.com%2Fgitlab-org%2Fnot-gitlab',
+              example: {
+                pattern: '/twitter/url',
+                namedParams: {},
+                queryParams: {
+                  url: 'https://gitlab.com/gitlab-org/not-gitlab',
+                },
+              },
+              preview: {
+                style: 'social',
+              },
             },
-          },
-        ],
+          ],
+        })
       })
     })
   })
diff --git a/services/suggest.js b/services/suggest.js
index dd8ebc988ef5c1b51ee0d4db0642625be5971109..ac1c6893939a27273b18977adb12a6c861f954b6 100644
--- a/services/suggest.js
+++ b/services/suggest.js
@@ -99,18 +99,35 @@ async function githubLicense(githubApiProvider, user, repo) {
   }
 }
 
+function gitlabPipeline(user, repo) {
+  const repoSlug = `${user}/${repo}`
+  return {
+    title: 'GitLab pipeline',
+    link: `https://gitlab.com/${repoSlug}/builds`,
+    example: {
+      pattern: '/gitlab/pipeline/:user/:repo',
+      namedParams: { user, repo },
+      queryParams: {},
+    },
+  }
+}
+
 async function findSuggestions(githubApiProvider, url) {
   let promises = []
-  if (url.hostname === 'github.com') {
+  if (url.hostname === 'github.com' || url.hostname === 'gitlab.com') {
     const userRepo = url.pathname.slice(1).split('/')
     const user = userRepo[0]
     const repo = userRepo[1]
-    promises = promises.concat([
-      githubIssues(user, repo),
-      githubForks(user, repo),
-      githubStars(user, repo),
-      githubLicense(githubApiProvider, user, repo),
-    ])
+    if (url.hostname === 'github.com') {
+      promises = promises.concat([
+        githubIssues(user, repo),
+        githubForks(user, repo),
+        githubStars(user, repo),
+        githubLicense(githubApiProvider, user, repo),
+      ])
+    } else {
+      promises = promises.concat([gitlabPipeline(user, repo)])
+    }
   }
   promises.push(twitterPage(url))
 
diff --git a/services/swagger/swagger-redirect.service.js b/services/swagger/swagger-redirect.service.js
new file mode 100644
index 0000000000000000000000000000000000000000..954bd131b03655fee89d740fbfb932ffa3e5ec50
--- /dev/null
+++ b/services/swagger/swagger-redirect.service.js
@@ -0,0 +1,20 @@
+'use strict'
+
+const { redirector } = require('..')
+
+module.exports = [
+  redirector({
+    category: 'other',
+    name: 'SwaggerRedirect',
+    route: {
+      base: 'swagger/valid/2.0',
+      pattern: ':scheme(http|https)/:url*',
+    },
+    transformPath: () => `/swagger/valid/3.0`,
+    transformQueryParams: ({ scheme, url }) => {
+      const suffix = /(yaml|yml|json)$/.test(url) ? '' : '.json'
+      return { specUrl: `${scheme}://${url}${suffix}` }
+    },
+    dateAdded: new Date('2019-11-03'),
+  }),
+]
diff --git a/services/swagger/swagger-redirect.tester.js b/services/swagger/swagger-redirect.tester.js
new file mode 100644
index 0000000000000000000000000000000000000000..34e017f8af7d05f8c405c623b79cec8dcfa46feb
--- /dev/null
+++ b/services/swagger/swagger-redirect.tester.js
@@ -0,0 +1,45 @@
+'use strict'
+
+const { ServiceTester } = require('../tester')
+
+const t = (module.exports = new ServiceTester({
+  id: 'SwaggerUrlRedirect',
+  title: 'SwaggerUrlRedirect',
+  pathPrefix: '/swagger/valid/2.0',
+}))
+
+t.create('swagger json')
+  .get('/https/example.com/example.json', {
+    followRedirect: false,
+  })
+  .expectStatus(301)
+  .expectHeader(
+    'Location',
+    `/swagger/valid/3.0.json?specUrl=${encodeURIComponent(
+      'https://example.com/example.json'
+    )}`
+  )
+
+t.create('swagger yml')
+  .get('/https/example.com/example.yml', {
+    followRedirect: false,
+  })
+  .expectStatus(301)
+  .expectHeader(
+    'Location',
+    `/swagger/valid/3.0.svg?specUrl=${encodeURIComponent(
+      'https://example.com/example.yml'
+    )}`
+  )
+
+t.create('swagger yaml')
+  .get('/https/example.com/example.yaml', {
+    followRedirect: false,
+  })
+  .expectStatus(301)
+  .expectHeader(
+    'Location',
+    `/swagger/valid/3.0.svg?specUrl=${encodeURIComponent(
+      'https://example.com/example.yaml'
+    )}`
+  )
diff --git a/services/swagger/swagger.service.js b/services/swagger/swagger.service.js
index cdeac3eb4d15a45e63d0af4916402c7480b39d3f..636ae1b80d9fbce46b5cf8efb466178c68e3a589 100644
--- a/services/swagger/swagger.service.js
+++ b/services/swagger/swagger.service.js
@@ -1,9 +1,10 @@
 'use strict'
 
 const Joi = require('@hapi/joi')
-const { BaseJsonService } = require('..')
+const { optionalUrl } = require('../validators')
+const { BaseJsonService, NotFound } = require('..')
 
-const validatorSchema = Joi.object()
+const schema = Joi.object()
   .keys({
     schemaValidationMessages: Joi.array().items(
       Joi.object({
@@ -14,6 +15,10 @@ const validatorSchema = Joi.object()
   })
   .required()
 
+const queryParamSchema = Joi.object({
+  specUrl: optionalUrl.required(),
+}).required()
+
 module.exports = class SwaggerValidatorService extends BaseJsonService {
   static get category() {
     return 'other'
@@ -21,8 +26,9 @@ module.exports = class SwaggerValidatorService extends BaseJsonService {
 
   static get route() {
     return {
-      base: 'swagger/valid/2.0',
-      pattern: ':scheme(http|https)?/:url*',
+      base: 'swagger/valid',
+      pattern: '3.0',
+      queryParamSchema,
     }
   }
 
@@ -30,12 +36,11 @@ module.exports = class SwaggerValidatorService extends BaseJsonService {
     return [
       {
         title: 'Swagger Validator',
-        pattern: ':scheme/:url',
-        staticPreview: this.render({ message: 'valid', clr: 'brightgreen' }),
-        namedParams: {
-          scheme: 'https',
-          url:
-            'raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-expanded.json',
+        staticPreview: this.render({ status: 'valid' }),
+        namedParams: {},
+        queryParams: {
+          specUrl:
+            'https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-expanded.json',
         },
       },
     ]
@@ -45,31 +50,45 @@ module.exports = class SwaggerValidatorService extends BaseJsonService {
     return { label: 'swagger' }
   }
 
-  static render({ message, clr }) {
-    return { message, color: clr }
+  static render({ status }) {
+    if (status === 'valid') {
+      return { message: status, color: 'brightgreen' }
+    } else {
+      return { message: status, color: 'red' }
+    }
   }
 
-  async fetch({ scheme, urlF }) {
-    const url = 'http://online.swagger.io/validator/debug'
+  async fetch({ specUrl }) {
     return this._requestJson({
-      url,
-      schema: validatorSchema,
+      url: 'http://validator.swagger.io/validator/debug',
+      schema,
       options: {
         qs: {
-          url: `${scheme}://${urlF}`,
+          url: specUrl,
         },
       },
     })
   }
 
-  async handle({ scheme, url }) {
-    const json = await this.fetch({ scheme, urlF: url })
+  transform({ json, specUrl }) {
     const valMessages = json.schemaValidationMessages
-
     if (!valMessages || valMessages.length === 0) {
-      return this.constructor.render({ message: 'valid', clr: 'brightgreen' })
-    } else {
-      return this.constructor.render({ message: 'invalid', clr: 'red' })
+      return { status: 'valid' }
+    } else if (valMessages.length === 1) {
+      const { message, level } = valMessages[0]
+      if (level === 'error' && message === `Can't read from file ${specUrl}`) {
+        throw new NotFound({ prettyMessage: 'spec not found or unreadable ' })
+      }
+    }
+    if (valMessages.every(msg => msg.level === 'warning')) {
+      return { status: 'valid' }
     }
+    return { status: 'invalid' }
+  }
+
+  async handle(_routeParams, { specUrl }) {
+    const json = await this.fetch({ specUrl })
+    const { status } = this.transform({ json, specUrl })
+    return this.constructor.render({ status })
   }
 }
diff --git a/services/swagger/swagger.tester.js b/services/swagger/swagger.tester.js
index 6e67534c09c23d94eaa74c5e82a2af7bbb1c2af4..3f8749e46ff4ebd16fbd87784857bf1c6b1be9a4 100644
--- a/services/swagger/swagger.tester.js
+++ b/services/swagger/swagger.tester.js
@@ -1,26 +1,15 @@
 'use strict'
 
-const getURL = '/https/example.com/example.json.json'
-const apiURL = 'http://online.swagger.io'
+const getURL = '/3.0.json?specUrl=https://example.com/example.json'
+const getURLBase = '/3.0.json?specUrl='
+const apiURL = 'http://validator.swagger.io'
 const apiGetURL = '/validator/debug'
-const apiGetQueryParams = { url: 'https://example.com/example.json' }
+const apiGetQueryParams = {
+  url: 'https://example.com/example.json',
+}
 
 const t = (module.exports = require('../tester').createServiceTester())
 
-t.create('Valid')
-  .get(getURL)
-  .intercept(nock =>
-    nock(apiURL)
-      .get(apiGetURL)
-      .query(apiGetQueryParams)
-      .reply(200, {})
-  )
-  .expectBadge({
-    label: 'swagger',
-    message: 'valid',
-    color: 'brightgreen',
-  })
-
 t.create('Invalid')
   .get(getURL)
   .intercept(nock =>
@@ -41,3 +30,52 @@ t.create('Invalid')
     message: 'invalid',
     color: 'red',
   })
+
+t.create('Valid json 2.0')
+  .get(
+    `${getURLBase}https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-expanded.json`
+  )
+  .expectBadge({
+    label: 'swagger',
+    message: 'valid',
+    color: 'brightgreen',
+  })
+
+t.create('Valid yaml 3.0')
+  .get(
+    `${getURLBase}https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v3.0/petstore.yaml`
+  )
+  .expectBadge({
+    label: 'swagger',
+    message: 'valid',
+    color: 'brightgreen',
+  })
+
+t.create('Valid with warnings')
+  .get(`${getURLBase}https://petstore3.swagger.io/api/v3/openapi.json`)
+  .expectBadge({
+    label: 'swagger',
+    message: 'valid',
+    color: 'brightgreen',
+  })
+
+// Isn't a spec, but valid json
+t.create('Invalid')
+  .get(
+    `${getURLBase}https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/schemas/v3.0/schema.json`
+  )
+  .expectBadge({
+    label: 'swagger',
+    message: 'invalid',
+    color: 'red',
+  })
+
+t.create('Not found')
+  .get(
+    `${getURLBase}https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v3.0/notFound.yaml`
+  )
+  .expectBadge({
+    label: 'swagger',
+    message: 'spec not found or unreadable',
+    color: 'red',
+  })
diff --git a/services/ubuntu/ubuntu.tester.js b/services/ubuntu/ubuntu.tester.js
index a919bc3798310ca46d2d7508a728f65a4f4fec0e..8b9371ec4c3749ed6b70c285629a771a155d9195 100644
--- a/services/ubuntu/ubuntu.tester.js
+++ b/services/ubuntu/ubuntu.tester.js
@@ -1,15 +1,17 @@
 'use strict'
 
-const {
-  isVPlusDottedVersionNClausesWithOptionalSuffixAndEpoch,
-} = require('../test-validators')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
+const isUbuntuVersion = Joi.string().regex(
+  /^v(\d+:)?\d+(\.\d+)*([\w\\.]*)?([-+~].*)?$/
+)
+
 t.create('Ubuntu package (default distribution, valid)')
   .get('/apt.json')
   .expectBadge({
     label: 'ubuntu',
-    message: isVPlusDottedVersionNClausesWithOptionalSuffixAndEpoch,
+    message: isUbuntuVersion,
   })
 
 t.create('Ubuntu package (valid)')
diff --git a/services/vaadin-directory/vaadin-directory-rating-count.service.js b/services/vaadin-directory/vaadin-directory-rating-count.service.js
index 02aa2b1672ce4749cc66e614659d2e5886c4bd05..496143c1d485516458a8be226b903372f4f3ca8d 100644
--- a/services/vaadin-directory/vaadin-directory-rating-count.service.js
+++ b/services/vaadin-directory/vaadin-directory-rating-count.service.js
@@ -23,7 +23,7 @@ module.exports = class VaadinDirectoryRatingCount extends BaseVaadinDirectorySer
         pattern: 'rating-count/:packageName',
         namedParams: { packageName: 'vaadinvaadin-grid' },
         staticPreview: this.render({ ratingCount: 6 }),
-        keywords: ['vaadin-directory', 'rating-count', 'rating count'],
+        keywords: ['vaadin-directory', 'rating-count'],
       },
     ]
   }
diff --git a/services/vaadin-directory/vaadin-directory-rating.service.js b/services/vaadin-directory/vaadin-directory-rating.service.js
index 5ebfb3c90efac94bf64d001fe6478b0bf3782085..f1a6546fa4d404e5e917eea78b2f567df7232891 100644
--- a/services/vaadin-directory/vaadin-directory-rating.service.js
+++ b/services/vaadin-directory/vaadin-directory-rating.service.js
@@ -23,7 +23,7 @@ module.exports = class VaadinDirectoryRating extends BaseVaadinDirectoryService
         pattern: ':format(stars|rating)/:packageName',
         namedParams: { format: 'rating', packageName: 'vaadinvaadin-grid' },
         staticPreview: this.render({ format: 'rating', score: 4.75 }),
-        keywords: ['vaadin-directory', 'rating'],
+        keywords: ['vaadin-directory'],
       },
     ]
   }
diff --git a/services/vaadin-directory/vaadin-directory-version.service.js b/services/vaadin-directory/vaadin-directory-version.service.js
index 95187b41df04d74ae1a129d56766fab3ec768aa2..bb68f93a37f922b0ac10841e4b36c64f450a8ec9 100644
--- a/services/vaadin-directory/vaadin-directory-version.service.js
+++ b/services/vaadin-directory/vaadin-directory-version.service.js
@@ -22,7 +22,7 @@ module.exports = class VaadinDirectoryVersion extends BaseVaadinDirectoryService
         pattern: 'v/:packageName',
         namedParams: { packageName: 'vaadinvaadin-grid' },
         staticPreview: renderVersionBadge({ version: 'v5.3.0-alpha4' }),
-        keywords: ['vaadin-directory', 'version', 'latest version'],
+        keywords: ['vaadin-directory', 'latest'],
       },
     ]
   }
diff --git a/services/w3c/w3c-validation-helper.js b/services/w3c/w3c-validation-helper.js
new file mode 100644
index 0000000000000000000000000000000000000000..3f0a75f4016db4f23f8aefa335cb01b790d33ed0
--- /dev/null
+++ b/services/w3c/w3c-validation-helper.js
@@ -0,0 +1,156 @@
+'use strict'
+
+const html5Expression =
+  '^HTML\\s?,\\s?SVG\\s?1\\.1\\s?,\\s?MathML\\s?3\\.0(\\s?,\\s?((ITS\\s?2\\.0)|(RDFa\\s?Lite\\s?1\\.1)))?$'
+const html4Expression =
+  '^HTML\\s?4\\.01\\s?(Strict|Transitional|Frameset)\\s?,\\s?URL\\s?\\/\\s?XHTML\\s?1\\.0\\s?(Strict|Transitional|Frameset)\\s?,\\s?URL$'
+const xhtmlExpression =
+  '^(XHTML\\s?,\\s?SVG\\s?1\\.1\\s?,\\s?MathML\\s?3\\.0(\\s?,\\s?RDFa\\s?Lite\\s?1\\.1)?)|(XHTML\\s?1\\.0\\s?Strict\\s?,\\s?URL\\s?,\\s?Ruby\\s?,\\s?SVG\\s?1\\.1\\s?,\\s?MathML\\s?3\\.0)$'
+const svgExpression =
+  '^SVG\\s?1\\.1\\s?,\\s?URL\\s?,\\s?XHTML\\s?,\\s?MathML\\s?3\\.0$'
+const presetRegex = new RegExp(
+  `(${html5Expression})|(${html4Expression})|(${xhtmlExpression})|(${svgExpression})`,
+  'i'
+)
+
+const getMessage = messageTypes => {
+  const messageTypeKeys = Object.keys(messageTypes)
+  messageTypeKeys.sort() // Sort to make the order error, warning for display
+
+  if (messageTypeKeys.length === 0) {
+    return 'validated'
+  }
+
+  const messages = messageTypeKeys.map(
+    key => `${messageTypes[key]} ${key}${messageTypes[key] > 1 ? 's' : ''}`
+  )
+  return messages.join(', ')
+}
+
+const getColor = messageTypes => {
+  if ('error' in messageTypes) {
+    return 'red'
+  }
+
+  if ('warning' in messageTypes) {
+    return 'yellow'
+  }
+
+  return 'brightgreen'
+}
+
+const getSchema = preset => {
+  if (!preset) return undefined
+  const decodedPreset = decodeURI(preset)
+  const schema = []
+  if (new RegExp(html4Expression, 'i').test(decodedPreset)) {
+    if (/Strict/i.test(decodedPreset)) {
+      schema.push('http://s.validator.nu/xhtml10/xhtml-strict.rnc')
+    } else if (/Transitional/i.test(decodedPreset)) {
+      schema.push('http://s.validator.nu/xhtml10/xhtml-transitional.rnc')
+    } else {
+      schema.push('http://s.validator.nu/xhtml10/xhtml-frameset.rnc')
+    }
+    schema.push('http://c.validator.nu/all-html4/')
+  } else if (/1\.0 Strict, URL, Ruby, SVG 1\.1/i.test(decodedPreset)) {
+    schema.push('http://s.validator.nu/xhtml1-ruby-rdf-svg-mathml.rnc')
+    schema.push('http://c.validator.nu/all-html4/')
+  } else {
+    if (new RegExp(html5Expression, 'i').test(decodedPreset)) {
+      if (/ITS 2\.0/i.test(decodedPreset)) {
+        schema.push('http://s.validator.nu/html5-its.rnc')
+      } else if (/RDFa Lite 1\.1/i.test(decodedPreset)) {
+        schema.push('http://s.validator.nu/html5-rdfalite.rnc')
+      } else {
+        schema.push('http://s.validator.nu/html5.rnc')
+      }
+    } else if (new RegExp(xhtmlExpression, 'i').test(decodedPreset)) {
+      if (/RDFa Lite 1\.1/i.test(decodedPreset)) {
+        schema.push('http://s.validator.nu/xhtml5-rdfalite.rnc')
+      } else {
+        schema.push('http://s.validator.nu/xhtml5.rnc')
+      }
+    } else if (new RegExp(svgExpression, 'i').test(decodedPreset)) {
+      schema.push('http://s.validator.nu/svg-xhtml5-rdf-mathml.rnc')
+    }
+    schema.push('http://s.validator.nu/html5/assertions.sch')
+    schema.push('http://c.validator.nu/all/')
+  }
+  return schema.map(url => encodeURI(url)).join(' ')
+}
+
+const documentation = `
+  <style>
+    .box {
+      display: flex;
+      justify-content: space-between;
+    }
+    .note {
+      font-size: smaller;
+      text-align: left;
+    }
+  </style>
+  <p>
+    The W3C validation badge performs validation of the HTML, SVG, MathML, ITS, RDFa Lite, XHTML documents.
+    The badge uses the type property of each message found in the messages from the validation results to determine to be an error or warning.
+    The rules are as follows:
+    <ul class="note">
+      <li>info:  These messages are counted as warnings</li>
+      <li>error:  These messages are counted as errors</li>
+      <li>non-document-error: These messages are counted as errors</li>
+    </ul>
+  </p>
+  <p>
+    This badge relies on the https://validator.nu/ service to perform the validation. Please refer to https://about.validator.nu/ for the full documentation and Terms of service.
+    The following are required from the consumer for the badge to function.
+
+    <ul class="note">
+      <li>
+        Path:
+        <ul>  
+          <li>
+            parser: The parser that is used for validation. This is a passthru value to the service
+            <ul>
+              <li>default <i>(This will not pass a parser to the API and make the API choose the parser based on the validated content)</i></li>
+              <li>html <i>(HTML)</i></li>
+              <li>xml <i>(XML; don’t load external entities)</i></li>
+              <li>xmldtd <i>(XML; load external entities)</i></li>
+            </ul>
+          </li>  
+        </ul>        
+      </li>
+      <li>
+        Query string:
+        <ul>
+          <li>
+            targetUrl (Required): This is the path for the document to be validated
+          </li>
+          <li>
+            preset (Optional can be left as blank): This is used to determine the schema for the document to be valdiated against.
+            The following are the allowed values
+            <ul>
+              <li>HTML, SVG 1.1, MathML 3.0</li>
+              <li>HTML, SVG 1.1, MathML 3.0, ITS 2.0</li>
+              <li>HTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1</li>
+              <li>HTML 4.01 Strict, URL / XHTML 1.0 Strict, URL</li>
+              <li>HTML 4.01 Transitional, URL / XHTML 1.0 Transitional, URL</li>
+              <li>HTML 4.01 Frameset, URL / XHTML 1.0 Frameset, URL</li>
+              <li>XHTML, SVG 1.1, MathML 3.0</li>
+              <li>XHTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1</li>
+              <li>XHTML 1.0 Strict, URL, Ruby, SVG 1.1, MathML 3.0</li>
+              <li>SVG 1.1, URL, XHTML, MathML 3.0</li>        
+            </ul>
+          </li>
+        </ul>      
+      </li>
+    </ul>
+  </p>
+`
+
+module.exports = {
+  documentation,
+  presetRegex,
+  getColor,
+  getMessage,
+  getSchema,
+}
diff --git a/services/w3c/w3c-validation-helper.spec.js b/services/w3c/w3c-validation-helper.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..b5c98ed85283ff9afce8c9da7f0bbacc74c7ab61
--- /dev/null
+++ b/services/w3c/w3c-validation-helper.spec.js
@@ -0,0 +1,265 @@
+'use strict'
+const { expect } = require('chai')
+const { test, given, forCases } = require('sazerac')
+const {
+  presetRegex,
+  getMessage,
+  getColor,
+  getSchema,
+} = require('./w3c-validation-helper')
+
+describe('w3c-validation-helper', function() {
+  describe('presetRegex', function() {
+    function testing(preset) {
+      return presetRegex.test(preset)
+    }
+
+    test(testing, () => {
+      forCases([
+        given('html,svg 1.1,mathml 3.0'),
+        given('HTML,SVG 1.1,MathML 3.0'),
+        given('HTML, SVG 1.1, MathML 3.0'),
+        given('HTML , SVG 1.1 , MathML 3.0'),
+        given('HTML,SVG 1.1,MathML 3.0,ITS 2.0'),
+        given('HTML, SVG 1.1, MathML 3.0, ITS 2.0'),
+        given('HTML , SVG 1.1 , MathML 3.0 , ITS 2.0'),
+        given('HTML,SVG 1.1,MathML 3.0,RDFa Lite 1.1'),
+        given('HTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1'),
+        given('HTML , SVG 1.1 , MathML 3.0 , RDFa Lite 1.1'),
+        given('HTML 4.01 Strict,URL/XHTML 1.0 Strict,URL'),
+        given('HTML 4.01 Strict, URL/ XHTML 1.0 Strict, URL'),
+        given('HTML 4.01 Strict , URL / XHTML 1.0 Strict , URL'),
+        given('HTML 4.01 Transitional,URL/XHTML 1.0 Transitional,URL'),
+        given('HTML 4.01 Transitional, URL/ XHTML 1.0 Transitional, URL'),
+        given('HTML 4.01 Transitional , URL / XHTML 1.0 Transitional , URL'),
+        given('HTML 4.01 Frameset,URL/XHTML 1.0 Frameset,URL'),
+        given('HTML 4.01 Frameset, URL/ XHTML 1.0 Frameset, URL'),
+        given('HTML 4.01 Frameset , URL / XHTML 1.0 Frameset , URL'),
+        given('XHTML,SVG 1.1,MathML 3.0'),
+        given('XHTML, SVG 1.1, MathML 3.0'),
+        given('XHTML , SVG 1.1 , MathML 3.0'),
+        given('XHTML,SVG 1.1,MathML 3.0,RDFa Lite 1.1'),
+        given('XHTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1'),
+        given('XHTML , SVG 1.1 , MathML 3.0 , RDFa Lite 1.1'),
+        given('XHTML 1.0 Strict,URL,Ruby,SVG 1.1,MathML 3.0'),
+        given('XHTML 1.0 Strict, URL, Ruby, SVG 1.1, MathML 3.0'),
+        given('XHTML 1.0 Strict , URL , Ruby , SVG 1.1 , MathML 3.0'),
+        given('SVG 1.1,URL,XHTML,MathML 3.0'),
+        given('SVG 1.1, URL, XHTML, MathML 3.0'),
+        given('SVG 1.1 , URL , XHTML , MathML 3.0'),
+      ]).expect(true)
+    })
+
+    test(testing, () => {
+      forCases([
+        given(undefined),
+        given(null),
+        given(''),
+        given('   '),
+        given('HTML'),
+      ]).expect(false)
+    })
+  })
+
+  describe('getColor', function() {
+    it('returns "brightgreen" if no messages are provided', function() {
+      const messageTypes = {}
+
+      const actualResult = getColor(messageTypes)
+
+      expect(actualResult).to.equal('brightgreen')
+    })
+
+    it('returns "yellow" if only warning messages are provided', function() {
+      const messageTypes = { warning: 1 }
+
+      const actualResult = getColor(messageTypes)
+
+      expect(actualResult).to.equal('yellow')
+    })
+
+    it('returns "red" if only error messages are provided', function() {
+      const messageTypes = { error: 1 }
+
+      const actualResult = getColor(messageTypes)
+
+      expect(actualResult).to.equal('red')
+    })
+
+    it('returns "red" if both warning and error messages are provided', function() {
+      const messageTypes = { warning: 3, error: 4 }
+
+      const actualResult = getColor(messageTypes)
+
+      expect(actualResult).to.equal('red')
+    })
+  })
+
+  describe('getMessage', function() {
+    it('returns "validate" if no messages are provided', function() {
+      const messageTypes = {}
+
+      const actualResult = getMessage(messageTypes)
+
+      expect(actualResult).to.equal('validated')
+    })
+
+    it('returns "1 error" if 1 error message is provided', function() {
+      const messageTypes = { error: 1 }
+
+      const actualResult = getMessage(messageTypes)
+
+      expect(actualResult).to.equal('1 error')
+    })
+
+    it('returns "2 errors" if 2 error messages are provided', function() {
+      const messageTypes = { error: 2 }
+
+      const actualResult = getMessage(messageTypes)
+
+      expect(actualResult).to.equal('2 errors')
+    })
+
+    it('returns "1 warning" if 1 warning message is provided', function() {
+      const messageTypes = { warning: 1 }
+
+      const actualResult = getMessage(messageTypes)
+
+      expect(actualResult).to.equal('1 warning')
+    })
+
+    it('returns "2 warnings" if 2 warning messages are provided', function() {
+      const messageTypes = { warning: 2 }
+
+      const actualResult = getMessage(messageTypes)
+
+      expect(actualResult).to.equal('2 warnings')
+    })
+
+    it('returns "1 error, 1 warning" if 1 error and 1 warning message is provided', function() {
+      const messageTypes = { warning: 1, error: 1 }
+
+      const actualResult = getMessage(messageTypes)
+
+      expect(actualResult).to.equal('1 error, 1 warning')
+    })
+
+    it('returns "2 errors, 2 warnings" if 2 error and 2 warning message is provided', function() {
+      const messageTypes = { error: 2, warning: 2 }
+
+      const actualResult = getMessage(messageTypes)
+
+      expect(actualResult).to.equal('2 errors, 2 warnings')
+    })
+  })
+
+  describe('getSchema', function() {
+    function execution(preset) {
+      return getSchema(preset)
+    }
+
+    test(execution, () => {
+      forCases([given(undefined), given(null), given('')]).expect(undefined)
+    })
+
+    it('returns 3 schemas associated to the "HTML,SVG 1.1,MathML 3.0" preset', function() {
+      const preset = 'HTML,SVG 1.1,MathML 3.0'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/html5.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "HTML,SVG 1.1,MathML 3.0,ITS 2.0" preset', function() {
+      const preset = 'HTML,SVG 1.1,MathML 3.0,ITS 2.0'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/html5-its.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "HTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1" preset', function() {
+      const preset = 'HTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/html5-rdfalite.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "HTML 4.01 Strict, URL/ XHTML 1.0 Strict, URL" preset', function() {
+      const preset = 'HTML 4.01 Strict, URL/ XHTML 1.0 Strict, URL'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/xhtml10/xhtml-strict.rnc http://c.validator.nu/all-html4/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "HTML 4.01 Transitional, URL/ XHTML 1.0 Transitional, URL" preset', function() {
+      const preset = 'HTML 4.01 Transitional, URL/ XHTML 1.0 Transitional, URL'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/xhtml10/xhtml-transitional.rnc http://c.validator.nu/all-html4/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "HTML 4.01 Frameset, URL/ XHTML 1.0 Frameset, URL" preset', function() {
+      const preset = 'HTML 4.01 Frameset, URL/ XHTML 1.0 Frameset, URL'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/xhtml10/xhtml-frameset.rnc http://c.validator.nu/all-html4/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "XHTML, SVG 1.1, MathML 3.0" preset', function() {
+      const preset = 'XHTML, SVG 1.1, MathML 3.0'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/xhtml5.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "XHTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1" preset', function() {
+      const preset = 'XHTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/xhtml5-rdfalite.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "XHTML 1.0 Strict, URL, Ruby, SVG 1.1, MathML 3.0" preset', function() {
+      const preset = 'XHTML 1.0 Strict, URL, Ruby, SVG 1.1, MathML 3.0'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/xhtml1-ruby-rdf-svg-mathml.rnc http://c.validator.nu/all-html4/'
+      )
+    })
+
+    it('returns 3 schemas associated to the "SVG 1.1, URL, XHTML, MathML 3.0" preset', function() {
+      const preset = 'SVG 1.1, URL, XHTML, MathML 3.0'
+
+      const actualResult = getSchema(preset)
+
+      expect(actualResult).to.equal(
+        'http://s.validator.nu/svg-xhtml5-rdf-mathml.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/'
+      )
+    })
+  })
+})
diff --git a/services/w3c/w3c-validation.service.js b/services/w3c/w3c-validation.service.js
new file mode 100644
index 0000000000000000000000000000000000000000..474f98295628e9f08972fcea6cc53d5fefa73be1
--- /dev/null
+++ b/services/w3c/w3c-validation.service.js
@@ -0,0 +1,136 @@
+'use strict'
+const Joi = require('@hapi/joi')
+const { optionalUrl } = require('../validators')
+const {
+  documentation,
+  presetRegex,
+  getColor,
+  getMessage,
+  getSchema,
+} = require('./w3c-validation-helper')
+const { BaseJsonService, NotFound } = require('..')
+
+const schema = Joi.object({
+  url: Joi.string().optional(),
+  messages: Joi.array()
+    .required()
+    .items(
+      Joi.object({
+        type: Joi.string()
+          .allow('info', 'error', 'non-document-error')
+          .required(),
+        subType: Joi.string().optional(),
+        message: Joi.string().required(),
+      })
+    ),
+}).required()
+
+const queryParamSchema = Joi.object({
+  targetUrl: optionalUrl.required(),
+  preset: Joi.string()
+    .regex(presetRegex)
+    .allow(''),
+}).required()
+
+module.exports = class W3cValidation extends BaseJsonService {
+  static get category() {
+    return 'analysis'
+  }
+
+  static get route() {
+    return {
+      base: 'w3c-validation',
+      pattern: ':parser(default|html|xml|xmldtd)',
+      queryParamSchema,
+    }
+  }
+
+  static get examples() {
+    return [
+      {
+        title: 'W3C Validation',
+        namedParams: { parser: 'html' },
+        queryParams: {
+          targetUrl: 'https://validator.nu/',
+          preset: 'HTML, SVG 1.1, MathML 3.0',
+        },
+        staticPreview: this.render({ messageTypes: {} }),
+        documentation,
+      },
+    ]
+  }
+
+  static get defaultBadgeData() {
+    return {
+      label: 'w3c',
+    }
+  }
+
+  static render({ messageTypes }) {
+    return {
+      message: getMessage(messageTypes),
+      color: getColor(messageTypes),
+    }
+  }
+
+  async fetch(targetUrl, preset, parser) {
+    return this._requestJson({
+      url: 'https://validator.nu/',
+      schema,
+      options: {
+        qs: {
+          schema: getSchema(preset),
+          parser: parser === 'default' ? undefined : parser,
+          doc: encodeURI(targetUrl),
+          out: 'json',
+        },
+      },
+    })
+  }
+
+  transform(url, messages) {
+    if (messages.length === 1) {
+      const { subType, type, message } = messages[0]
+      if (type === 'non-document-error' && subType === 'io') {
+        let notFound = false
+        if (
+          message ===
+          'HTTP resource not retrievable. The HTTP status from the remote server was: 404.'
+        ) {
+          notFound = true
+        } else if (message.endsWith('Name or service not known')) {
+          const domain = message.split(':')[0].trim()
+          notFound = url.indexOf(domain) !== -1
+        }
+
+        if (notFound) {
+          throw new NotFound({ prettyMessage: 'target url not found' })
+        }
+      }
+    }
+
+    return messages.reduce((accumulator, message) => {
+      let { type } = message
+      if (type === 'info') {
+        type = 'warning'
+      } else {
+        // All messages are suppose to have a type and there can only be info, error or non-document
+        // If a new type gets introduce this will flag them as errors
+        type = 'error'
+      }
+
+      if (!(type in accumulator)) {
+        accumulator[type] = 0
+      }
+      accumulator[type] += 1
+      return accumulator
+    }, {})
+  }
+
+  async handle({ parser }, { targetUrl, preset }) {
+    const { url, messages } = await this.fetch(targetUrl, preset, parser)
+    return this.constructor.render({
+      messageTypes: this.transform(url, messages),
+    })
+  }
+}
diff --git a/services/w3c/w3c-validation.tester.js b/services/w3c/w3c-validation.tester.js
new file mode 100644
index 0000000000000000000000000000000000000000..b2eff4457c3b4019c4f522e195948b535c08ab40
--- /dev/null
+++ b/services/w3c/w3c-validation.tester.js
@@ -0,0 +1,100 @@
+'use strict'
+const Joi = require('@hapi/joi')
+const t = (module.exports = require('../tester').createServiceTester())
+
+const isErrorOnly = Joi.string().regex(/^[0-9]+ errors?$/)
+
+const isWarningOnly = Joi.string().regex(/^[0-9]+ warnings?$/)
+
+const isErrorAndWarning = Joi.string().regex(
+  /^[0-9]+ errors?, [0-9]+ warnings?$/
+)
+
+const isW3CMessage = Joi.alternatives().try(
+  'validated',
+  isErrorOnly,
+  isWarningOnly,
+  isErrorAndWarning
+)
+const isW3CColors = Joi.alternatives().try('brightgreen', 'red', 'yellow')
+t.create(
+  'W3C Validation page conforms to standards with no preset and parser with brightgreen badge'
+)
+  .get(
+    '/default.json?targetUrl=https://hsivonen.com/test/moz/messages-types/no-message.html'
+  )
+  .expectBadge({
+    label: 'w3c',
+    message: isW3CMessage,
+    color: isW3CColors,
+  })
+
+t.create(
+  'W3C Validation page conforms to standards with no HTML4 preset and HTML parser with brightgreen badge'
+)
+  .get(
+    '/html.json?targetUrl=https://hsivonen.com/test/moz/messages-types/no-message.html&preset=HTML,%20SVG%201.1,%20MathML%203.0'
+  )
+  .expectBadge({
+    label: 'w3c',
+    message: isW3CMessage,
+    color: isW3CColors,
+  })
+
+t.create('W3C Validation target url not found error')
+  .get(
+    '/default.json?targetUrl=http://hsivonen.com/test/moz/messages-types/404.html'
+  )
+  .expectBadge({
+    label: 'w3c',
+    message: 'target url not found',
+  })
+
+t.create('W3C Validation target url host not found error')
+  .get('/default.json?targetUrl=https://adfasdfasdfasdfadfadfadfasdfadf.com')
+  .expectBadge({
+    label: 'w3c',
+    message: 'target url not found',
+  })
+
+t.create('W3C Validation page has 1 validation error with red badge')
+  .get(
+    '/default.json?targetUrl=http://hsivonen.com/test/moz/messages-types/warning.html'
+  )
+  .expectBadge({
+    label: 'w3c',
+    message: isW3CMessage,
+    color: isW3CColors,
+  })
+
+t.create(
+  'W3C Validation page has 3 validation error using HTML 4.01 Frameset preset with red badge'
+)
+  .get(
+    '/html.json?targetUrl=http://hsivonen.com/test/moz/messages-types/warning.html&preset=HTML 4.01 Frameset, URL / XHTML 1.0 Frameset, URL'
+  )
+  .expectBadge({
+    label: 'w3c',
+    message: isW3CMessage,
+    color: isW3CColors,
+  })
+
+t.create('W3C Validation page has 1 validation warning with yellow badge')
+  .get(
+    '/default.json?targetUrl=http://hsivonen.com/test/moz/messages-types/info.svg'
+  )
+  .expectBadge({
+    label: 'w3c',
+    message: isW3CMessage,
+    color: isW3CColors,
+  })
+
+t.create('W3C Validation page has multiple of validation errors with red badge')
+  .get(
+    '/default.json?targetUrl=http://hsivonen.com/test/moz/messages-types/range-error.html'
+  )
+  .expectBadge({
+    label: 'w3c',
+    message: isW3CMessage,
+    color: isW3CColors,
+  })
diff --git a/services/wordpress/wordpress-downloads.service.js b/services/wordpress/wordpress-downloads.service.js
index 8728caa45f1fdef0f4cd32df5b378e5aa42904bc..f931cf41b09f2e7059663243dd8c99cef21a2e98 100644
--- a/services/wordpress/wordpress-downloads.service.js
+++ b/services/wordpress/wordpress-downloads.service.js
@@ -4,7 +4,7 @@ const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const BaseWordpress = require('./wordpress-base')
-const { BaseJsonService, NotFound } = require('..')
+const { NotFound } = require('..')
 
 const dateSchema = Joi.object()
   .pattern(Joi.date().iso(), Joi.number().integer())
@@ -21,6 +21,29 @@ const extensionData = {
   },
 }
 
+const intervalMap = {
+  dd: {
+    limit: 1,
+    messageSuffix: '/day',
+  },
+  dw: {
+    limit: 7,
+    messageSuffix: '/week',
+  },
+  dm: {
+    limit: 30,
+    messageSuffix: '/month',
+  },
+  dy: {
+    limit: 365,
+    messageSuffix: '/year',
+  },
+  dt: {
+    limit: null,
+    messageSuffix: '',
+  },
+}
+
 function DownloadsForExtensionType(extensionType) {
   const { capt, exampleSlug } = extensionData[extensionType]
 
@@ -35,8 +58,8 @@ function DownloadsForExtensionType(extensionType) {
 
     static get route() {
       return {
-        base: `wordpress/${extensionType}/dt`,
-        pattern: ':slug',
+        base: `wordpress/${extensionType}`,
+        pattern: ':interval(dd|dw|dm|dy|dt)/:slug',
       }
     }
 
@@ -44,8 +67,8 @@ function DownloadsForExtensionType(extensionType) {
       return [
         {
           title: `WordPress ${capt} Downloads`,
-          namedParams: { slug: exampleSlug },
-          staticPreview: this.render({ downloads: 200000 }),
+          namedParams: { interval: 'dm', slug: exampleSlug },
+          staticPreview: this.render({ interval: 'dm', downloads: 200000 }),
         },
       ]
     }
@@ -54,19 +77,50 @@ function DownloadsForExtensionType(extensionType) {
       return { label: 'downloads' }
     }
 
-    static render({ downloads }) {
+    static render({ interval, downloads }) {
+      const { messageSuffix } = intervalMap[interval]
+
       return {
-        message: metric(downloads),
+        message: `${metric(downloads)}${messageSuffix}`,
         color: downloadCount(downloads),
       }
     }
 
-    async handle({ slug }) {
-      const { downloaded: downloads } = await this.fetch({
-        extensionType,
-        slug,
-      })
-      return this.constructor.render({ downloads })
+    async handle({ interval, slug }) {
+      const { limit } = intervalMap[interval]
+      let downloads
+      if (limit === null) {
+        const { downloaded: _downloads } = await this.fetch({
+          extensionType,
+          slug,
+        })
+        downloads = _downloads
+      } else {
+        const ext_type = extensionType === 'plugin' ? 'plugin' : 'themes'
+        const json = await this._requestJson({
+          schema: dateSchema,
+          url: `https://api.wordpress.org/stats/${ext_type}/1.0/downloads.php`,
+          options: {
+            qs: {
+              slug,
+              limit,
+            },
+          },
+        })
+        const size = Object.keys(json).length
+        downloads = Object.values(json).reduce(
+          (a, b) => parseInt(a) + parseInt(b)
+        )
+        // This check is for non-existent and brand-new plugins both having new stats.
+        // Non-Existent plugins results are the same as a brandspanking new plugin with no downloads.
+        if (downloads <= 0 && size <= 1) {
+          throw new NotFound({
+            prettyMessage: `${extensionType} not found or too new`,
+          })
+        }
+      }
+
+      return this.constructor.render({ interval, downloads })
     }
   }
 }
@@ -121,100 +175,7 @@ function InstallsForExtensionType(extensionType) {
   }
 }
 
-function DownloadsForInterval(interval) {
-  const { base, messageSuffix = '', query, name } = {
-    day: {
-      base: 'wordpress/plugin/dd',
-      messageSuffix: '/day',
-      query: 1,
-      name: 'WordpressDownloadsDay',
-    },
-    week: {
-      base: 'wordpress/plugin/dw',
-      messageSuffix: '/week',
-      query: 7,
-      name: 'WordpressDownloadsWeek',
-    },
-    month: {
-      base: 'wordpress/plugin/dm',
-      messageSuffix: '/month',
-      query: 30,
-      name: 'WordpressDownloadsMonth',
-    },
-    year: {
-      base: 'wordpress/plugin/dy',
-      messageSuffix: '/year',
-      query: 365,
-      name: 'WordpressDownloadsYear',
-    },
-  }[interval]
-
-  return class WordpressDownloads extends BaseJsonService {
-    static get name() {
-      return name
-    }
-
-    static get category() {
-      return 'downloads'
-    }
-
-    static get route() {
-      return {
-        base,
-        pattern: ':slug',
-      }
-    }
-
-    static get examples() {
-      return [
-        {
-          title: 'WordPress Plugin Downloads',
-          namedParams: { slug: 'bbpress' },
-          staticPreview: this.render({ downloads: 30000 }),
-        },
-      ]
-    }
-
-    static get defaultBadgeData() {
-      return { label: 'downloads' }
-    }
-
-    static render({ downloads }) {
-      return {
-        message: `${metric(downloads)}${messageSuffix}`,
-        color: downloadCount(downloads),
-      }
-    }
-
-    async handle({ slug }) {
-      const json = await this._requestJson({
-        schema: dateSchema,
-        url: `https://api.wordpress.org/stats/plugin/1.0/downloads.php`,
-        options: {
-          qs: {
-            slug,
-            limit: query,
-          },
-        },
-      })
-      const size = Object.keys(json).length
-      const downloads = Object.values(json).reduce(
-        (a, b) => parseInt(a) + parseInt(b)
-      )
-      // This check is for non-existent and brand-new plugins both having new stats.
-      // Non-Existent plugins results are the same as a brandspanking new plugin with no downloads.
-      if (downloads <= 0 && size <= 1) {
-        throw new NotFound({ prettyMessage: 'plugin not found or too new' })
-      }
-      return this.constructor.render({ downloads })
-    }
-  }
-}
-
-const intervalServices = ['day', 'week', 'month', 'year'].map(
-  DownloadsForInterval
-)
 const downloadServices = ['plugin', 'theme'].map(DownloadsForExtensionType)
 const installServices = ['plugin', 'theme'].map(InstallsForExtensionType)
-const modules = [...intervalServices, ...downloadServices, ...installServices]
+const modules = [...downloadServices, ...installServices]
 module.exports = modules
diff --git a/services/wordpress/wordpress-downloads.tester.js b/services/wordpress/wordpress-downloads.tester.js
index 1bdc79b20bb2b0a4048b80f80469f2e1e6377283..a455dbc8aea751c6f31a3242688f1929eabd9192 100644
--- a/services/wordpress/wordpress-downloads.tester.js
+++ b/services/wordpress/wordpress-downloads.tester.js
@@ -15,6 +15,7 @@ t.create('Plugin Downloads - Total')
     label: 'downloads',
     message: isMetric,
   })
+
 t.create('Plugin Downloads - Active')
   .get('/plugin/installs/akismet.json')
   .expectBadge({
@@ -43,12 +44,20 @@ t.create('Plugin Downloads - Month')
     message: isMetricOverTimePeriod,
   })
 
+t.create('Plugin Downloads - Year')
+  .get('/plugin/dy/akismet.json')
+  .expectBadge({
+    label: 'downloads',
+    message: isMetricOverTimePeriod,
+  })
+
 t.create('Theme Downloads - Total')
   .get('/theme/dt/twentyseventeen.json')
   .expectBadge({
     label: 'downloads',
     message: isMetric,
   })
+
 t.create('Theme Downloads - Active')
   .get('/theme/installs/twentyseventeen.json')
   .expectBadge({
@@ -56,12 +65,41 @@ t.create('Theme Downloads - Active')
     message: isMetric,
   })
 
+t.create('Theme Downloads - Day')
+  .get('/theme/dd/twentyseventeen.json')
+  .expectBadge({
+    label: 'downloads',
+    message: isMetricOverTimePeriod,
+  })
+
+t.create('Theme Downloads - Week')
+  .get('/theme/dw/twentyseventeen.json')
+  .expectBadge({
+    label: 'downloads',
+    message: isMetricOverTimePeriod,
+  })
+
+t.create('Theme Downloads - Month')
+  .get('/theme/dm/twentyseventeen.json')
+  .expectBadge({
+    label: 'downloads',
+    message: isMetricOverTimePeriod,
+  })
+
+t.create('Theme Downloads - Year')
+  .get('/theme/dy/twentyseventeen.json')
+  .expectBadge({
+    label: 'downloads',
+    message: isMetricOverTimePeriod,
+  })
+
 t.create('Plugin Downloads - Total | Not Found')
   .get('/plugin/dt/100.json')
   .expectBadge({
     label: 'downloads',
     message: 'not found',
   })
+
 t.create('Plugin Downloads - Active | Not Found')
   .get('/plugin/installs/100.json')
   .expectBadge({
@@ -90,15 +128,51 @@ t.create('Plugin Downloads - Month | Not Found')
     message: 'plugin not found or too new',
   })
 
+t.create('Plugin Downloads - Year | Not Found')
+  .get('/plugin/dy/100.json')
+  .expectBadge({
+    label: 'downloads',
+    message: 'plugin not found or too new',
+  })
+
 t.create('Theme Downloads - Total | Not Found')
   .get('/theme/dt/100.json')
   .expectBadge({
     label: 'downloads',
     message: 'not found',
   })
+
 t.create('Theme Downloads - Active | Not Found')
   .get('/theme/installs/100.json')
   .expectBadge({
     label: 'active installs',
     message: 'not found',
   })
+
+t.create('Theme Downloads - Day | Not Found')
+  .get('/theme/dd/100.json')
+  .expectBadge({
+    label: 'downloads',
+    message: 'theme not found or too new',
+  })
+
+t.create('Theme Downloads - Week | Not Found')
+  .get('/theme/dw/100.json')
+  .expectBadge({
+    label: 'downloads',
+    message: 'theme not found or too new',
+  })
+
+t.create('Theme Downloads - Month | Not Found')
+  .get('/theme/dm/100.json')
+  .expectBadge({
+    label: 'downloads',
+    message: 'theme not found or too new',
+  })
+
+t.create('Theme Downloads - Year | Not Found')
+  .get('/theme/dy/100.json')
+  .expectBadge({
+    label: 'downloads',
+    message: 'theme not found or too new',
+  })