diff --git a/README.md b/README.md
index 124612b35438ad6c63fe9ba13df922244afcc819..7388bf49df8676f014b9d8a99edd95745faada02 100644
--- a/README.md
+++ b/README.md
@@ -84,7 +84,6 @@ When adding or changing a service [please add tests][service-tests].
 This project has quite a backlog of suggestions! If you're new to the project,
 maybe you'd like to open a pull request to address one of them:
 
-[![Hacktoberfest](https://img.shields.io/github/hacktoberfest/2019/badges/shields)](https://github.com/badges/shields/issues?q=is%3Aopen+is%3Aissue+label%3Ahacktoberfest)
 [![GitHub issues by-label](https://img.shields.io/github/issues/badges/shields/good%20first%20issue)](https://github.com/badges/shields/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
 
 You can read a [tutorial on how to add a badge][tutorial].
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 c1619983bf6d8a7fd85fd533271a2bf1f22b176c..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')
+        }
+      })
     })
   })
 
diff --git a/core/server/server.js b/core/server/server.js
index d957f97e0455c9302959141b9b3c5b82c1a07733..aefe9f9ce1195e41c07a94e0d0a336965daa6a37 100644
--- a/core/server/server.js
+++ b/core/server/server.js
@@ -323,12 +323,6 @@ class Server {
     const { apiProvider: githubApiProvider } = this.githubConstellation
     suggest.setRoutes(allowedOrigin, githubApiProvider, camp)
 
-    // https://github.com/badges/shields/issues/3273
-    camp.handle((req, res, next) => {
-      res.setHeader('Access-Control-Allow-Origin', '*')
-      next()
-    })
-
     this.registerErrorHandlers()
     this.registerRedirects()
     this.registerServices()
diff --git a/core/server/server.spec.js b/core/server/server.spec.js
index 929f3bc6f7114922e165233f2f67da47a227a0ac..53acc855bc9e6c49363e67f9352aa92be0a54051 100644
--- a/core/server/server.spec.js
+++ b/core/server/server.spec.js
@@ -151,10 +151,4 @@ describe('The server', function() {
       .and.to.include('410')
       .and.to.include('jpg no longer available')
   })
-
-  it('should return cors header for the request', async function() {
-    const { statusCode, headers } = await got(`${baseUrl}npm/v/express.svg`)
-    expect(statusCode).to.equal(200)
-    expect(headers['access-control-allow-origin']).to.equal('*')
-  })
 })
diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md
index ac5679237864157673946bd6b576ec00a816d338..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)
 
@@ -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/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/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/package-lock.json b/package-lock.json
index af9bee02160ac48d41c4c2bc1a771437a74d07db..41e1592ba8a82eed1288366bd4d0a353c2888551 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,19 +14,19 @@
       }
     },
     "@babel/core": {
-      "version": "7.6.4",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz",
-      "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==",
+      "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.4",
-        "@babel/helpers": "^7.6.2",
-        "@babel/parser": "^7.6.4",
-        "@babel/template": "^7.6.0",
-        "@babel/traverse": "^7.6.3",
-        "@babel/types": "^7.6.3",
-        "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.4",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz",
-          "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==",
+          "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.3",
+            "@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.4",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz",
-          "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==",
+          "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.3",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz",
-          "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==",
+          "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.3",
-            "@babel/helper-function-name": "^7.1.0",
-            "@babel/helper-split-export-declaration": "^7.4.4",
-            "@babel/parser": "^7.6.3",
-            "@babel/types": "^7.6.3",
+            "@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.3",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
-          "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
+          "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",
@@ -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,16 +783,139 @@
       }
     },
     "@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==",
+      "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-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-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/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-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.7.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.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": {
@@ -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.4",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz",
-          "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==",
+          "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.3",
+            "@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.4",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz",
-          "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==",
+          "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.3",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz",
-          "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==",
+          "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.3",
-            "@babel/helper-function-name": "^7.1.0",
-            "@babel/helper-split-export-declaration": "^7.4.4",
-            "@babel/parser": "^7.6.3",
-            "@babel/types": "^7.6.3",
+            "@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.3",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
-          "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
+          "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": {
@@ -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": {
@@ -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"
+      },
+      "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.6.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz",
-      "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==",
+      "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": {
-        "regexpu-core": "^4.6.0"
+        "@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"
@@ -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.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz",
-      "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==",
+      "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.3",
-        "@babel/plugin-transform-classes": "^7.5.5",
+        "@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.3",
+        "@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.3",
+        "@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,20 +2152,217 @@
         "semver": "^5.5.0"
       },
       "dependencies": {
-        "@babel/plugin-transform-block-scoping": {
-          "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==",
+        "@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-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.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/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.3",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
-          "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
+          "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",
@@ -1531,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",
@@ -1574,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": {
@@ -2048,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"
       },
@@ -2075,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",
@@ -2107,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",
@@ -2136,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",
@@ -2200,46 +3127,46 @@
       }
     },
     "@sentry/core": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.7.0.tgz",
-      "integrity": "sha512-gQel0d7LBSWJGHc7gfZllYAu+RRGD9GcYGmkRfemurmDyDGQDf/sfjiBi8f9QxUc2iFTHnvIR5nMTyf0U3yl3Q==",
-      "requires": {
-        "@sentry/hub": "5.7.0",
-        "@sentry/minimal": "5.7.0",
-        "@sentry/types": "5.7.0",
-        "@sentry/utils": "5.7.0",
+      "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.7.0",
-      "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.7.0.tgz",
-      "integrity": "sha512-qNdYheJ6j4P9Sk0eqIINpJohImmu/+trCwFb4F8BGLQth5iGMVQD6D0YUrgjf4ZaQwfhw9tv4W6VEfF5tyASoA==",
+      "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.7.0",
-        "@sentry/utils": "5.7.0",
+        "@sentry/types": "5.7.1",
+        "@sentry/utils": "5.7.1",
         "tslib": "^1.9.3"
       }
     },
     "@sentry/minimal": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.7.0.tgz",
