Index: frontend/node_modules/workbox-sw/LICENSE
===================================================================
--- frontend/node_modules/workbox-sw/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-sw/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+Copyright 2018 Google LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: frontend/node_modules/workbox-sw/README.md
===================================================================
--- frontend/node_modules/workbox-sw/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-sw/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+This module's documentation can be found at https://developers.google.com/web/tools/workbox/modules/workbox-sw
Index: frontend/node_modules/workbox-sw/_types.mjs
===================================================================
--- frontend/node_modules/workbox-sw/_types.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-sw/_types.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,24 @@
+/*
+  Copyright 2018 Google LLC
+
+  Use of this source code is governed by an MIT-style
+  license that can be found in the LICENSE file or at
+  https://opensource.org/licenses/MIT.
+*/
+
+import './_version.mjs';
+
+/**
+ * A `ModulePathCallback` function can be used to modify the modify the where
+ * Workbox modules are loaded.
+ *
+ * @callback ~ModulePathCallback
+ * @param {string} moduleName The name of the module to load (i.e.
+ * 'workbox-core', 'workbox-precaching' etc.).
+ * @param {boolean} debug When true, `dev` builds should be loaded, otherwise
+ * load `prod` builds.
+ * @return {string} This callback should return a path of module. This will
+ * be passed to `importScripts()`.
+ *
+ * @memberof workbox
+ */
Index: frontend/node_modules/workbox-sw/_version.mjs
===================================================================
--- frontend/node_modules/workbox-sw/_version.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-sw/_version.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+try{self['workbox:sw:6.6.0']&&_()}catch(e){}// eslint-disable-line
Index: frontend/node_modules/workbox-sw/controllers/WorkboxSW.mjs
===================================================================
--- frontend/node_modules/workbox-sw/controllers/WorkboxSW.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-sw/controllers/WorkboxSW.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,220 @@
+/*
+  Copyright 2018 Google LLC
+
+  Use of this source code is governed by an MIT-style
+  license that can be found in the LICENSE file or at
+  https://opensource.org/licenses/MIT.
+*/
+
+import '../_version.mjs';
+
+const CDN_PATH = `WORKBOX_CDN_ROOT_URL`;
+
+const MODULE_KEY_TO_NAME_MAPPING = {
+  /**
+   * @name backgroundSync
+   * @memberof workbox
+   * @see module:workbox-background-sync
+   */
+  backgroundSync: 'background-sync',
+  /**
+   * @name broadcastUpdate
+   * @memberof workbox
+   * @see module:workbox-broadcast-update
+   */
+  broadcastUpdate: 'broadcast-update',
+  /**
+   * @name cacheableResponse
+   * @memberof workbox
+   * @see module:workbox-cacheable-response
+   */
+  cacheableResponse: 'cacheable-response',
+  /**
+   * @name core
+   * @memberof workbox
+   * @see module:workbox-core
+   */
+  core: 'core',
+  /**
+   * @name expiration
+   * @memberof workbox
+   * @see module:workbox-expiration
+   */
+  expiration: 'expiration',
+  /**
+   * @name googleAnalytics
+   * @memberof workbox
+   * @see module:workbox-google-analytics
+   */
+  googleAnalytics: 'offline-ga',
+  /**
+   * @name navigationPreload
+   * @memberof workbox
+   * @see module:workbox-navigation-preload
+   */
+  navigationPreload: 'navigation-preload',
+  /**
+   * @name precaching
+   * @memberof workbox
+   * @see module:workbox-precaching
+   */
+  precaching: 'precaching',
+  /**
+   * @name rangeRequests
+   * @memberof workbox
+   * @see module:workbox-range-requests
+   */
+  rangeRequests: 'range-requests',
+  /**
+   * @name routing
+   * @memberof workbox
+   * @see module:workbox-routing
+   */
+  routing: 'routing',
+  /**
+   * @name strategies
+   * @memberof workbox
+   * @see module:workbox-strategies
+   */
+  strategies: 'strategies',
+  /**
+   * @name streams
+   * @memberof workbox
+   * @see module:workbox-streams
+   */
+  streams: 'streams',
+  /**
+   * @name recipes
+   * @memberof workbox
+   * @see module:workbox-recipes
+   */
+  recipes: 'recipes',
+};
+
+/**
+ * This class can be used to make it easy to use the various parts of
+ * Workbox.
+ *
+ * @private
+ */
+export class WorkboxSW {
+  /**
+   * Creates a proxy that automatically loads workbox namespaces on demand.
+   *
+   * @private
+   */
+  constructor() {
+    this.v = {};
+    this._options = {
+      debug: self.location.hostname === 'localhost',
+      modulePathPrefix: null,
+      modulePathCb: null,
+    };
+
+    this._env = this._options.debug ? 'dev' : 'prod';
+    this._modulesLoaded = false;
+
+    return new Proxy(this, {
+      get(target, key) {
+        if (target[key]) {
+          return target[key];
+        }
+
+        const moduleName = MODULE_KEY_TO_NAME_MAPPING[key];
+        if (moduleName) {
+          target.loadModule(`workbox-${moduleName}`);
+        }
+
+        return target[key];
+      },
+    });
+  }
+
+  /**
+   * Updates the configuration options. You can specify whether to treat as a
+   * debug build and whether to use a CDN or a specific path when importing
+   * other workbox-modules
+   *
+   * @param {Object} [options]
+   * @param {boolean} [options.debug] If true, `dev` builds are using, otherwise
+   * `prod` builds are used. By default, `prod` is used unless on localhost.
+   * @param {Function} [options.modulePathPrefix] To avoid using the CDN with
+   * `workbox-sw` set the path prefix of where modules should be loaded from.
+   * For example `modulePathPrefix: '/third_party/workbox/v3.0.0/'`.
+   * @param {workbox~ModulePathCallback} [options.modulePathCb] If defined,
+   * this callback will be responsible for determining the path of each
+   * workbox module.
+   *
+   * @alias workbox.setConfig
+   */
+  setConfig(options = {}) {
+    if (!this._modulesLoaded) {
+      Object.assign(this._options, options);
+      this._env = this._options.debug ? 'dev' : 'prod';
+    } else {
+      throw new Error('Config must be set before accessing workbox.* modules');
+    }
+  }
+
+  /**
+   * Load a Workbox module by passing in the appropriate module name.
+   *
+   * This is not generally needed unless you know there are modules that are
+   * dynamically used and you want to safe guard use of the module while the
+   * user may be offline.
+   *
+   * @param {string} moduleName
+   *
+   * @alias workbox.loadModule
+   */
+  loadModule(moduleName) {
+    const modulePath = this._getImportPath(moduleName);
+    try {
+      importScripts(modulePath);
+      this._modulesLoaded = true;
+    } catch (err) {
+      // TODO Add context of this error if using the CDN vs the local file.
+
+      // We can't rely on workbox-core being loaded so using console
+      // eslint-disable-next-line
+      console.error(
+          `Unable to import module '${moduleName}' from '${modulePath}'.`);
+      throw err;
+    }
+  }
+
+  /**
+   * This method will get the path / CDN URL to be used for importScript calls.
+   *
+   * @param {string} moduleName
+   * @return {string} URL to the desired module.
+   *
+   * @private
+   */
+  _getImportPath(moduleName) {
+    if (this._options.modulePathCb) {
+      return this._options.modulePathCb(moduleName, this._options.debug);
+    }
+
+    // TODO: This needs to be dynamic some how.
+    let pathParts = [CDN_PATH];
+
+    const fileName = `${moduleName}.${this._env}.js`;
+
+    const pathPrefix = this._options.modulePathPrefix;
+    if (pathPrefix) {
+      // Split to avoid issues with developers ending / not ending with slash
+      pathParts = pathPrefix.split('/');
+
+      // We don't need a slash at the end as we will be adding
+      // a filename regardless
+      if (pathParts[pathParts.length - 1] === '') {
+        pathParts.splice(pathParts.length - 1, 1);
+      }
+    }
+
+    pathParts.push(fileName);
+
+    return pathParts.join('/');
+  }
+}
Index: frontend/node_modules/workbox-sw/index.mjs
===================================================================
--- frontend/node_modules/workbox-sw/index.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-sw/index.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,17 @@
+/*
+  Copyright 2018 Google LLC
+
+  Use of this source code is governed by an MIT-style
+  license that can be found in the LICENSE file or at
+  https://opensource.org/licenses/MIT.
+*/
+
+import {WorkboxSW} from './controllers/WorkboxSW.mjs';
+import './_version.mjs';
+
+/**
+ * @namespace workbox
+ */
+
+// Don't export anything, just expose a global.
+self.workbox = new WorkboxSW();
Index: frontend/node_modules/workbox-sw/package.json
===================================================================
--- frontend/node_modules/workbox-sw/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-sw/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,24 @@
+{
+  "name": "workbox-sw",
+  "version": "6.6.0",
+  "license": "MIT",
+  "author": "Google's Web DevRel Team",
+  "description": "This module makes it easy to get started with the Workbox service worker libraries.",
+  "repository": "googlechrome/workbox",
+  "bugs": "https://github.com/googlechrome/workbox/issues",
+  "homepage": "https://github.com/GoogleChrome/workbox",
+  "keywords": [
+    "workbox",
+    "workboxjs",
+    "service worker",
+    "sw"
+  ],
+  "workbox": {
+    "browserNamespace": "workbox",
+    "packageType": "sw",
+    "prodOnly": true
+  },
+  "main": "build/workbox-sw.js",
+  "module": "index.mjs",
+  "gitHead": "252644491d9bb5a67518935ede6df530107c9475"
+}
