From 1d470b561ead7f92891118a00005951630278e2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 12:41:02 +0000 Subject: [PATCH 1/3] Bump gh-pages from 4.0.0 to 6.1.1 Bumps [gh-pages](https://github.com/tschaub/gh-pages) from 4.0.0 to 6.1.1. - [Release notes](https://github.com/tschaub/gh-pages/releases) - [Changelog](https://github.com/tschaub/gh-pages/blob/main/changelog.md) - [Commits](https://github.com/tschaub/gh-pages/compare/v4.0.0...v6.1.1) --- updated-dependencies: - dependency-name: gh-pages dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 130 +++++++++++++++------------------------------- package.json | 2 +- 2 files changed, 42 insertions(+), 90 deletions(-) diff --git a/package-lock.json b/package-lock.json index ceaaa22..c3e82bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "@types/mixpanel-browser": "^2.38.0", "@types/styled-components": "^5.1.26", "@types/uuid": "^8.3.4", - "gh-pages": "^4.0.0", + "gh-pages": "^6.1.1", "prettier": "3.3.3" } }, @@ -7067,9 +7067,9 @@ "integrity": "sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==" }, "node_modules/email-addresses": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", - "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz", + "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==", "dev": true }, "node_modules/emittery": { @@ -8707,17 +8707,17 @@ } }, "node_modules/gh-pages": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", - "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.1.1.tgz", + "integrity": "sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==", "dev": true, "dependencies": { - "async": "^2.6.1", - "commander": "^2.18.0", - "email-addresses": "^3.0.1", + "async": "^3.2.4", + "commander": "^11.0.0", + "email-addresses": "^5.0.0", "filenamify": "^4.3.0", "find-cache-dir": "^3.3.1", - "fs-extra": "^8.1.0", + "fs-extra": "^11.1.1", "globby": "^6.1.0" }, "bin": { @@ -8740,33 +8740,27 @@ "node": ">=0.10.0" } }, - "node_modules/gh-pages/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/gh-pages/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, - "dependencies": { - "lodash": "^4.17.14" + "engines": { + "node": ">=16" } }, - "node_modules/gh-pages/node_modules/commander": { - "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 - }, "node_modules/gh-pages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.14" } }, "node_modules/gh-pages/node_modules/globby": { @@ -8785,24 +8779,6 @@ "node": ">=0.10.0" } }, - "node_modules/gh-pages/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/gh-pages/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -25767,9 +25743,9 @@ "integrity": "sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==" }, "email-addresses": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", - "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz", + "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==", "dev": true }, "emittery": { @@ -26963,17 +26939,17 @@ } }, "gh-pages": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", - "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.1.1.tgz", + "integrity": "sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==", "dev": true, "requires": { - "async": "^2.6.1", - "commander": "^2.18.0", - "email-addresses": "^3.0.1", + "async": "^3.2.4", + "commander": "^11.0.0", + "email-addresses": "^5.0.0", "filenamify": "^4.3.0", "find-cache-dir": "^3.3.1", - "fs-extra": "^8.1.0", + "fs-extra": "^11.1.1", "globby": "^6.1.0" }, "dependencies": { @@ -26986,30 +26962,21 @@ "array-uniq": "^1.0.1" } }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, "commander": { - "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==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "globby": { @@ -27024,21 +26991,6 @@ "pify": "^2.0.0", "pinkie-promise": "^2.0.0" } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true } } }, diff --git a/package.json b/package.json index 3daf595..6614561 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "@types/mixpanel-browser": "^2.38.0", "@types/styled-components": "^5.1.26", "@types/uuid": "^8.3.4", - "gh-pages": "^4.0.0", + "gh-pages": "^6.1.1", "prettier": "3.3.3" } } From f5fad73d96de18cc3397bcf191cfe9bc3a10f04b Mon Sep 17 00:00:00 2001 From: Anders Hafreager Date: Tue, 17 Sep 2024 20:38:41 +0200 Subject: [PATCH 2/3] Added lammps_logfile --- jupyterlite/content/lammps_logfile/File.py | 125 ++++++++++++++++++ .../content/lammps_logfile/__init__.py | 3 + .../content/lammps_logfile/cmd_interface.py | 30 +++++ jupyterlite/content/lammps_logfile/utils.py | 63 +++++++++ 4 files changed, 221 insertions(+) create mode 100644 jupyterlite/content/lammps_logfile/File.py create mode 100644 jupyterlite/content/lammps_logfile/__init__.py create mode 100644 jupyterlite/content/lammps_logfile/cmd_interface.py create mode 100644 jupyterlite/content/lammps_logfile/utils.py diff --git a/jupyterlite/content/lammps_logfile/File.py b/jupyterlite/content/lammps_logfile/File.py new file mode 100644 index 0000000..5f8f21b --- /dev/null +++ b/jupyterlite/content/lammps_logfile/File.py @@ -0,0 +1,125 @@ +import numpy as np +import pandas as pd +from io import BytesIO, StringIO + +class File: + """Class for handling lammps log files. + + Parameters + ---------------------- + :param ifile: path to lammps log file + :type ifile: string or file + + """ + def __init__(self, ifile): + # Identifiers for places in the log file + self.start_thermo_strings = ["Memory usage per processor", "Per MPI rank memory allocation"] + self.stop_thermo_strings = ["Loop time", "ERROR"] + self.data_dict = {} + self.keywords = [] + self.output_before_first_run = "" + self.partial_logs = [] + if hasattr(ifile, "read"): + self.logfile = ifile + else: + self.logfile = open(ifile, 'r') + self.read_file_to_dict() + + def read_file_to_dict(self): + contents = self.logfile.readlines() + keyword_flag = False + before_first_run_flag = True + i = 0 + while i < len(contents): + line = contents[i] + if before_first_run_flag: + self.output_before_first_run += line + + if keyword_flag: + keywords = line.split() + tmpString = "" + # Check wheter any of the thermo stop strigs are in the present line + while not sum([string in line for string in self.stop_thermo_strings]) >= 1: + if "\n" in line: + tmpString+=line + i+=1 + if i= 1: + keyword_flag = True + before_first_run_flag = False + i += 1 + + def flush_dict_and_set_new_keyword(self, keywords): + self.data_dict = {} + for entry in keywords: + self.data_dict[entry] = np.asarray([]) + self.keywords = keywords + + def get(self, entry_name, run_num=-1): + """Get time-series from log file by name. + + Paramerers + -------------------- + :param entry_name: Name of the entry, for example "Temp" + :type entry_name: str + :param run_num: Lammps simulations commonly involve several run-commands. Here you may choose what run you want the log data from. Default of :code:`-1` returns data from all runs concatenated + :type run_num: int + + If the rows in the log file changes between runs, the logs are being flushed. + """ + + if run_num == -1: + if entry_name in self.data_dict.keys(): + return self.data_dict[entry_name] + else: + return None + else: + if len(self.partial_logs) > run_num: + partial_log = self.partial_logs[run_num] + if entry_name in partial_log.keys(): + return partial_log[entry_name] + else: + return None + else: + return None + + def get_keywords(self, run_num=-1): + """Return list of available data columns in the log file.""" + if run_num == -1: + return sorted(self.keywords) + else: + if len(self.partial_logs) > run_num: + return sorted(list(self.partial_logs[run_num].keys())) + else: + return None + + def to_exdir_group(self, name, exdirfile): + group = exdirfile.require_group(name) + for i, log in enumerate(self.partial_logs): + subgroup = group.require_group(str(i)) + for key, value in log.items(): + key = key.replace("/", ".") + subgroup.create_dataset(key, data=value) + + + + def get_num_partial_logs(self): + return len(self.partial_logs) diff --git a/jupyterlite/content/lammps_logfile/__init__.py b/jupyterlite/content/lammps_logfile/__init__.py new file mode 100644 index 0000000..5a7b7bb --- /dev/null +++ b/jupyterlite/content/lammps_logfile/__init__.py @@ -0,0 +1,3 @@ +from .File import File +from .utils import running_mean, get_color_value, get_matlab_color +from .cmd_interface import run \ No newline at end of file diff --git a/jupyterlite/content/lammps_logfile/cmd_interface.py b/jupyterlite/content/lammps_logfile/cmd_interface.py new file mode 100644 index 0000000..30b1069 --- /dev/null +++ b/jupyterlite/content/lammps_logfile/cmd_interface.py @@ -0,0 +1,30 @@ +from lammps_logfile import File +from lammps_logfile import running_mean +import argparse +import matplotlib.pyplot as plt + +def get_parser(): + parser = argparse.ArgumentParser(description="Plot contents from lammps log files") + parser.add_argument("input_file", type=str, help="Lammps log file containing thermo output from lammps simulation.") + parser.add_argument("-x", type=str, default="Time", help="Data to plot on the first axis") + parser.add_argument("-y", type=str, nargs="+", help="Data to plot on the second axis. You can supply several names to get several plot lines in the same figure.") + parser.add_argument("-a", "--running_average", type=int, default=1, help="Optionally average over this many log entries with a running average. Some thermo properties fluctuate wildly, and often we are interested in te running average of properties like temperature and pressure.") + return parser + +def run(): + args = get_parser().parse_args() + log = File(args.input_file) + x = log.get(args.x) + print(x) + if args.running_average >= 2: + x = running_mean(x, args.running_average) + for y in args.y: + data = log.get(y) + print(data) + if args.running_average >= 2: + data = running_mean(data, args.running_average) + + plt.plot(x, data, label=y) + plt.legend() + plt.show() + diff --git a/jupyterlite/content/lammps_logfile/utils.py b/jupyterlite/content/lammps_logfile/utils.py new file mode 100644 index 0000000..a62c926 --- /dev/null +++ b/jupyterlite/content/lammps_logfile/utils.py @@ -0,0 +1,63 @@ +import numpy as np +import matplotlib + +def running_mean(data, N): + """Calculate running mean of an array-like dataset. + + Parameters + -------------------- + :param data: The array + :type data: 1d array-like + :param N: Width of the averaging window + :type N: int + + """ + + data = np.asarray(data) + if N == 1: + return data + else: + retArray = np.zeros(data.size)*np.nan + padL = int(N/2) + padR = N-padL-1 + retArray[padL:-padR] = np.convolve(data, np.ones((N,))/N, mode='valid') + return retArray + +def get_color_value(value, minValue, maxValue, cmap='viridis'): + """Get color from colormap. + + Parameters + ----------------- + :param value: Value used tpo get color from colormap + :param minValue: Minimum value in colormap. Values below this value will saturate on the lower color of the colormap. + :param maxValue: Maximum value in colormap. Values above this value will saturate on the upper color of the colormap. + + :returns: 4-vector containing colormap values. + + This is useful if you are plotting data from several simulations, and want to color them based on some parameters changing between the simulations. For example, you may want the color to gradually change along a clormap as the temperature increases. + + """ + diff = maxValue-minValue + cmap = matplotlib.cm.get_cmap(cmap) + rgba = cmap((value-minValue)/diff) + return rgba + +def get_matlab_color(i): + """Get colors from matlabs standard color order. + + Parameters + ------------- + :param i: Index. Cycles with a period of 7, so calling with 1 returns the same color as calling with 8. + :type i: int + + :returns: color as 3-vector + + """ + colors = np.asarray([ [0, 0.447000000000000, 0.741000000000000], + [0.850000000000000, 0.325000000000000, 0.098000000000000], + [0.929000000000000, 0.694000000000000, 0.125000000000000], + [0.494000000000000, 0.184000000000000, 0.556000000000000], + [0.466000000000000, 0.674000000000000, 0.188000000000000], + [0.301000000000000, 0.745000000000000, 0.933000000000000], + [0.635000000000000, 0.078000000000000, 0.184000000000000]]) + return colors[ i%len(colors) ] From 7f49338bed2cf8a8d54ef66b66f575e6fd4162ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Oct 2024 12:47:32 +0000 Subject: [PATCH 3/3] Bump web-vitals from 2.1.4 to 4.2.3 Bumps [web-vitals](https://github.com/GoogleChrome/web-vitals) from 2.1.4 to 4.2.3. - [Changelog](https://github.com/GoogleChrome/web-vitals/blob/main/CHANGELOG.md) - [Commits](https://github.com/GoogleChrome/web-vitals/compare/v2.1.4...v4.2.3) --- updated-dependencies: - dependency-name: web-vitals dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c3e82bd..8d6002c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "three": "^0.164.1", "typescript": "^4.8.4", "uuid": "^9.0.0", - "web-vitals": "^2.1.4" + "web-vitals": "^4.2.3" }, "devDependencies": { "@types/mixpanel-browser": "^2.38.0", @@ -19840,9 +19840,9 @@ } }, "node_modules/web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.3.tgz", + "integrity": "sha512-/CFAm1mNxSmOj6i0Co+iGFJ58OS4NRGVP+AWS/l509uIK5a1bSoIVaHz/ZumpHTfHSZBpgrJ+wjfpAOrTHok5Q==" }, "node_modules/webidl-conversions": { "version": "6.1.0", @@ -35036,9 +35036,9 @@ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" }, "web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.3.tgz", + "integrity": "sha512-/CFAm1mNxSmOj6i0Co+iGFJ58OS4NRGVP+AWS/l509uIK5a1bSoIVaHz/ZumpHTfHSZBpgrJ+wjfpAOrTHok5Q==" }, "webidl-conversions": { "version": "6.1.0", diff --git a/package.json b/package.json index 6614561..068afb6 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "three": "^0.164.1", "typescript": "^4.8.4", "uuid": "^9.0.0", - "web-vitals": "^2.1.4" + "web-vitals": "^4.2.3" }, "scripts": { "start": "react-scripts start",