-      "integrity": "sha512-0sizE2prS9nmfLyVUKmVzFFFqRNr9iorSCCejwnlRe3crqKqjf84tuRSzm6NkZjIyYj9djuuo9l9XN12NLQ/4A==",
+      "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.7.0",
-        "@sentry/types": "5.7.0",
+        "@sentry/hub": "5.7.1",
+        "@sentry/types": "5.7.1",
         "tslib": "^1.9.3"
       }
     },
     "@sentry/node": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.7.0.tgz",
-      "integrity": "sha512-iqQbGAJDBlpQkp1rl9RkDCIfnukr4cOtHPgJPmLY19m/KXIHD2cdKhvbqoCvIPBTIAeSGQIvDT9jD5zT46eoqQ==",
-      "requires": {
-        "@sentry/core": "5.7.0",
-        "@sentry/hub": "5.7.0",
-        "@sentry/types": "5.7.0",
-        "@sentry/utils": "5.7.0",
+      "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",
@@ -2271,16 +3198,16 @@
       }
     },
     "@sentry/types": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.7.0.tgz",
-      "integrity": "sha512-bFRVortg713dE2yJXNFgNe6sNBVVSkpoELLkGPatdVQi0dYc6OggIIX4UZZvkynFx72GwYqO1NOrtUcJY2gmMg=="
+      "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.7.0",
-      "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.7.0.tgz",
-      "integrity": "sha512-XmwQpLqea9mj8x1N7P/l4JvnEb0Rn5Py5OtBgl0ctk090W+GB1uM8rl9mkMf6698o1s1Z8T/tI/QY0yFA5uZXg==",
+      "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.7.0",
+        "@sentry/types": "5.7.1",
         "tslib": "^1.9.3"
       }
     },
@@ -2344,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": {
@@ -2489,9 +3416,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "12.7.11",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.11.tgz",
-      "integrity": "sha512-Otxmr2rrZLKRYIybtdG/sgeO+tHY20GxeDjcGmUnmmlCWyEnv2a2x1ZXBo3BTec4OiTXMQCiazB8NMBf0iRlFw==",
+      "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": {
@@ -2527,36 +3454,36 @@
       }
     },
     "@types/react-dom": {
-      "version": "16.9.1",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.1.tgz",
-      "integrity": "sha512-1S/akvkKr63qIUWVu5IKYou2P9fHLb/P2VAwyxVV85JGaGZTcUniMiTuIqM3lXFB25ej6h+CYEQ27ERVwi6eGA==",
+      "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.11",
-      "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-5.0.11.tgz",
-      "integrity": "sha512-id9DjHp/+Cm+x3etN+EWs5OP76PPpz8jXw+iN9xcXltssF0KHNjAzlan///ASXegEewaItlw5FhFnoLxRUJQ9g==",
+      "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.5",
-      "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-3.0.5.tgz",
-      "integrity": "sha512-BodHwzj9WU1EWC1j8zx1iyAMDCrTURwdvMpOVvVFwDVU7fvs8Ks9fPTkUY3+BgYbpOJFr21bR3Jib/GonwanAQ==",
+      "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": "*",
@@ -2573,6 +3500,12 @@
         "@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",
@@ -2979,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",
@@ -2993,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",
@@ -3005,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
         }
       }
@@ -3282,25 +4248,97 @@
       "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
       "dev": true
     },
-    "array.prototype.find": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz",
-      "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==",
+    "array.prototype.find": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz",
+      "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.13.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"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "array.prototype.flat": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz",
+      "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==",
       "dev": true,
       "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.13.0"
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.10.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.13.0",
           "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
@@ -3358,29 +4396,42 @@
         }
       }
     },
-    "array.prototype.flat": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz",
-      "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==",
+    "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.2",
-        "es-abstract": "^1.10.0",
+        "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.13.0",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
-          "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
+          "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-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": {
@@ -3570,37 +4621,52 @@
       }
     },
     "autoprefixer": {
-      "version": "9.6.4",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.4.tgz",
-      "integrity": "sha512-Koz2cJU9dKOxG8P1f8uVaBntOv9lP4yz9ffWvWaicv9gHBPhpQB22nGijwd8gqW9CNT+UdkbQOQNLVI8jN1ZfQ==",
+      "version": "9.7.1",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz",
+      "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.7.0",
-        "caniuse-lite": "^1.0.30000998",
+        "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.18",
+        "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.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.30000999",
-          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz",
-          "integrity": "sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg==",
+          "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-value-parser": {
           "version": "4.0.2",
           "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz",
@@ -4003,9 +5069,9 @@
       }
     },
     "babel-plugin-remove-graphql-queries": {
-      "version": "2.7.11",
-      "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.11.tgz",
-      "integrity": "sha512-w3PNFlgtn2HIiEb4/67Q1WkRUCPm9o0czT6Ow98E92PtOfeervUgF8z+As66iWXj8snhQCA5nckGzcJ1NEOCsw==",
+      "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": {
@@ -4080,9 +5146,9 @@
       }
     },
     "babel-preset-gatsby": {
-      "version": "0.2.18",
-      "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.2.18.tgz",
-      "integrity": "sha512-shJDlx0Fgof1mb8jHM1EOgAcf/k7utMBiQYp+6me8L5J6DNLjJqfNUoHroqwSZjGLvr7cF0siKF9pxVrQ5J2uA==",
+      "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",
@@ -4279,9 +5345,9 @@
       "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
     },
     "bluebird": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz",
