Index: frontend/node_modules/rollup-plugin-terser/rollup-plugin-terser.js
===================================================================
--- frontend/node_modules/rollup-plugin-terser/rollup-plugin-terser.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/rollup-plugin-terser/rollup-plugin-terser.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,102 @@
+const { codeFrameColumns } = require("@babel/code-frame");
+const Worker = require("jest-worker").default;
+const serialize = require("serialize-javascript");
+
+function terser(userOptions = {}) {
+  if (userOptions.sourceMap != null) {
+    throw Error(
+      "sourceMap option is removed. Now it is inferred from rollup options."
+    );
+  }
+  if (userOptions.sourcemap != null) {
+    throw Error(
+      "sourcemap option is removed. Now it is inferred from rollup options."
+    );
+  }
+
+  return {
+    name: "terser",
+
+    async renderChunk(code, chunk, outputOptions) {
+      if (!this.worker) {
+        this.worker = new Worker(require.resolve("./transform.js"), {
+          numWorkers: userOptions.numWorkers,
+        });
+        this.numOfBundles = 0;
+      }
+
+      this.numOfBundles++;
+
+      const defaultOptions = {
+        sourceMap:
+          outputOptions.sourcemap === true ||
+          typeof outputOptions.sourcemap === "string",
+      };
+      if (outputOptions.format === "es" || outputOptions.format === "esm") {
+        defaultOptions.module = true;
+      }
+      if (outputOptions.format === "cjs") {
+        defaultOptions.toplevel = true;
+      }
+
+      const normalizedOptions = { ...defaultOptions, ...userOptions };
+
+      // remove plugin specific options
+      for (let key of ["numWorkers"]) {
+        if (normalizedOptions.hasOwnProperty(key)) {
+          delete normalizedOptions[key];
+        }
+      }
+
+      const serializedOptions = serialize(normalizedOptions);
+
+      try {
+        const result = await this.worker.transform(code, serializedOptions);
+
+        if (result.nameCache) {
+          let { vars, props } = userOptions.nameCache;
+
+          // only assign nameCache.vars if it was provided, and if terser produced values:
+          if (vars) {
+            const newVars =
+              result.nameCache.vars && result.nameCache.vars.props;
+            if (newVars) {
+              vars.props = vars.props || {};
+              Object.assign(vars.props, newVars);
+            }
+          }
+
+          // support populating an empty nameCache object:
+          if (!props) {
+            props = userOptions.nameCache.props = {};
+          }
+
+          // merge updated props into original nameCache object:
+          const newProps =
+            result.nameCache.props && result.nameCache.props.props;
+          if (newProps) {
+            props.props = props.props || {};
+            Object.assign(props.props, newProps);
+          }
+        }
+
+        return result.result;
+      } catch (error) {
+        const { message, line, col: column } = error;
+        console.error(
+          codeFrameColumns(code, { start: { line, column } }, { message })
+        );
+        throw error;
+      } finally {
+        this.numOfBundles--;
+
+        if (this.numOfBundles === 0) {
+          this.worker.end();
+          this.worker = 0;
+        }
+      }
+    },
+  };
+}
+
+exports.terser = terser;