-      "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==",
+      "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": {
@@ -4522,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"
@@ -4648,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": {
@@ -4711,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",
@@ -5107,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"
           }
         }
       }
@@ -5307,19 +6396,19 @@
       }
     },
     "chokidar": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.1.tgz",
-      "integrity": "sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w==",
+      "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.1.1",
         "braces": "~3.0.2",
-        "fsevents": "~2.1.0",
+        "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.1.3"
+        "readdirp": "~3.2.0"
       },
       "dependencies": {
         "anymatch": {
@@ -5357,9 +6446,9 @@
           }
         },
         "fsevents": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.0.tgz",
-          "integrity": "sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ==",
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.1.tgz",
+          "integrity": "sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==",
           "dev": true,
           "optional": true
         },
@@ -5403,9 +6492,9 @@
           "dev": true
         },
         "readdirp": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.3.tgz",
-          "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==",
+          "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"
@@ -5870,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": {
@@ -5997,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",
@@ -6027,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": {
@@ -6169,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",
@@ -6226,9 +7306,9 @@
       }
     },
     "config": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/config/-/config-3.2.3.tgz",
-      "integrity": "sha512-pditxQzO+SkKX/2gs99YnUGEjmBVkTj2o/hGOgC0oYEU7QgLnVVDYmcSL6HiGels/8QtFJpFzi5iKYv4D0dalg==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/config/-/config-3.2.4.tgz",
+      "integrity": "sha512-H1XIGfnU1EAkfjSLn9ZvYDRx9lOezDViuzLDgiJ/lMeqjYe3q6iQfpcLt2NInckJgpAeekbNhQkmnnbdEDs9rw==",
       "requires": {
         "json5": "^1.0.1"
       }
@@ -6260,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",
@@ -6390,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
         }
       }
     },
@@ -6984,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",
@@ -7017,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"
       },
@@ -7298,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",
@@ -7351,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"
@@ -7399,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",
@@ -7746,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": {
@@ -7957,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",
@@ -8176,9 +9238,9 @@
           "dev": true
         },
         "ws": {
-          "version": "7.1.2",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz",
-          "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==",
+          "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"
@@ -8448,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"
       },
@@ -8473,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": {
@@ -8540,38 +9607,151 @@
           }
         },
         "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.15.0",
+        "function.prototype.name": "^1.1.1",
+        "object.assign": "^4.1.0",
+        "object.fromentries": "^2.0.1",
+        "prop-types": "^15.7.2",
+        "semver": "^5.7.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"
+          }
+        },
+        "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": {
-        "airbnb-prop-types": "^2.13.2",
-        "function.prototype.name": "^1.1.0",
-        "object.assign": "^4.1.0",
-        "object.fromentries": "^2.0.0",
-        "prop-types": "^15.7.2",
-        "semver": "^5.6.0"
+        "has": "^1.0.3",
+        "object-is": "^1.0.1"
       },
       "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
+        "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"
+          }
         }
       }
     },
@@ -8837,21 +10017,21 @@
       }
     },
     "eslint-config-prettier": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.4.0.tgz",
-      "integrity": "sha512-YrKucoFdc7SEko5Sxe4r6ixqXPDP1tunGw91POeZTTRKItf/AMFYt/YLEQtZMkR2LVpAVhcAcZgcWpm1oGPW7w==",
+      "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": {
@@ -8928,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": {
@@ -9100,14 +10280,14 @@
       }
     },
     "eslint-plugin-jsdoc": {
-      "version": "15.9.9",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-15.9.9.tgz",
-      "integrity": "sha512-gN1Dp9xaZSNAyxyahUpsnK8hubE5rYSxPSSN3wG8ZuzfMnIhp5Qm54GTdhXrK2/SjS4rNJ+C6EZFmOPSfyRcTA==",
+      "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.1.0",
+        "jsdoctypeparser": "^5.1.1",
         "lodash": "^4.17.15",
         "object.entries-ponyfill": "^1.0.1",
         "regextras": "^0.6.1"
@@ -9159,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"
@@ -9340,9 +10520,9 @@
       }
     },
     "eslint-plugin-react-hooks": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.1.2.tgz",
-      "integrity": "sha512-ZR+AyesAUGxJAyTFlF3MbzeVHAcQTFQt1fFVe5o0dzY/HFoj1dgQDMoIkiM+ltN/HhlHBYX4JpJwYonjxsyQMA==",
+      "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": {
@@ -9358,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",
@@ -10003,9 +11183,9 @@
       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
     },
     "fast-xml-parser": {
-      "version": "3.13.0",
-      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.13.0.tgz",
-      "integrity": "sha512-XYXC39VjE9dH6jpp5Gm5gsuR8Z4bMz44qMpT1PmqR+iyOJMhC0LcsN81asYkHP4OkEX8TTR8d6V/caCmy8Q8jQ=="
+      "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",
@@ -11162,15 +12342,21 @@
       "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.36",
-      "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.15.36.tgz",
-      "integrity": "sha512-2e2QggkfWYqUbvZ4Y40biPZeVEuboEJG/l/o1vyK49C346oAAMaWUSMu+RaRPy6ocd7wnbyOH/EKoIIYAWoOhQ==",
+      "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.3",
-        "@babel/parser": "^7.6.3",
+        "@babel/core": "^7.6.4",
+        "@babel/parser": "^7.6.4",
         "@babel/polyfill": "^7.6.0",
         "@babel/runtime": "^7.6.3",
         "@babel/traverse": "^7.6.3",
@@ -11179,40 +12365,41 @@
         "@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.4",
+        "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.11",
-        "babel-preset-gatsby": "^0.2.18",
+        "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.7.0",
+        "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.2.1",
+        "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.1.0",
@@ -11228,17 +12415,17 @@
         "flat": "^4.1.0",
         "fs-exists-cached": "1.0.0",
         "fs-extra": "^8.1.0",
-        "gatsby-cli": "^2.7.58",
-        "gatsby-core-utils": "^1.0.13",
-        "gatsby-graphiql-explorer": "^0.2.23",
-        "gatsby-link": "^2.2.20",
-        "gatsby-plugin-page-creator": "^2.1.25",
-        "gatsby-react-router-scroll": "^2.1.12",
-        "gatsby-telemetry": "^1.1.30",
-        "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.8",
-        "graphql-compose": "^6.3.5",
+        "graphql-compose": "^6.3.7",
         "graphql-playground-middleware-express": "^1.7.12",
         "invariant": "^2.2.4",
         "is-relative": "^1.0.0",
@@ -11248,13 +12435,13 @@
         "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",
@@ -11291,9 +12478,9 @@
         "util.promisify": "^1.0.0",
         "uuid": "^3.3.3",
         "v8-compile-cache": "^1.1.2",
-        "webpack": "~4.41.0",
+        "webpack": "~4.41.2",
         "webpack-dev-middleware": "^3.7.2",
-        "webpack-dev-server": "^3.8.2",
+        "webpack-dev-server": "^3.9.0",
         "webpack-hot-middleware": "^2.25.0",
         "webpack-merge": "^4.2.2",
         "webpack-stats-plugin": "^0.3.0",
@@ -11311,53 +12498,84 @@
           }
         },
         "@babel/generator": {
-          "version": "7.6.4",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz",
-          "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==",
+          "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.3",
+            "@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.4",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz",
-          "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==",
+          "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.6.3",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
-          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+          "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.3",
-          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz",
-          "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==",
+          "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.3",
-            "@babel/helper-function-name": "^7.1.0",
-            "@babel/helper-split-export-declaration": "^7.4.4",
-            "@babel/parser": "^7.6.3",
-            "@babel/types": "^7.6.3",
+            "@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"
@@ -11375,9 +12593,9 @@
           }
         },
         "@babel/types": {
-          "version": "7.6.3",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
-          "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
+          "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",
@@ -11403,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",
@@ -11438,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",
@@ -11459,20 +12768,22 @@
           }
         },
         "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": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
-          "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
           "dev": true,
           "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
           }
         },
         "crypto-random-string": {
@@ -11496,36 +12807,197 @@
           "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"
           }
         },
+        "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.1.0",
           "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
           "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
           "dev": true,
           "requires": {
-            "cross-spawn": "^7.0.0",
-            "get-stream": "^5.0.0",
-            "is-stream": "^2.0.0",
-            "merge-stream": "^2.0.0",
-            "npm-run-path": "^3.0.0",
-            "onetime": "^5.1.0",
-            "p-finally": "^2.0.0",
-            "signal-exit": "^3.0.2",
-            "strip-final-newline": "^2.0.0"
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^3.0.0",
+            "onetime": "^5.1.0",
+            "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": {
@@ -11549,28 +13021,28 @@
           }
         },
         "gatsby-cli": {
-          "version": "2.7.58",
-          "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.7.58.tgz",
-          "integrity": "sha512-f4Nu3DwRux4jXI/ZhI5HhhXmlqgI9Sq3u6CSCySPIYSeAO6NqZy60rPUqDSiya6LWwGsWuKd05N4J6CFwUNwYQ==",
+          "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.3",
             "@hapi/joi": "^15.1.1",
             "better-opn": "^0.1.4",
-            "bluebird": "^3.7.0",
+            "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.1.0",
             "fs-exists-cached": "^1.0.0",
             "fs-extra": "^8.1.0",
-            "gatsby-telemetry": "^1.1.30",
+            "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",
@@ -11583,9 +13055,11 @@
             "pretty-error": "^2.1.1",
             "progress": "^2.0.3",
             "prompts": "^2.2.1",
-            "react": "^16.10.2",
+            "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",
@@ -11618,37 +13092,6 @@
             }
           }
         },
-        "gatsby-page-utils": {
-          "version": "0.0.25",
-          "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.0.25.tgz",
-          "integrity": "sha512-SJSBNg+wHi7xSYdE8Dme6faM26S7M6cO7pCVtxPSuEZvoXy1DTHRcfOAJzCdL9N2r+yYd/bMoqMX3llJjl1OoA==",
-          "dev": true,
-          "requires": {
-            "@babel/runtime": "^7.6.3",
-            "bluebird": "^3.7.0",
-            "chokidar": "3.2.1",
-            "fs-exists-cached": "^1.0.0",
-            "glob": "^7.1.4",
-            "lodash": "^4.17.15",
-            "micromatch": "^3.1.10",
-            "slash": "^3.0.0"
-          }
-        },
-        "gatsby-plugin-page-creator": {
-          "version": "2.1.25",
-          "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.1.25.tgz",
-          "integrity": "sha512-YfxA1rTjZKXry8NGqxrHXnJJj/zgRnckUeLA0sG7EWDse+n+WktKPRAaQF/A25q4uI9O9/wyYj9UM7UG0XrG3g==",
-          "dev": true,
-          "requires": {
-            "@babel/runtime": "^7.6.3",
-            "bluebird": "^3.7.0",
-            "fs-exists-cached": "^1.0.0",
-            "gatsby-page-utils": "^0.0.25",
-            "glob": "^7.1.4",
-            "lodash": "^4.17.15",
-            "micromatch": "^3.1.10"
-          }
-        },
         "get-stream": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
@@ -11658,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",
@@ -11692,9 +13144,9 @@
           }
         },
         "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": {
@@ -11712,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",
@@ -11727,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",
@@ -11828,6 +13326,12 @@
           "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
           "dev": true
         },
+        "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": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
@@ -11846,6 +13350,14 @@
           "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": {
@@ -11868,19 +13380,6 @@
             "mem": "^4.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==",
-              "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"
-              }
-            },
             "execa": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
@@ -11925,36 +13424,6 @@
               "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
               "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
               "dev": true
-            },
-            "path-key": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-              "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-              "dev": true
-            },
-            "shebang-command": {
-              "version": "1.2.0",
-              "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-              "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-              "dev": true,
-              "requires": {
-                "shebang-regex": "^1.0.0"
-              }
-            },
-            "shebang-regex": {
-              "version": "1.0.0",
-              "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-              "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-              "dev": true
-            },
-            "which": {
-              "version": "1.3.1",
-              "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-              "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-              "dev": true,
-              "requires": {
-                "isexe": "^2.0.0"
-              }
             }
           }
         },
@@ -11988,12 +13457,6 @@
             "p-limit": "^2.0.0"
           }
         },
-        "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
-        },
         "pify": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
@@ -12023,21 +13486,22 @@
           "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-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",
@@ -12050,6 +13514,17 @@
           "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",
@@ -12059,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",
@@ -12068,19 +13564,10 @@
             "crypto-random-string": "^2.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"
-          }
-        },
         "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",
@@ -12119,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": {
@@ -12134,24 +13654,35 @@
       }
     },
     "gatsby-core-utils": {
-      "version": "1.0.13",
-      "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.0.13.tgz",
-      "integrity": "sha512-vRbsebZxQASxUNfWqoSP3i8r87ibgpksKCqdCkoQBXJwjVKd8VM2dfScheaHE2OuxFZa2AEA0uyCGSiaF6yzUA==",
-      "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.23",
-      "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.2.23.tgz",
-      "integrity": "sha512-aX5dIQxmGGeUfvQx+sLvogq2I7+C/s1AZmgRgkeu+1XLC47g+SsulD92hyVI91Z7xLHTE0YX2OCGZfO7w/lm2A==",
+      "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.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==",
+          "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"
@@ -12166,9 +13697,9 @@
       }
     },
     "gatsby-link": {
-      "version": "2.2.20",
-      "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.2.20.tgz",
-      "integrity": "sha512-giAmg+s6s8IZ14U+fSdWFEQ85hvGxL2Ar9kl5h6+lRctu0D0h7VFGJddSdteIcLUspuZNdSk1VT9atTSO2bxQw==",
+      "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.3",
@@ -12177,9 +13708,9 @@
       },
       "dependencies": {
         "@babel/runtime": {
-          "version": "7.6.3",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
-          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+          "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"
@@ -12194,36 +13725,30 @@
       }
     },
     "gatsby-page-utils": {
-      "version": "0.0.24",
-      "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.0.24.tgz",
-      "integrity": "sha512-dZk5JFOUL2OVMsZaAU7++39P3aCSWxWBEaUdD6dIFreiBkqojJDoAd+cmkdBf4TupgcaVY32v7oouHkBiwA8xQ==",
+      "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.7.0",
-        "chokidar": "3.2.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"
           }
         },
-        "bluebird": {
-          "version": "3.7.0",
-          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz",
-          "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==",
-          "dev": true
-        },
         "regenerator-runtime": {
           "version": "0.13.3",
           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
@@ -12233,19 +13758,19 @@
       }
     },
     "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"
@@ -12266,35 +13791,29 @@
       }
     },
     "gatsby-plugin-page-creator": {
-      "version": "2.1.24",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.1.24.tgz",
-      "integrity": "sha512-Vx4kVeiracaduxd3IOX9jJasloKqh3/WRHilVqrZauEbv5TALCTG/SKV6fSZt9hdlVYWP1D/eEnZpzzUOeWOwg==",
+      "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.7.0",
+        "@babel/runtime": "^7.6.3",
+        "bluebird": "^3.7.1",
         "fs-exists-cached": "^1.0.0",
-        "gatsby-page-utils": "^0.0.24",
-        "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"
           }
         },
-        "bluebird": {
-          "version": "3.7.0",
-          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz",
-          "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==",
-          "dev": true
-        },
         "regenerator-runtime": {
           "version": "0.13.3",
           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
@@ -12304,9 +13823,9 @@
       }
     },
     "gatsby-plugin-react-helmet": {
-      "version": "3.1.11",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.1.11.tgz",
-      "integrity": "sha512-obVj6fzH0Hr6UdmQGaIYz29a1+h89pI+vKgIb2MwXCCDESCYgVYTcDmtBzYTZVLXupW6fqGlybFQwUKxEI0ZAQ==",
+      "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.3"
@@ -12330,9 +13849,9 @@
       }
     },
     "gatsby-plugin-remove-trailing-slashes": {
-      "version": "2.1.10",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-remove-trailing-slashes/-/gatsby-plugin-remove-trailing-slashes-2.1.10.tgz",
-      "integrity": "sha512-bIMvR8M7/1xo+/Js/b22op/cGu7GDgYz8nnfK9kXI+pt5Iu4fCY1aY4vH8wbBEW1TP71tm1/WN20QauY93pzlQ==",
+      "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.3"
@@ -12356,18 +13875,18 @@
       }
     },
     "gatsby-plugin-styled-components": {
-      "version": "3.1.8",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-3.1.8.tgz",
-      "integrity": "sha512-TtCGZWO1+XeiwHuZx8hCEYZUOwdoh4wdQAH4/UYJuf0ZrpufdcOCfyZr0fHwQuvYm/G8EKD50u6WS2sm5s3/5w==",
+      "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.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"
@@ -12382,29 +13901,29 @@
       }
     },
     "gatsby-plugin-typescript": {
-      "version": "2.1.11",
-      "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.1.11.tgz",
-      "integrity": "sha512-IcUblbq1TF1V5w7AbR0ygVbjotQFh+Z+B+SI5J73OtNFKgehS3cPLEE/6+PMDTmBRYdEJx+ajAMOuIIPn5Jn4w==",
+      "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.2",
-        "babel-plugin-remove-graphql-queries": "^2.7.10"
+        "@babel/runtime": "^7.6.3",
+        "babel-plugin-remove-graphql-queries": "^2.7.14"
       },
       "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"
           }
         },
         "babel-plugin-remove-graphql-queries": {
-          "version": "2.7.10",
-          "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.10.tgz",
-          "integrity": "sha512-J/4xsXYXlWwSuA/hktGx9xtWb+oKMhocwl3ztb17XB6S+x9XEIGKQnOj9nGh/Tr4x04unM/wa12UszzMXbwR+w==",
+          "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": {
@@ -12416,9 +13935,9 @@
       }
     },
     "gatsby-react-router-scroll": {
-      "version": "2.1.12",
-      "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.1.12.tgz",
-      "integrity": "sha512-2uB7PrSiPUbHj9hcv3XHlNyG4s/wm+lHiqHbTHGsU0LwbeQjRQ7hW0sCHGKq2tSvrLudkiCARB2KtS+4hECX7Q==",
+      "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.3",
@@ -12427,9 +13946,9 @@
       },
       "dependencies": {
         "@babel/runtime": {
-          "version": "7.6.3",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
-          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+          "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"
@@ -12444,19 +13963,19 @@
       }
     },
     "gatsby-telemetry": {
-      "version": "1.1.30",
-      "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.1.30.tgz",
-      "integrity": "sha512-q2Mzcn9wk2iRlk1iDdrCFnWOw2tfzuiCnNEM+x/gsjtU4FWwDiCdcV0QIxwcPc5wDVxBB3dKrCh1EfZ7hHX9sg==",
+      "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.3",
-        "bluebird": "^3.7.0",
+        "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",
@@ -12478,20 +13997,14 @@
           }
         },
         "@babel/runtime": {
-          "version": "7.6.3",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
-          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
+          "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"
           }
         },
-        "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
-        },
         "configstore": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.0.tgz",
@@ -12513,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"
@@ -12533,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
             }
           }
@@ -12577,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",
@@ -12757,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",
@@ -13021,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",
@@ -13556,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",
@@ -13615,20 +15128,20 @@
       "dev": true
     },
     "husky": {
-      "version": "3.0.8",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.8.tgz",
-      "integrity": "sha512-HFOsgcyrX3qe/rBuqyTt+P4Gxn5P0seJmr215LAZ/vnwK3jWB3r0ck7swbzGRUbufCf9w/lgHPVbF/YXQALgfQ==",
+      "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"
       },
@@ -13692,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",
@@ -15704,9 +17208,9 @@
       }
     },
     "lint-staged": {
-      "version": "9.4.1",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.4.1.tgz",
-      "integrity": "sha512-zFRbo1bAJEVf1m33paTTjDVfy2v3lICCqHfmQSgNoI+lWpi7HPG5y/R2Y7Whdce+FKxlZYs/U1sDSx8+nmQdDA==",
+      "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",
@@ -15735,22 +17239,20 @@
           }
         },
         "commander": {
-          "version": "2.20.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz",
-          "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==",
+          "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
         },
         "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": {
@@ -15763,12 +17265,12 @@
           }
         },
         "execa": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.5.tgz",
-          "integrity": "sha512-SwmwZZyJjflcqLSgllk4EQlMLst2p9muyzwNugKGFlpAz6rZ7M+s2nBR97GAq4Vzjwx2y9rcMcmqzojwN+xwNA==",
+          "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",
@@ -15853,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": {
@@ -15878,10 +17372,25 @@
           "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
         },
         "to-regex-range": {
@@ -15892,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"
+          }
         }
       }
     },
@@ -16383,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": {
@@ -17044,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": {
@@ -17086,9 +18604,9 @@
       }
     },
     "mocha": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.1.tgz",
-      "integrity": "sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A==",
+      "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",
@@ -17756,9 +19274,9 @@
       }
     },
     "nock": {
-      "version": "11.4.0",
-      "resolved": "https://registry.npmjs.org/nock/-/nock-11.4.0.tgz",
-      "integrity": "sha512-UrVEbEAvhyDoUttrS0fv3znhZ5nEJvlxqgmrC6Gb2Mf9cFci65RMK17e6EjDDQB57g5iwZw1TFnVvyeL0eUlhQ==",
+      "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",
@@ -18016,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": {
@@ -18044,18 +19554,18 @@
       "dev": true
     },
     "nodemon": {
-      "version": "1.19.3",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.3.tgz",
-      "integrity": "sha512-TBNKRmJykEbxpTniZBusqRrUTHIEqa2fpecbTQDQj1Gxjth7kKAPP296ztR0o5gPUWsiYbuEbt73/+XMYab1+w==",
+      "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"
@@ -18090,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",
@@ -18107,6 +19623,15 @@
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
           "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "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"
+          }
         }
       }
     },
@@ -19783,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": {
@@ -19820,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",
@@ -19879,14 +21430,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"
           }
         }
       }
@@ -20033,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": {
@@ -20093,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"
           }
         }
       }
@@ -20323,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"
           }
         }
       }
@@ -20389,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"
           }
         }
       }
@@ -20892,9 +22548,9 @@
       }
     },
     "react": {
-      "version": "16.10.2",
-      "resolved": "https://registry.npmjs.org/react/-/react-16.10.2.tgz",
-      "integrity": "sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw==",
+      "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",
@@ -21098,21 +22754,21 @@
       }
     },
     "react-dom": {
-      "version": "16.10.2",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.10.2.tgz",
-      "integrity": "sha512-kWGDcH3ItJK4+6Pl9DZB16BXYAZyrYQItU4OMy0jAkv5aNqc+mAKb4TpFtAteI6TJZu+9ZlNhaeNQSVQDHJzkw==",
+      "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.16.2"
+        "scheduler": "^0.17.0"
       },
       "dependencies": {
         "scheduler": {
-          "version": "0.16.2",
-          "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.16.2.tgz",
-          "integrity": "sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg==",
+          "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",
@@ -21146,11 +22802,12 @@
       }
     },
     "react-hot-loader": {
-      "version": "4.12.15",
-      "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.15.tgz",
-      "integrity": "sha512-sgkN6g+tgPE6xZzD0Ysqll7KUFYJbMX0DrczT5OxD6S7hZlSnmqSC3ceudwCkiDd65ZTtm+Ayk4Y9k5xxCvpOw==",
+      "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",
@@ -21191,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",
@@ -21278,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
         }
       }
@@ -21633,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": {
@@ -22079,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",
@@ -22328,9 +23985,9 @@
       "dev": true
     },
     "simple-icons": {
-      "version": "1.18.0",
-      "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-1.18.0.tgz",
-      "integrity": "sha512-zarcqLq6DL96q7rSHeh/bM/xlflp1Uil7lyz7KHK4bg+92vcA+BJ1CpjA62Xe1KnfeOSEmTXHR6ftaFYiaSaNQ=="
+      "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",
@@ -22469,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",
@@ -22528,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",
@@ -22543,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": {
@@ -23147,12 +24804,12 @@
       "integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg=="
     },
     "start-server-and-test": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.5.tgz",
-      "integrity": "sha512-3cErmnxyzLaMy460btq0ohGDJcq8G7o16Ijnmgw5Tu59aTa2pkfGR5I8M6p584kDFTxmGvV1OsmV3eWMFC6Obw==",
+      "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.7.0",
+        "bluebird": "3.7.1",
         "check-more-types": "2.24.0",
         "debug": "4.1.1",
         "execa": "2.1.0",
@@ -23162,9 +24819,9 @@
       },
       "dependencies": {
         "bluebird": {
-          "version": "3.7.0",
-          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz",
-          "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==",
+          "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": {
@@ -23754,9 +25411,9 @@
       }
     },
     "styled-components": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.4.0.tgz",
-      "integrity": "sha512-xQ6vTI/0zNjZ1BBDRxyjvBddrxhQ3DxjeCdaLM1lSn5FDnkTOQgRkmWvcUiTajqc5nJqKVl+7sUioMqktD0+Zw==",
+      "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",
@@ -23775,9 +25432,9 @@
       },
       "dependencies": {
         "@emotion/is-prop-valid": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.3.tgz",
-          "integrity": "sha512-We7VBiltAJ70KQA0dWkdPMXnYoizlxOXpvtjmu5/MBnExd+u0PGgV27WCYanmLAbCwAU30Le/xA0CQs/F/Otig==",
+          "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.3"
@@ -23830,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.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": {
@@ -24091,9 +25769,9 @@
       }
     },
     "terser": {
-      "version": "4.3.8",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz",
-      "integrity": "sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==",
+      "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",
@@ -24333,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": {
@@ -24682,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": {
@@ -24926,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",
@@ -25220,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": {
@@ -25251,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
         }
       }
@@ -25333,9 +27017,9 @@
       "optional": true
     },
     "webpack": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.1.tgz",
-      "integrity": "sha512-ak7u4tUu/U63sCVxA571IuPZO/Q0pZ9cEXKg+R/woxkDzVovq57uB6L2Hlg/pC8LCU+TWpvtcYwsstivQwMJmw==",
+      "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",
@@ -25381,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",
@@ -25434,9 +27128,9 @@
       }
     },
     "webpack-dev-server": {
-      "version": "3.8.2",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz",
-      "integrity": "sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ==",
+      "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",
@@ -25457,7 +27151,7 @@
         "loglevel": "^1.6.4",
         "opn": "^5.5.0",
         "p-retry": "^3.0.1",
-        "portfinder": "^1.0.24",
+        "portfinder": "^1.0.25",
         "schema-utils": "^1.0.0",
         "selfsigned": "^1.10.7",
         "semver": "^6.3.0",
@@ -25896,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",
@@ -26555,9 +28249,9 @@
           "dev": true
         },
         "figures": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz",
-          "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==",
+          "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"
diff --git a/package.json b/package.json
index 1a11ce4f7455e949122b7f4a76c016edc1709eb0..68a87d32f5accf9e50b9215001e3fdd00d93fb7d 100644
--- a/package.json
+++ b/package.json
@@ -23,23 +23,23 @@
   },
   "dependencies": {
     "@hapi/joi": "^16.1.7",
-    "@sentry/node": "^5.7.0",
+    "@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.3",
+    "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.13.0",
+    "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.18.0",
+    "simple-icons": "1.19.1",
     "xmldom": "~0.1.27",
     "xpath": "~0.0.27"
   },
@@ -144,29 +144,29 @@
     ]
   },
   "devDependencies": {
-    "@babel/core": "^7.6.4",
-    "@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.3",
-    "@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.11",
-    "@types/react-helmet": "^5.0.11",
-    "@types/react-modal": "^3.8.3",
-    "@types/react-select": "^3.0.5",
+    "@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.18",
+    "babel-preset-gatsby": "^0.2.20",
     "caller": "^1.0.1",
     "chai": "^4.1.2",
     "chai-datetime": "^1.5.0",
@@ -174,70 +174,70 @@
     "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.4.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.9",
-    "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.16.0",
-    "eslint-plugin-react-hooks": "^2.1.2",
+    "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.36",
-    "gatsby-plugin-catch-links": "^2.1.12",
-    "gatsby-plugin-page-creator": "^2.1.24",
-    "gatsby-plugin-react-helmet": "^3.1.11",
-    "gatsby-plugin-remove-trailing-slashes": "^2.1.10",
-    "gatsby-plugin-styled-components": "^3.1.8",
-    "gatsby-plugin-typescript": "^2.1.11",
+    "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.8",
+    "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.1",
+    "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.1",
+    "mocha": "^6.2.2",
     "mocha-env-reporter": "^4.0.0",
     "mocha-junit-reporter": "^1.23.1",
     "mocha-yaml-loader": "^1.0.3",
-    "nock": "11.4.0",
+    "nock": "11.7.0",
     "node-mocks-http": "^1.8.0",
-    "nodemon": "^1.19.3",
+    "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.10.2",
-    "react-dom": "^16.10.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-modal": "^3.11.1",
     "react-pose": "^4.0.9",
     "react-select": "^3.0.8",
     "read-all-stdin-sync": "^1.0.5",
@@ -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.5",
-    "styled-components": "^4.4.0",
+    "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 a36f43a8a8b22fe066003abc6e74f5b29b1bdcbc..604db37bcbe7a84e0d276a418ffdedd66f0176f0 100644
--- a/services/aur/aur.service.js
+++ b/services/aur/aur.service.js
@@ -63,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' }),
       },
     ]
   }
diff --git a/services/aur/aur.tester.js b/services/aur/aur.tester.js
index 5b78f795b1daefa11eeeaa547abaf031e4f07ff7..c6b4d8d9d4e9957c3c2f4d6f1e732d58fe449ecf 100644
--- a/services/aur/aur.tester.js
+++ b/services/aur/aur.tester.js
@@ -49,7 +49,7 @@ 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 (no license)')
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/github/github-common-fetch.js b/services/github/github-common-fetch.js
index b016a535c8ddf39a875e6b5e658624762d2eb92e..fefd786176cc96d9e0f08b44eeccb42f7a081ebe 100644
--- a/services/github/github-common-fetch.js
+++ b/services/github/github-common-fetch.js
@@ -45,10 +45,11 @@ async function fetchRepoContent(
       throw new InvalidResponse({ prettyMessage: 'undecodable content' })
     }
   } else {
-    return serviceInstance._request({
+    const { buffer } = await serviceInstance._request({
       url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filename}`,
       errorMessages,
     })
+    return buffer
   }
 }
 
@@ -96,6 +97,7 @@ async function fetchLatestRelease(serviceInstance, { user, repo }) {
 
 module.exports = {
   fetchIssue,
+  fetchRepoContent,
   fetchJsonFromRepo,
   fetchLatestRelease,
   releaseInfoSchema,
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
index bfbc5aa0a9472f730adf0084095137d7efddb605..0192793a3904773f32dc1d2804671f2e8180aaba 100644
--- a/services/github/github-hacktoberfest.service.js
+++ b/services/github/github-hacktoberfest.service.js
@@ -120,7 +120,14 @@ module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Ser
       // 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
@@ -140,7 +147,7 @@ module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Ser
           : '',
       ]
         .filter(Boolean)
-        .join(', ') || 'is done!'
+        .join(', ') || 'is over!'
 
     return { message }
   }
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
index 532ecfbe3684fc4decde562f185018bf4d279fb2..51eb74c164840d911be7d2846e9996d9ddecdcde 100644
--- a/services/github/github-hacktoberfest.tester.js
+++ b/services/github/github-hacktoberfest.tester.js
@@ -3,15 +3,27 @@
 const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
-const isHactoberfestCombinedStatus = Joi.string().regex(
+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: isHactoberfestCombinedStatus,
+    message: isHacktoberfestStatus,
   })
 
 t.create('GitHub Hacktoberfest combined status (suggestion label override)')
@@ -22,5 +34,5 @@ t.create('GitHub Hacktoberfest combined status (suggestion label override)')
   )
   .expectBadge({
     label: 'hacktoberfest',
-    message: isHactoberfestCombinedStatus,
+    message: isHacktoberfestStatus,
   })
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-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/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/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/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/version.js b/services/version.js
index 3c6cdb6cf284ac915c8cc35eb1a2c869cfeabee1..e13623f3fb26d081ff12028005f2a3ca75834167 100644
--- a/services/version.js
+++ b/services/version.js
@@ -84,12 +84,12 @@ function latest(versions, { pre = false } = {}) {
   try {
     // coerce to string then lowercase otherwise alpha > RC
     version = versions.sort((a, b) =>
-      semver.compareBuild(
+      semver.rcompare(
         `${a}`.toLowerCase(),
         `${b}`.toLowerCase(),
         /* loose */ true
       )
-    )[versions.length - 1]
+    )[0]
   } catch (e) {
     version = latestDottedVersion(versions)
   }
diff --git a/services/version.spec.js b/services/version.spec.js
index cb93aea00b0405a9eccaf16604b36256720fdcc5..29903adbe10ed7ad0a426cf66838b3aec4678b1b 100644
--- a/services/version.spec.js
+++ b/services/version.spec.js
@@ -102,9 +102,6 @@ describe('Version helpers', function() {
     given(['1.0.0', '1.0.2', '1.1', '1.0', 'notaversion2', '12bcde4']).expect(
       '1.1'
     )
-
-    // build qualifiers - https://github.com/badges/shields/issues/4172
-    given(['0.3.9', '0.4.0+1', '0.4.0+9']).expect('0.4.0+9')
   })
 
   test(slice, () => {
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,
+  })