From d0d1fce4820f5daa9136632c24d40f1c9ce67afb Mon Sep 17 00:00:00 2001 From: Joe Rickerby Date: Fri, 26 Apr 2024 16:53:20 +0100 Subject: [PATCH 01/44] Initial commit of new HTML renderer, which does the processing clientside --- bin/update_sample_json.py | 28 + html_renderer/index.html | 3 +- html_renderer/public/sample.json | 623 +----------------- html_renderer/src/App.svelte | 8 +- html_renderer/src/lib/Frame.svelte | 30 +- html_renderer/src/lib/TreeView.svelte | 46 ++ html_renderer/src/lib/appState.ts | 2 +- html_renderer/src/lib/dataTypes.ts | 26 +- html_renderer/src/lib/model/Frame.ts | 249 +++++-- html_renderer/src/lib/model/FrameGroup.ts | 75 +++ html_renderer/src/lib/model/Group.ts | 50 -- html_renderer/src/lib/model/Session.ts | 74 ++- html_renderer/src/lib/model/frameOps.ts | 78 +++ html_renderer/src/lib/model/processors.ts | 239 +++++++ html_renderer/src/lib/utils.ts | 6 + pyinstrument/frame.py | 83 ++- pyinstrument/frame_ops.py | 13 +- pyinstrument/profiler.py | 1 + pyinstrument/renderers/html.py | 28 +- pyinstrument/renderers/html_resources/app.css | 2 +- pyinstrument/renderers/html_resources/app.js | 4 +- pyinstrument/renderers/jsonrenderer.py | 3 +- pyinstrument/renderers/pstatsrenderer.py | 2 +- pyinstrument/session.py | 54 +- test/test_renderers.py | 1 - 25 files changed, 895 insertions(+), 833 deletions(-) create mode 100755 bin/update_sample_json.py create mode 100644 html_renderer/src/lib/TreeView.svelte create mode 100644 html_renderer/src/lib/model/FrameGroup.ts delete mode 100644 html_renderer/src/lib/model/Group.ts create mode 100644 html_renderer/src/lib/model/frameOps.ts create mode 100644 html_renderer/src/lib/model/processors.ts create mode 100644 html_renderer/src/lib/utils.ts diff --git a/bin/update_sample_json.py b/bin/update_sample_json.py new file mode 100755 index 00000000..93b19754 --- /dev/null +++ b/bin/update_sample_json.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +import argparse +import json +import os +from pathlib import Path + +from pyinstrument.renderers.html import HTMLRenderer +from pyinstrument.session import Session + +ROOT_DIR = Path(__file__).parent.parent +OUTPUT_FILE = ROOT_DIR / "html_renderer" / "public" / "sample.json" + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("SESSION_FILE", help="The session file to load") + args = parser.parse_args() + session = Session.load(args.SESSION_FILE) + + with open(OUTPUT_FILE, "w") as f: + renderer = HTMLRenderer() + f.write(renderer.render_json(session)) + + print(f"Sample JSON written to {OUTPUT_FILE}") + + +if __name__ == "__main__": + main() diff --git a/html_renderer/index.html b/html_renderer/index.html index 2fa9255a..859b618d 100644 --- a/html_renderer/index.html +++ b/html_renderer/index.html @@ -19,7 +19,8 @@ document.getElementById('app'), data, ) - }); + }) + .catch(console.error); diff --git a/html_renderer/public/sample.json b/html_renderer/public/sample.json index 80740477..a17a1c7f 100644 --- a/html_renderer/public/sample.json +++ b/html_renderer/public/sample.json @@ -1,622 +1 @@ -{ - "root_frame": { - "function": "", - "file_path_short": "wikipedia_article_word_count.py", - "file_path": "examples/wikipedia_article_word_count.py", - "line_no": 1, - "time": 1.1059269190300256, - "children": [ - { - "function": "", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 68, - "time": 0.6747039500623941, - "children": [ - { - "function": "", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 69, - "time": 0.01671655592508614, - "children": [ - { - "function": "", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 91, - "time": 0.01542082498781383, - "children": [ - { - "function": "_convert", - "file_path_short": "enum.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py", - "line_no": 602, - "time": 0.001997870043851435, - "children": [ - { - "function": "__call__", - "file_path_short": "enum.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py", - "line_no": 265, - "time": 0.001997870043851435, - "children": [ - { - "function": "_create_", - "file_path_short": "enum.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py", - "line_no": 364, - "time": 0.001997870043851435, - "children": [ - { - "function": "__new__", - "file_path_short": "enum.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py", - "line_no": 124, - "time": 0.001997870043851435, - "children": [ - { - "function": "__setattr__", - "file_path_short": "enum.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py", - "line_no": 351, - "time": 0.001997870043851435, - "children": [], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - }, - { - "function": "__new__", - "file_path_short": "enum.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py", - "line_no": 124, - "time": 0.0013634880306199193, - "children": [ - { - "function": "__new__", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 360, - "time": 0.0013634880306199193, - "children": [], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - }, - { - "function": "namedtuple", - "file_path_short": "collections/__init__.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/collections/__init__.py", - "line_no": 357, - "time": 0.0010601179674267769, - "children": [], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - }, - { - "function": "", - "file_path_short": "http/__init__.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/__init__.py", - "line_no": 1, - "time": 0.0010016770102083683, - "children": [ - { - "function": "__new__", - "file_path_short": "enum.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py", - "line_no": 124, - "time": 0.0010016770102083683, - "children": [], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - } - ], - "group_id": "bb7ab151-75f3-4747-bed6-545ab06f392c" - }, - { - "function": "download", - "file_path_short": "wikipedia_article_word_count.py", - "file_path": "examples/wikipedia_article_word_count.py", - "line_no": 12, - "time": 0.4300254030385986, - "children": [ - { - "function": "urlopen", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 140, - "time": 0.42161056597251445, - "children": [ - { - "function": "open", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 508, - "time": 0.3348857240052894, - "children": [ - { - "function": "_open", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 536, - "time": 0.3348857240052894, - "children": [ - { - "function": "_call_chain", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 497, - "time": 0.3348857240052894, - "children": [ - { - "function": "https_open", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 1359, - "time": 0.3348857240052894, - "children": [ - { - "function": "do_open", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 1276, - "time": 0.3348857240052894, - "children": [ - { - "function": "getresponse", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 1287, - "time": 0.17754529602825642, - "children": [ - { - "function": "begin", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 290, - "time": 0.17754529602825642, - "children": [ - { - "function": "_read_status", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 257, - "time": 0.17754529602825642, - "children": [ - { - "function": "readinto", - "file_path_short": "socket.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py", - "line_no": 572, - "time": 0.17754529602825642, - "children": [ - { - "function": "recv_into", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 998, - "time": 0.17754529602825642, - "children": [ - { - "function": "read", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 863, - "time": 0.17754529602825642, - "children": [ - { - "function": "read", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 624, - "time": 0.17754529602825642, - "children": [], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - }, - { - "function": "request", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 1236, - "time": 0.14358445000834763, - "children": [ - { - "function": "_send_request", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 1241, - "time": 0.14358445000834763, - "children": [ - { - "function": "endheaders", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 1223, - "time": 0.14358445000834763, - "children": [ - { - "function": "_send_output", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 1017, - "time": 0.14358445000834763, - "children": [ - { - "function": "send", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 956, - "time": 0.14358445000834763, - "children": [ - { - "function": "connect", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 1389, - "time": 0.14358445000834763, - "children": [ - { - "function": "connect", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 933, - "time": 0.08178039907943457, - "children": [ - { - "function": "create_connection", - "file_path_short": "socket.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py", - "line_no": 688, - "time": 0.08178039907943457, - "children": [ - { - "function": "getaddrinfo", - "file_path_short": "socket.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py", - "line_no": 728, - "time": 0.056695011095143855, - "children": [ - { - "function": "search_function", - "file_path_short": "encodings/__init__.py", - "file_path": "/usr/local/bin/../../../Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/__init__.py", - "line_no": 71, - "time": 0.005070303101092577, - "children": [ - { - "function": "", - "file_path_short": "encodings/idna.py", - "file_path": "/usr/local/bin/../../../Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/idna.py", - "line_no": 3, - "time": 0.003020904026925564, - "children": [ - { - "function": "", - "file_path_short": "stringprep.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/stringprep.py", - "line_no": 6, - "time": 0.003020904026925564, - "children": [], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - }, - { - "function": "encode", - "file_path_short": "encodings/idna.py", - "file_path": "/usr/local/bin/../../../Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/idna.py", - "line_no": 147, - "time": 0.001228300970979035, - "children": [], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - }, - { - "function": "wrap_socket", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 399, - "time": 0.06180405092891306, - "children": [ - { - "function": "__init__", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 723, - "time": 0.06180405092891306, - "children": [ - { - "function": "do_handshake", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 1061, - "time": 0.06180405092891306, - "children": [ - { - "function": "do_handshake", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 687, - "time": 0.06180405092891306, - "children": [], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - }, - { - "function": "__init__", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 1362, - "time": 0.013755977968685329, - "children": [ - { - "function": "create_default_context", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 488, - "time": 0.013755977968685329, - "children": [ - { - "function": "load_default_certs", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 451, - "time": 0.008733766968362033, - "children": [], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - }, - { - "function": "__new__", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 390, - "time": 0.005022211000323296, - "children": [], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - }, - { - "function": "build_opener", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 576, - "time": 0.08672484196722507, - "children": [ - { - "function": "__init__", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 798, - "time": 0.08672484196722507, - "children": [ - { - "function": "getproxies", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 2614, - "time": 0.08672484196722507, - "children": [ - { - "function": "getproxies_macosx_sysconf", - "file_path_short": "urllib/request.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", - "line_no": 2591, - "time": 0.08672484196722507, - "children": [], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - } - ], - "group_id": "1c0ddbac-1f38-49a5-a477-964769188781" - }, - { - "function": "read", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 438, - "time": 0.008414837066084146, - "children": [ - { - "function": "_readall_chunked", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 558, - "time": 0.008414837066084146, - "children": [ - { - "function": "_safe_read", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 596, - "time": 0.006519785965792835, - "children": [ - { - "function": "readinto", - "file_path_short": "socket.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py", - "line_no": 572, - "time": 0.006519785965792835, - "children": [ - { - "function": "recv_into", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 998, - "time": 0.006519785965792835, - "children": [ - { - "function": "read", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 863, - "time": 0.006519785965792835, - "children": [ - { - "function": "read", - "file_path_short": "ssl.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", - "line_no": 624, - "time": 0.006519785965792835, - "children": [], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - }, - { - "function": "_get_chunk_left", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 534, - "time": 0.0018950511002913117, - "children": [ - { - "function": "_close_conn", - "file_path_short": "http/client.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", - "line_no": 400, - "time": 0.0018950511002913117, - "children": [ - { - "function": "close", - "file_path_short": "socket.py", - "file_path": "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py", - "line_no": 649, - "time": 0.0018950511002913117, - "children": [], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ], - "group_id": "bfc83d50-e33d-4da3-9a40-c6daf184e05b" - } - ] - } - ] - }, - "start_time": 1539030238.1377869, - "duration": 1.107295274734497, - "sample_count": 30, - "program": "examples/wikipedia_article_word_count.py", - "cpu_time": 0.580186 -} +{"session": {"start_time": 1714146124.219171, "duration": 0.36963891983032227, "sample_count": 34, "start_call_stack": ["MainThread\u0000\u00007951014976", "\u0000/Users/joerick/Projects/pyinstrument/env/bin/pyinstrument\u00001\u0001l8", "main\u0000/Users/joerick/Projects/pyinstrument/pyinstrument/__main__.py\u000028\u0001l361"], "program": "/Users/joerick/Projects/pyinstrument/env/bin/pyinstrument -o /tmp/basicsession.pyisession examples/wikipedia_article_word_count.py", "cpu_time": 0.043795, "sys_path": ["examples", "/Library/Frameworks/Python.framework/Versions/3.10/lib/python310.zip", "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10", "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/lib-dynload", "/Users/joerick/Projects/pyinstrument/env/lib/python3.10/site-packages", "__editable__.pyinstrument-4.5.1.finder.__path_hook__"]}, "frame_tree": {"identifier": "main\u0000/Users/joerick/Projects/pyinstrument/pyinstrument/__main__.py\u000028","time": 0.368852,"attributes": {"l365": 0.3688524589961162},"children": [{"identifier": "\u0000\u00001","time": 0.368852,"attributes": {"l1": 0.3688524589961162},"children": [{"identifier": "run_path\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py\u0000260","time": 0.368852,"attributes": {"l289": 0.3688524589961162},"children": [{"identifier": "_run_module_code\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py\u000089","time": 0.368852,"attributes": {"l96": 0.3688524589961162},"children": [{"identifier": "_run_code\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py\u000063","time": 0.368852,"attributes": {"l86": 0.3688524589961162},"children": [{"identifier": "\u0000examples/wikipedia_article_word_count.py\u00001","time": 0.368852,"attributes": {"l4": 0.022913833992788568, "l47": 0.3459386250033276},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.022914,"attributes": {"l1027": 0.022913833992788568},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.022914,"attributes": {"l1006": 0.022913833992788568},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.022914,"attributes": {"l688": 0.022913833992788568},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.022914,"attributes": {"cSourceFileLoader": 0.022913833992788568, "l879": 0.0011928339954465628, "l883": 0.021720999997342005},"children": [{"identifier": "get_code\u0000\u0000950","time": 0.001193,"attributes": {"cSourceFileLoader": 0.0011928339954465628, "l1012": 0.0011928339954465628},"children": [{"identifier": "_compile_bytecode\u0000\u0000670","time": 0.001193,"attributes": {"l672": 0.0011928339954465628},"children": [{"identifier": "loads\u0000\u00000","time": 0.001193,"attributes": {},"children": [{"identifier": "[self]","time": 0.001193,"attributes": {},"children": []}]}]}]},{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.021721,"attributes": {"l241": 0.021720999997342005},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u00001","time": 0.021721,"attributes": {"l84": 0.0014454580086749047, "l87": 0.0018273749883519486, "l88": 0.016304000004311092, "l102": 0.0010096670011989772, "l2622": 0.0011344999948050827},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.021721,"attributes": {"l1027": 0.021720999997342005},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.021721,"attributes": {"l1006": 0.0207227079954464, "l992": 0.0009982920018956065},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.003273,"attributes": {"l688": 0.0032728329970268533},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.003273,"attributes": {"cSourceFileLoader": 0.0032728329970268533, "l883": 0.0032728329970268533},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.003273,"attributes": {"l241": 0.0032728329970268533},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/base64.py\u00001","time": 0.001445,"attributes": {"l11": 0.0014454580086749047},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001445,"attributes": {"l1027": 0.0014454580086749047},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001445,"attributes": {"l1006": 0.0014454580086749047},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001445,"attributes": {"l674": 0.0014454580086749047},"children": [{"identifier": "module_from_spec\u0000\u0000564","time": 0.001445,"attributes": {"l571": 0.0014454580086749047},"children": [{"identifier": "create_module\u0000\u00001174","time": 0.001445,"attributes": {"cExtensionFileLoader": 0.0014454580086749047, "l1176": 0.0014454580086749047},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001445,"attributes": {"l241": 0.0014454580086749047},"children": [{"identifier": "create_dynamic\u0000\u00000","time": 0.001445,"attributes": {},"children": [{"identifier": "[self]","time": 0.001445,"attributes": {},"children": []}]}]}]}]}]}]}]}]},{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/hashlib.py\u00001","time": 0.001827,"attributes": {"l170": 0.0018273749883519486},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001827,"attributes": {"l1027": 0.0018273749883519486},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001827,"attributes": {"l1006": 0.0018273749883519486},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001827,"attributes": {"l674": 0.0018273749883519486},"children": [{"identifier": "module_from_spec\u0000\u0000564","time": 0.001827,"attributes": {"l571": 0.0018273749883519486},"children": [{"identifier": "create_module\u0000\u00001174","time": 0.001827,"attributes": {"cExtensionFileLoader": 0.0018273749883519486, "l1176": 0.0018273749883519486},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001827,"attributes": {"l241": 0.0018273749883519486},"children": [{"identifier": "create_dynamic\u0000\u00000","time": 0.001827,"attributes": {},"children": [{"identifier": "[self]","time": 0.001827,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]}]},{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.000998,"attributes": {"l241": 0.0009982920018956065},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.000998,"attributes": {"l1027": 0.0009982920018956065},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.000998,"attributes": {"l1006": 0.0009982920018956065},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.000998,"attributes": {"l688": 0.0009982920018956065},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.000998,"attributes": {"cSourceFileLoader": 0.0009982920018956065, "l883": 0.0009982920018956065},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.000998,"attributes": {"l241": 0.0009982920018956065},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/__init__.py\u00001","time": 0.000998,"attributes": {"l6": 0.0009982920018956065},"children": [{"identifier": "HTTPStatus\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/__init__.py\u00006","time": 0.000998,"attributes": {"l81": 0.0009982920018956065},"children": [{"identifier": "__setitem__\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u000089","time": 0.000998,"attributes": {"c_EnumDict": 0.0009982920018956065, "l98": 0.0009982920018956065},"children": [{"identifier": "_is_private\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u000044","time": 0.000998,"attributes": {"l47": 0.0009982920018956065},"children": [{"identifier": "[self]","time": 0.000998,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]},{"identifier": "_load_unlocked\u0000\u0000664","time": 0.017450,"attributes": {"l688": 0.016315375003614463, "l674": 0.0011344999948050827},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.016315,"attributes": {"cSourceFileLoader": 0.016315375003614463, "l883": 0.016315375003614463},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.016315,"attributes": {"l241": 0.016315375003614463},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u00001","time": 0.015306,"attributes": {"l71": 0.010230291009065695, "l72": 0.000999541996861808, "l1394": 0.004075874996487983},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.015306,"attributes": {"l1027": 0.015305708002415486},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.015306,"attributes": {"l1002": 0.0011912910122191533, "l1006": 0.014114416990196332},"children": [{"identifier": "_find_spec\u0000\u0000921","time": 0.001191,"attributes": {"l945": 0.0011912910122191533},"children": [{"identifier": "find_spec\u0000\u00001431","time": 0.001191,"attributes": {"cPathFinder": 0.0011912910122191533, "l1439": 0.0011912910122191533},"children": [{"identifier": "_get_spec\u0000\u00001399","time": 0.001191,"attributes": {"cPathFinder": 0.0011912910122191533, "l1411": 0.0011912910122191533},"children": [{"identifier": "find_spec\u0000\u00001536","time": 0.001191,"attributes": {"cFileFinder": 0.0011912910122191533, "l1548": 0.0011912910122191533},"children": [{"identifier": "_fill_cache\u0000\u00001587","time": 0.001191,"attributes": {"cFileFinder": 0.0011912910122191533, "l1591": 0.0011912910122191533},"children": [{"identifier": "listdir\u0000\u00000","time": 0.001191,"attributes": {},"children": [{"identifier": "[self]","time": 0.001191,"attributes": {},"children": []}]}]}]}]}]}]},{"identifier": "_load_unlocked\u0000\u0000664","time": 0.014114,"attributes": {"l688": 0.014114416990196332},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.014114,"attributes": {"cSourceFileLoader": 0.014114416990196332, "l883": 0.013037333992542699, "l879": 0.0010770829976536334},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.010039,"attributes": {"l241": 0.01003854199370835},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/parser.py\u00001","time": 0.009039,"attributes": {"l12": 0.009038999996846542},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.009039,"attributes": {"l1027": 0.009038999996846542},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.009039,"attributes": {"l1006": 0.009038999996846542},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.009039,"attributes": {"l688": 0.009038999996846542},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.009039,"attributes": {"cSourceFileLoader": 0.009038999996846542, "l883": 0.009038999996846542},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.009039,"attributes": {"l241": 0.009038999996846542},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/feedparser.py\u00001","time": 0.009039,"attributes": {"l26": 0.0010023340000770986, "l27": 0.007035249989712611, "l32": 0.0010014160070568323},"children": [{"identifier": "_handle_fromlist\u0000\u00001053","time": 0.001002,"attributes": {"l1078": 0.0010023340000770986},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001002,"attributes": {"l241": 0.0010023340000770986},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001002,"attributes": {"l1027": 0.0010023340000770986},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001002,"attributes": {"l1006": 0.0010023340000770986},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001002,"attributes": {"l688": 0.0010023340000770986},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.001002,"attributes": {"cSourceFileLoader": 0.0010023340000770986, "l879": 0.0010023340000770986},"children": [{"identifier": "get_code\u0000\u0000950","time": 0.001002,"attributes": {"cSourceFileLoader": 0.0010023340000770986, "l975": 0.0010023340000770986},"children": [{"identifier": "get_data\u0000\u00001070","time": 0.001002,"attributes": {"cSourceFileLoader": 0.0010023340000770986, "l1074": 0.0010023340000770986},"children": [{"identifier": "BufferedReader.read\u0000\u00000","time": 0.001002,"attributes": {},"children": [{"identifier": "[self]","time": 0.001002,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]},{"identifier": "_find_and_load\u0000\u00001022","time": 0.007035,"attributes": {"l1027": 0.007035249989712611},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.007035,"attributes": {"l1006": 0.007035249989712611},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.007035,"attributes": {"l688": 0.007035249989712611},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.007035,"attributes": {"cSourceFileLoader": 0.007035249989712611, "l883": 0.007035249989712611},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.007035,"attributes": {"l241": 0.007035249989712611},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/_policybase.py\u00001","time": 0.007035,"attributes": {"l7": 0.0019996659975731745, "l9": 0.005035583992139436},"children": [{"identifier": "_handle_fromlist\u0000\u00001053","time": 0.002000,"attributes": {"l1078": 0.0019996659975731745},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.002000,"attributes": {"l241": 0.0019996659975731745},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.002000,"attributes": {"l1027": 0.0019996659975731745},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.002000,"attributes": {"l1006": 0.0019996659975731745},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.002000,"attributes": {"l688": 0.0019996659975731745},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.002000,"attributes": {"cSourceFileLoader": 0.0019996659975731745, "l883": 0.0019996659975731745},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.002000,"attributes": {"l241": 0.0019996659975731745},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/header.py\u00001","time": 0.002000,"attributes": {"l16": 0.0009990829857997596, "l20": 0.001000583011773415},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.000999,"attributes": {"l1027": 0.0009990829857997596},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.000999,"attributes": {"l1006": 0.0009990829857997596},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.000999,"attributes": {"l688": 0.0009990829857997596},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.000999,"attributes": {"cSourceFileLoader": 0.0009990829857997596, "l883": 0.0009990829857997596},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.000999,"attributes": {"l241": 0.0009990829857997596},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/quoprimime.py\u00001","time": 0.000999,"attributes": {"l44": 0.0009990829857997596},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.000999,"attributes": {"l1027": 0.0009990829857997596},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.000999,"attributes": {"l1006": 0.0009990829857997596},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.000999,"attributes": {"l688": 0.0009990829857997596},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.000999,"attributes": {"cSourceFileLoader": 0.0009990829857997596, "l883": 0.0009990829857997596},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.000999,"attributes": {"l241": 0.0009990829857997596},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/string.py\u00001","time": 0.000999,"attributes": {"l146": 0.0009990829857997596},"children": [{"identifier": "__init_subclass__\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/string.py\u000069","time": 0.000999,"attributes": {"cTemplate": 0.0009990829857997596, "l85": 0.0009990829857997596},"children": [{"identifier": "compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py\u0000249","time": 0.000999,"attributes": {"l251": 0.0009990829857997596},"children": [{"identifier": "_compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py\u0000288","time": 0.000999,"attributes": {"l303": 0.0009990829857997596},"children": [{"identifier": "compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_compile.py\u0000783","time": 0.000999,"attributes": {"l788": 0.0009990829857997596},"children": [{"identifier": "parse\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_parse.py\u0000944","time": 0.000999,"attributes": {"l955": 0.0009990829857997596},"children": [{"identifier": "_parse_sub\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_parse.py\u0000436","time": 0.000999,"attributes": {"l444": 0.0009990829857997596},"children": [{"identifier": "_parse\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_parse.py\u0000494","time": 0.000999,"attributes": {"l841": 0.0009990829857997596},"children": [{"identifier": "_parse_sub\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_parse.py\u0000436","time": 0.000999,"attributes": {"l444": 0.0009990829857997596},"children": [{"identifier": "_parse\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_parse.py\u0000494","time": 0.000999,"attributes": {"l512": 0.0009990829857997596},"children": [{"identifier": "get\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_parse.py\u0000255","time": 0.000999,"attributes": {"cTokenizer": 0.0009990829857997596, "l257": 0.0009990829857997596},"children": [{"identifier": "__next\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_parse.py\u0000234","time": 0.000999,"attributes": {"cTokenizer": 0.0009990829857997596, "l249": 0.0009990829857997596},"children": [{"identifier": "[self]","time": 0.000999,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]},{"identifier": "_handle_fromlist\u0000\u00001053","time": 0.001001,"attributes": {"l1078": 0.001000583011773415},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001001,"attributes": {"l241": 0.001000583011773415},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001001,"attributes": {"l1027": 0.001000583011773415},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001001,"attributes": {"l1006": 0.001000583011773415},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001001,"attributes": {"l688": 0.001000583011773415},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.001001,"attributes": {"cSourceFileLoader": 0.001000583011773415, "l883": 0.001000583011773415},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001001,"attributes": {"l241": 0.001000583011773415},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/charset.py\u00001","time": 0.001001,"attributes": {"l18": 0.001000583011773415},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001001,"attributes": {"l1027": 0.001000583011773415},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001001,"attributes": {"l1006": 0.001000583011773415},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001001,"attributes": {"l674": 0.001000583011773415},"children": [{"identifier": "module_from_spec\u0000\u0000564","time": 0.001001,"attributes": {"l577": 0.001000583011773415},"children": [{"identifier": "_init_module_attrs\u0000\u0000492","time": 0.001001,"attributes": {"l556": 0.001000583011773415},"children": [{"identifier": "cached\u0000\u0000391","time": 0.001001,"attributes": {"cModuleSpec": 0.001000583011773415, "l397": 0.001000583011773415},"children": [{"identifier": "_get_cached\u0000\u0000510","time": 0.001001,"attributes": {"l513": 0.001000583011773415},"children": [{"identifier": "cache_from_source\u0000\u0000380","time": 0.001001,"attributes": {"l411": 0.001000583011773415},"children": [{"identifier": "[self]","time": 0.001001,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]},{"identifier": "_find_and_load\u0000\u00001022","time": 0.005036,"attributes": {"l1027": 0.005035583992139436},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.005036,"attributes": {"l1006": 0.005035583992139436},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.005036,"attributes": {"l688": 0.005035583992139436},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.005036,"attributes": {"cSourceFileLoader": 0.005035583992139436, "l879": 0.0010041669884230942, "l883": 0.004031417003716342},"children": [{"identifier": "get_code\u0000\u0000950","time": 0.001004,"attributes": {"cSourceFileLoader": 0.0010041669884230942, "l975": 0.0010041669884230942},"children": [{"identifier": "get_data\u0000\u00001070","time": 0.001004,"attributes": {"cSourceFileLoader": 0.0010041669884230942, "l1073": 0.0010041669884230942},"children": [{"identifier": "open_code\u0000\u00000","time": 0.001004,"attributes": {},"children": [{"identifier": "[self]","time": 0.001004,"attributes": {},"children": []}]}]}]},{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.004031,"attributes": {"l241": 0.004031417003716342},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/utils.py\u00001","time": 0.004031,"attributes": {"l29": 0.0020057920046383515, "l30": 0.0010246250021737069, "l33": 0.0010009999969042838},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.004031,"attributes": {"l1027": 0.004031417003716342},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.004031,"attributes": {"l1006": 0.004031417003716342},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.004031,"attributes": {"l688": 0.004031417003716342},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.004031,"attributes": {"cSourceFileLoader": 0.004031417003716342, "l883": 0.0030067920015426353, "l879": 0.0010246250021737069},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.002006,"attributes": {"l241": 0.0020057920046383515},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/socket.py\u00001","time": 0.002006,"attributes": {"l67": 0.0010028750111814588, "l90": 0.0010029169934568927},"children": [{"identifier": "_get_exports_list\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/os.py\u000044","time": 0.001003,"attributes": {"l48": 0.0010028750111814588},"children": [{"identifier": "dir\u0000\u00000","time": 0.001003,"attributes": {},"children": [{"identifier": "[self]","time": 0.001003,"attributes": {},"children": []}]}]},{"identifier": "_convert_\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u0000536","time": 0.001003,"attributes": {"cIntFlag": 0.0010029169934568927, "l563": 0.0010029169934568927},"children": [{"identifier": "__call__\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u0000359","time": 0.001003,"attributes": {"cIntFlag": 0.0010029169934568927, "l387": 0.0010029169934568927},"children": [{"identifier": "_create_\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u0000483","time": 0.001003,"attributes": {"cIntFlag": 0.0010029169934568927, "l503": 0.0010029169934568927},"children": [{"identifier": "isinstance\u0000\u00000","time": 0.001003,"attributes": {},"children": [{"identifier": "[self]","time": 0.001003,"attributes": {},"children": []}]}]}]}]}]}]},{"identifier": "get_code\u0000\u0000950","time": 0.001025,"attributes": {"cSourceFileLoader": 0.0010246250021737069, "l1012": 0.0010246250021737069},"children": [{"identifier": "_compile_bytecode\u0000\u0000670","time": 0.001025,"attributes": {"l672": 0.0010246250021737069},"children": [{"identifier": "loads\u0000\u00000","time": 0.001025,"attributes": {},"children": [{"identifier": "[self]","time": 0.001025,"attributes": {},"children": []}]}]}]},{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001001,"attributes": {"l241": 0.0010009999969042838},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/_parseaddr.py\u00001","time": 0.001001,"attributes": {"l16": 0.0010009999969042838},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001001,"attributes": {"l1027": 0.0010009999969042838},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001001,"attributes": {"l1002": 0.0010009999969042838},"children": [{"identifier": "_find_spec\u0000\u0000921","time": 0.001001,"attributes": {"l945": 0.0010009999969042838},"children": [{"identifier": "find_spec\u0000\u00001431","time": 0.001001,"attributes": {"cPathFinder": 0.0010009999969042838, "l1439": 0.0010009999969042838},"children": [{"identifier": "_get_spec\u0000\u00001399","time": 0.001001,"attributes": {"cPathFinder": 0.0010009999969042838, "l1411": 0.0010009999969042838},"children": [{"identifier": "find_spec\u0000\u00001536","time": 0.001001,"attributes": {"cFileFinder": 0.0010009999969042838, "l1544": 0.0010009999969042838},"children": [{"identifier": "_path_stat\u0000\u0000140","time": 0.001001,"attributes": {"l147": 0.0010009999969042838},"children": [{"identifier": "stat\u0000\u00000","time": 0.001001,"attributes": {},"children": [{"identifier": "[self]","time": 0.001001,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]},{"identifier": "compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py\u0000249","time": 0.001001,"attributes": {"l251": 0.0010014160070568323},"children": [{"identifier": "_compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py\u0000288","time": 0.001001,"attributes": {"l303": 0.0010014160070568323},"children": [{"identifier": "compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_compile.py\u0000783","time": 0.001001,"attributes": {"l792": 0.0010014160070568323},"children": [{"identifier": "_code\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_compile.py\u0000622","time": 0.001001,"attributes": {"l631": 0.0010014160070568323},"children": [{"identifier": "_compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_compile.py\u000087","time": 0.001001,"attributes": {"l184": 0.0010014160070568323},"children": [{"identifier": "_compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_compile.py\u000087","time": 0.001001,"attributes": {"l227": 0.0010014160070568323},"children": [{"identifier": "[self]","time": 0.001001,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]}]}]}]},{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/message.py\u00001","time": 0.001000,"attributes": {"l19": 0.000999541996861808},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001000,"attributes": {"l1027": 0.000999541996861808},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001000,"attributes": {"l1006": 0.000999541996861808},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001000,"attributes": {"l688": 0.000999541996861808},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.001000,"attributes": {"cSourceFileLoader": 0.000999541996861808, "l883": 0.000999541996861808},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001000,"attributes": {"l241": 0.000999541996861808},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/_encoded_words.py\u00001","time": 0.001000,"attributes": {"l64": 0.000999541996861808},"children": [{"identifier": "compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py\u0000249","time": 0.001000,"attributes": {"l251": 0.000999541996861808},"children": [{"identifier": "_compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py\u0000288","time": 0.001000,"attributes": {"l303": 0.000999541996861808},"children": [{"identifier": "compile\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_compile.py\u0000783","time": 0.001000,"attributes": {"l792": 0.000999541996861808},"children": [{"identifier": "_code\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_compile.py\u0000622","time": 0.001000,"attributes": {"l628": 0.000999541996861808},"children": [{"identifier": "_compile_info\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_compile.py\u0000560","time": 0.001000,"attributes": {"l564": 0.000999541996861808},"children": [{"identifier": "getwidth\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/sre_parse.py\u0000175","time": 0.001000,"attributes": {"cSubPattern": 0.000999541996861808, "l221": 0.000999541996861808},"children": [{"identifier": "min\u0000\u00000","time": 0.001000,"attributes": {},"children": [{"identifier": "[self]","time": 0.001000,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]},{"identifier": "get_code\u0000\u0000950","time": 0.001077,"attributes": {"cSourceFileLoader": 0.0010770829976536334, "l1012": 0.0010770829976536334},"children": [{"identifier": "_compile_bytecode\u0000\u0000670","time": 0.001077,"attributes": {"l672": 0.0010770829976536334},"children": [{"identifier": "loads\u0000\u00000","time": 0.001077,"attributes": {},"children": [{"identifier": "[self]","time": 0.001077,"attributes": {},"children": []}]}]}]},{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.002999,"attributes": {"l241": 0.002998791998834349},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u00001","time": 0.002999,"attributes": {"l123": 0.0009988749952754006, "l143": 0.0009998340101446956, "l224": 0.001000082993414253},"children": [{"identifier": "_convert_\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u0000536","time": 0.001999,"attributes": {"cIntEnum": 0.0009988749952754006, "l553": 0.0019987090054200962, "cIntFlag": 0.0009998340101446956},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u0000553","time": 0.001999,"attributes": {"l556": 0.0019987090054200962},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u0000125","time": 0.000999,"attributes": {"l125": 0.0009988749952754006},"children": [{"identifier": "[self]","time": 0.000999,"attributes": {},"children": []}]},{"identifier": "[self]","time": 0.001000,"attributes": {},"children": []}]}]},{"identifier": "_TLSMessageType\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u0000224","time": 0.001000,"attributes": {"l242": 0.001000082993414253},"children": [{"identifier": "__setitem__\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u000089","time": 0.001000,"attributes": {"c_EnumDict": 0.001000082993414253, "l137": 0.001000082993414253},"children": [{"identifier": "_is_descriptor\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/enum.py\u000012","time": 0.001000,"attributes": {"l19": 0.001000082993414253},"children": [{"identifier": "[self]","time": 0.001000,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]},{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/error.py\u00001","time": 0.001010,"attributes": {"l14": 0.0010096670011989772},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001010,"attributes": {"l1027": 0.0010096670011989772},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001010,"attributes": {"l1006": 0.0010096670011989772},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001010,"attributes": {"l688": 0.0010096670011989772},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.001010,"attributes": {"cSourceFileLoader": 0.0010096670011989772, "l879": 0.0010096670011989772},"children": [{"identifier": "get_code\u0000\u0000950","time": 0.001010,"attributes": {"cSourceFileLoader": 0.0010096670011989772, "l975": 0.0010096670011989772},"children": [{"identifier": "get_data\u0000\u00001070","time": 0.001010,"attributes": {"cSourceFileLoader": 0.0010096670011989772, "l1073": 0.0010096670011989772},"children": [{"identifier": "open_code\u0000\u00000","time": 0.001010,"attributes": {},"children": [{"identifier": "[self]","time": 0.001010,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]},{"identifier": "module_from_spec\u0000\u0000564","time": 0.001134,"attributes": {"l571": 0.0011344999948050827},"children": [{"identifier": "create_module\u0000\u00001174","time": 0.001134,"attributes": {"cExtensionFileLoader": 0.0011344999948050827, "l1176": 0.0011344999948050827},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001134,"attributes": {"l241": 0.0011344999948050827},"children": [{"identifier": "create_dynamic\u0000\u00000","time": 0.001134,"attributes": {},"children": [{"identifier": "[self]","time": 0.001134,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]}]}]}]},{"identifier": "main\u0000examples/wikipedia_article_word_count.py\u000039","time": 0.345939,"attributes": {"l40": 0.3439043750113342, "l43": 0.00203424999199342},"children": [{"identifier": "download\u0000examples/wikipedia_article_word_count.py\u000015","time": 0.343904,"attributes": {"l16": 0.3439043750113342},"children": [{"identifier": "urlopen\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u0000139","time": 0.340578,"attributes": {"l213": 0.0041056660120375454, "l216": 0.33647266699699685},"children": [{"identifier": "build_opener\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u0000569","time": 0.004106,"attributes": {"l597": 0.0041056660120375454},"children": [{"identifier": "__init__\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u0000795","time": 0.004106,"attributes": {"cProxyHandler": 0.0041056660120375454, "l797": 0.0041056660120375454},"children": [{"identifier": "getproxies\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u00002651","time": 0.004106,"attributes": {"l2652": 0.0041056660120375454},"children": [{"identifier": "getproxies_macosx_sysconf\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u00002628","time": 0.004106,"attributes": {"l2634": 0.0041056660120375454},"children": [{"identifier": "_get_proxies\u0000\u00000","time": 0.004106,"attributes": {},"children": [{"identifier": "[self]","time": 0.004106,"attributes": {},"children": []}]}]}]}]}]},{"identifier": "open\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u0000500","time": 0.336473,"attributes": {"cOpenerDirector": 0.33647266699699685, "l519": 0.33647266699699685},"children": [{"identifier": "_open\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u0000529","time": 0.336473,"attributes": {"cOpenerDirector": 0.33647266699699685, "l536": 0.33647266699699685},"children": [{"identifier": "_call_chain\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u0000489","time": 0.336473,"attributes": {"cOpenerDirector": 0.33647266699699685, "l496": 0.33647266699699685},"children": [{"identifier": "https_open\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u00001390","time": 0.336473,"attributes": {"cHTTPSHandler": 0.33647266699699685, "l1391": 0.33647266699699685},"children": [{"identifier": "do_open\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u00001307","time": 0.336473,"attributes": {"cHTTPSHandler": 0.33647266699699685, "l1317": 0.006489416991826147, "l1348": 0.05618095799582079, "l1352": 0.2728026250115363, "l1364": 0.0009996669978136197},"children": [{"identifier": "__init__\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u00001405","time": 0.006489,"attributes": {"cHTTPSConnection": 0.006489416991826147, "l1421": 0.006489416991826147},"children": [{"identifier": "create_default_context\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u0000741","time": 0.006489,"attributes": {"l757": 0.0013564999972004443, "l771": 0.0051329169946257025},"children": [{"identifier": "__new__\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u0000488","time": 0.001356,"attributes": {"cSSLContext": 0.0013564999972004443, "l496": 0.0013564999972004443},"children": [{"identifier": "_SSLContext.__new__\u0000\u00000","time": 0.001356,"attributes": {},"children": [{"identifier": "[self]","time": 0.001356,"attributes": {},"children": []}]}]},{"identifier": "load_default_certs\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u0000587","time": 0.005133,"attributes": {"cSSLContext": 0.0051329169946257025, "l593": 0.0051329169946257025},"children": [{"identifier": "SSLContext.set_default_verify_paths\u0000\u00000","time": 0.005133,"attributes": {},"children": [{"identifier": "[self]","time": 0.005133,"attributes": {},"children": []}]}]}]}]},{"identifier": "request\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u00001279","time": 0.056181,"attributes": {"cHTTPSConnection": 0.05618095799582079, "l1282": 0.05618095799582079},"children": [{"identifier": "_send_request\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u00001284","time": 0.056181,"attributes": {"cHTTPSConnection": 0.05618095799582079, "l1328": 0.05618095799582079},"children": [{"identifier": "endheaders\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u00001266","time": 0.056181,"attributes": {"cHTTPSConnection": 0.05618095799582079, "l1277": 0.05618095799582079},"children": [{"identifier": "_send_output\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u00001028","time": 0.056181,"attributes": {"cHTTPSConnection": 0.05618095799582079, "l1037": 0.05618095799582079},"children": [{"identifier": "send\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000967","time": 0.056181,"attributes": {"cHTTPSConnection": 0.05618095799582079, "l975": 0.05618095799582079},"children": [{"identifier": "connect\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u00001444","time": 0.056181,"attributes": {"cHTTPSConnection": 0.05618095799582079, "l1447": 0.024792833006358705, "l1454": 0.031388124989462085},"children": [{"identifier": "connect\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000938","time": 0.024793,"attributes": {"cHTTPSConnection": 0.024792833006358705, "l941": 0.024792833006358705},"children": [{"identifier": "create_connection\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/socket.py\u0000808","time": 0.024793,"attributes": {"l824": 0.0035707500064745545, "l833": 0.02122208299988415},"children": [{"identifier": "getaddrinfo\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/socket.py\u0000938","time": 0.003571,"attributes": {"l955": 0.0035707500064745545},"children": [{"identifier": "search_function\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/encodings/__init__.py\u000071","time": 0.001005,"attributes": {"l99": 0.0010052500001620501},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001005,"attributes": {"l1027": 0.0010052500001620501},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001005,"attributes": {"l1006": 0.0010052500001620501},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001005,"attributes": {"l688": 0.0010052500001620501},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.001005,"attributes": {"cSourceFileLoader": 0.0010052500001620501, "l883": 0.0010052500001620501},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001005,"attributes": {"l241": 0.0010052500001620501},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/encodings/idna.py\u00001","time": 0.001005,"attributes": {"l3": 0.0010052500001620501},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001005,"attributes": {"l1027": 0.0010052500001620501},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001005,"attributes": {"l1006": 0.0010052500001620501},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001005,"attributes": {"l688": 0.0010052500001620501},"children": [{"identifier": "exec_module\u0000\u0000877","time": 0.001005,"attributes": {"cSourceFileLoader": 0.0010052500001620501, "l883": 0.0010052500001620501},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001005,"attributes": {"l241": 0.0010052500001620501},"children": [{"identifier": "\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/stringprep.py\u00001","time": 0.001005,"attributes": {"l8": 0.0010052500001620501},"children": [{"identifier": "_find_and_load\u0000\u00001022","time": 0.001005,"attributes": {"l1027": 0.0010052500001620501},"children": [{"identifier": "_find_and_load_unlocked\u0000\u0000987","time": 0.001005,"attributes": {"l1006": 0.0010052500001620501},"children": [{"identifier": "_load_unlocked\u0000\u0000664","time": 0.001005,"attributes": {"l674": 0.0010052500001620501},"children": [{"identifier": "module_from_spec\u0000\u0000564","time": 0.001005,"attributes": {"l571": 0.0010052500001620501},"children": [{"identifier": "create_module\u0000\u00001174","time": 0.001005,"attributes": {"cExtensionFileLoader": 0.0010052500001620501, "l1176": 0.0010052500001620501},"children": [{"identifier": "_call_with_frames_removed\u0000\u0000233","time": 0.001005,"attributes": {"l241": 0.0010052500001620501},"children": [{"identifier": "create_dynamic\u0000\u00000","time": 0.001005,"attributes": {},"children": [{"identifier": "[self]","time": 0.001005,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]}]},{"identifier": "getaddrinfo\u0000\u00000","time": 0.002566,"attributes": {},"children": [{"identifier": "[self]","time": 0.002566,"attributes": {},"children": []}]}]},{"identifier": "socket.connect\u0000\u00000","time": 0.021222,"attributes": {},"children": [{"identifier": "[self]","time": 0.021222,"attributes": {},"children": []}]}]}]},{"identifier": "wrap_socket\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u0000507","time": 0.031388,"attributes": {"cSSLContext": 0.031388124989462085, "l513": 0.031388124989462085},"children": [{"identifier": "_create\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u00001014","time": 0.031388,"attributes": {"cSSLSocket": 0.031388124989462085, "l1071": 0.031388124989462085},"children": [{"identifier": "do_handshake\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u00001335","time": 0.031388,"attributes": {"cSSLSocket": 0.031388124989462085, "l1342": 0.031388124989462085},"children": [{"identifier": "_SSLSocket.do_handshake\u0000\u00000","time": 0.031388,"attributes": {},"children": [{"identifier": "[self]","time": 0.031388,"attributes": {},"children": []}]}]}]}]}]}]}]}]}]}]},{"identifier": "getresponse\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u00001330","time": 0.272803,"attributes": {"cHTTPSConnection": 0.2728026250115363, "l1374": 0.2728026250115363},"children": [{"identifier": "begin\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000311","time": 0.272803,"attributes": {"cHTTPResponse": 0.2728026250115363, "l318": 0.27182820900634397, "l337": 0.0009744160051923245},"children": [{"identifier": "_read_status\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000278","time": 0.271828,"attributes": {"cHTTPResponse": 0.27182820900634397, "l279": 0.27182820900634397},"children": [{"identifier": "readinto\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/socket.py\u0000691","time": 0.271828,"attributes": {"cSocketIO": 0.27182820900634397, "l705": 0.27182820900634397},"children": [{"identifier": "recv_into\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u00001263","time": 0.271828,"attributes": {"cSSLSocket": 0.27182820900634397, "l1274": 0.27182820900634397},"children": [{"identifier": "read\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py\u00001121","time": 0.271828,"attributes": {"cSSLSocket": 0.27182820900634397, "l1130": 0.27182820900634397},"children": [{"identifier": "_SSLSocket.read\u0000\u00000","time": 0.271828,"attributes": {},"children": [{"identifier": "[self]","time": 0.271828,"attributes": {},"children": []}]}]}]}]}]},{"identifier": "parse_headers\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000224","time": 0.000974,"attributes": {"l236": 0.0009744160051923245},"children": [{"identifier": "parsestr\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/parser.py\u000059","time": 0.000974,"attributes": {"cParser": 0.0009744160051923245, "l67": 0.0009744160051923245},"children": [{"identifier": "parse\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/parser.py\u000041","time": 0.000974,"attributes": {"cParser": 0.0009744160051923245, "l56": 0.0009744160051923245},"children": [{"identifier": "feed\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/feedparser.py\u0000173","time": 0.000974,"attributes": {"cFeedParser": 0.0009744160051923245, "l175": 0.0009744160051923245},"children": [{"identifier": "push\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/email/feedparser.py\u0000101","time": 0.000974,"attributes": {"cBufferedSubFile": 0.0009744160051923245, "l110": 0.0009744160051923245},"children": [{"identifier": "StringIO.readlines\u0000\u00000","time": 0.000974,"attributes": {},"children": [{"identifier": "[self]","time": 0.000974,"attributes": {},"children": []}]}]}]}]}]}]}]}]},{"identifier": "get_full_url\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u0000387","time": 0.001000,"attributes": {"cRequest": 0.0009996669978136197, "l388": 0.0009996669978136197},"children": [{"identifier": "full_url\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py\u0000337","time": 0.001000,"attributes": {"cRequest": 0.0009996669978136197, "l341": 0.0009996669978136197},"children": [{"identifier": "[self]","time": 0.001000,"attributes": {},"children": []}]}]}]}]}]}]}]}]},{"identifier": "read\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000450","time": 0.003326,"attributes": {"cHTTPResponse": 0.0033260420022998005, "l459": 0.0033260420022998005},"children": [{"identifier": "_read_chunked\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000577","time": 0.003326,"attributes": {"cHTTPResponse": 0.0033260420022998005, "l582": 0.0033260420022998005},"children": [{"identifier": "_get_chunk_left\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000553","time": 0.003326,"attributes": {"cHTTPResponse": 0.0033260420022998005, "l572": 0.0033260420022998005},"children": [{"identifier": "_close_conn\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py\u0000412","time": 0.003326,"attributes": {"cHTTPResponse": 0.0033260420022998005, "l415": 0.0033260420022998005},"children": [{"identifier": "close\u0000/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/socket.py\u0000768","time": 0.003326,"attributes": {"cSocketIO": 0.0033260420022998005, "l776": 0.0033260420022998005},"children": [{"identifier": "[self]","time": 0.003326,"attributes": {},"children": []}]}]}]}]}]}]},{"identifier": "most_common_words\u0000examples/wikipedia_article_word_count.py\u000023","time": 0.002034,"attributes": {"l30": 0.00203424999199342},"children": [{"identifier": "[self]","time": 0.001001,"attributes": {},"children": []},{"identifier": "[self]","time": 0.001033,"attributes": {},"children": []}]}]}]}]}]}]}]}]}} diff --git a/html_renderer/src/App.svelte b/html_renderer/src/App.svelte index 7b74b7b8..5b7e75e8 100644 --- a/html_renderer/src/App.svelte +++ b/html_renderer/src/App.svelte @@ -1,10 +1,10 @@ + +
+ {#if !rootFrame} +
+ All frames were filtered out. +
+ {:else} + + {/if} +
+ + diff --git a/html_renderer/src/lib/appState.ts b/html_renderer/src/lib/appState.ts index 1fb76d0d..7f53949a 100644 --- a/html_renderer/src/lib/appState.ts +++ b/html_renderer/src/lib/appState.ts @@ -1,5 +1,5 @@ import { writable } from 'svelte/store' -import type Group from './model/Group' +import type FrameGroup from './model/FrameGroup' export const visibleGroups = writable<{[id: string]: boolean}>({}) export const timeFormat = writable<'absolute'|'proportion'>('absolute') diff --git a/html_renderer/src/lib/dataTypes.ts b/html_renderer/src/lib/dataTypes.ts index 5e2af21a..6925052e 100644 --- a/html_renderer/src/lib/dataTypes.ts +++ b/html_renderer/src/lib/dataTypes.ts @@ -1,21 +1,19 @@ export interface SessionData { - start_time: number; - duration: number; - sample_count: number; - program: string; - cpu_time: number | null; - root_frame: FrameData | null; + session: { + start_time: number; + duration: number; + sample_count: number; + start_call_stack: string[], + program: string; + cpu_time: number; + sys_path: string; + }; + frame_tree: FrameData; } export interface FrameData { - function: string; - file_path: string; - file_path_short: string; - line_no: number; + identifier: string; time: number; - await_time: number; - is_application_code: boolean; + attributes: {[name: string]: number}; children: FrameData[]; - group_id?: string; - class_name?: string; } diff --git a/html_renderer/src/lib/model/Frame.ts b/html_renderer/src/lib/model/Frame.ts index 4fbec5a5..bfcb2de3 100644 --- a/html_renderer/src/lib/model/Frame.ts +++ b/html_renderer/src/lib/model/Frame.ts @@ -1,60 +1,201 @@ -import Group from './Group'; -import type {FrameData} from '../dataTypes'; +import type FrameGroup from './FrameGroup'; +// import type { FrameData } from '../dataTypes'; + +export interface FrameData { + identifier: string, + time?: number + attributes?: {[name: string]: number}, + children?: readonly FrameData[], +} + + +const IDENTIFIER_SEP = "\x00" +const ATTRIBUTES_SEP = "\x01" + +export const AWAIT_FRAME_IDENTIFIER = "[await]" +export const SELF_TIME_FRAME_IDENTIFIER = "[self]" +export const OUT_OF_CONTEXT_FRAME_IDENTIFIER = "[out-of-context]" +export const DUMMY_ROOT_FRAME_IDENTIFIER = "[root]" + +export const SYNTHETIC_FRAME_IDENTIFIERS = [ + AWAIT_FRAME_IDENTIFIER, + SELF_TIME_FRAME_IDENTIFIER, + OUT_OF_CONTEXT_FRAME_IDENTIFIER, + DUMMY_ROOT_FRAME_IDENTIFIER, +] + +export const SYNTHETIC_LEAF_IDENTIFIERS = [ + AWAIT_FRAME_IDENTIFIER, + SELF_TIME_FRAME_IDENTIFIER, + OUT_OF_CONTEXT_FRAME_IDENTIFIER, +] + +const ATTRIBUTE_MARKER_CLASS_NAME = "c" +const ATTRIBUTE_MARKER_LINE_NUMBER = "l" +const ATTRIBUTE_MARKER_TRACEBACKHIDE = "h" + export default class Frame { - function: string; - filePath: string; - filePathShort: string; - lineNo: number; - time: number; - totalTime: number; - awaitTime: number; - isApplicationCode: boolean; - groupId: string | null; - className: string | null; - - parent: Frame | null; - children: Frame[]; - - group: Group | null; - - constructor(jsonObject: FrameData, parent: Frame|null = null, context: FrameContext = {groups:{}}) { - this.parent = parent - this.function = jsonObject.function; - this.filePath = jsonObject.file_path; - this.filePathShort = jsonObject.file_path_short; - this.lineNo = jsonObject.line_no; - this.time = jsonObject.time; - this.totalTime = this.parent ? this.parent.totalTime : this.time; - this.awaitTime = jsonObject.await_time; - this.isApplicationCode = jsonObject.is_application_code; - this.groupId = jsonObject.group_id ?? null; - this.className = jsonObject.class_name ?? null; - - if (jsonObject.group_id) { - const groupId = jsonObject.group_id; - let group = context.groups[groupId] - if (!group) { - group = context.groups[groupId] = new Group(groupId, this); - } - group.addFrame(this); - this.group = context.groups[groupId]; - } else { - this.group = null; - } - - this.children = jsonObject.children.map(f => new Frame(f, this, context)); - } - - get identifier() { - return `${this.function}:${this.filePath}:${this.lineNo}`; - } - - get proportionOfTotal() { - return this.time / this.totalTime; - } + identifier: string + _identifierParts: string[] + time: number = 0 + absorbedTime: number = 0 + group: FrameGroup|null = null + attributes: {[name: string]: number} + _children: Frame[] = [] + parent: Frame | null = null + + context: FrameContext + + constructor( + data: FrameData, + context: FrameContext, + ) { + this.identifier = data.identifier + this._identifierParts = this.identifier.split(IDENTIFIER_SEP) + this.time = data.time ?? 0 + this.attributes = data.attributes ?? {} + this.context = context + + const children = data.children?.map(f => new Frame(f, context)); + if (children) { + this.addChildren(children) + } + } + + cloneDeep(): Frame { + return new Frame(this, this.context) + } + + get children(): readonly Frame[] { + return this._children + } + + addChild(frame: Frame, options: {after?: Frame} = {}) { + frame.removeFromParent() + frame.parent = this + if (options.after) { + const index = this._children.indexOf(options.after) + this._children.splice(index+1, 0, frame) + } else { + this._children.push(frame) + } + } + + addChildren(frames: readonly Frame[], options: {after?: Frame} = {}) { + if (options.after) { + const reversed = frames.slice() + reversed.reverse() + frames.forEach(f => this.addChild(f, options)) + } else { + frames.forEach(f => this.addChild(f, options)) + } + } + + removeFromParent() { + if (this.parent) { + const idx = this.parent._children.indexOf(this) + this.parent._children.splice(idx, 1) + this.parent = null + } + } + + getAttributes(marker: string): {data: string, time: number}[] { + const keys = Object.keys(this.attributes).filter(k => k.startsWith(marker)) + return keys.map(k => ( + {data: k.slice(1), time: this.attributes[k]} + )) + } + + getAttributeValue(marker: string) { + const attributes = this.getAttributes(marker) + if (!attributes) return null + if (attributes.length == 0) return null + + let maxIdx = 0 + for (let i = 0; i < attributes.length; i++) { + if (attributes[i].time > attributes[maxIdx].time) { + maxIdx = i + } + } + + return attributes[maxIdx].data + } + + get hasTracebackhide(): boolean { + return this.getAttributeValue(ATTRIBUTE_MARKER_TRACEBACKHIDE) == '1' + } + + get function(): string { + return this._identifierParts[0] + } + + get filePath(): string | null { + return this._identifierParts[1] ?? null + } + + get lineNo(): number | null { + const lineNo = this._identifierParts[2] + return lineNo ? parseInt(lineNo) : null + } + + get isSynthetic(): boolean { + return SYNTHETIC_FRAME_IDENTIFIERS.includes(this.identifier) + } + + get filePathShort(): string | null { + if (this.isSynthetic && this.parent) { + return this.parent.filePathShort + } + + if (!this.filePath) return null + + return this.context.shortenPath(this.filePath) + } + + get isApplicationCode(): boolean { + if (this.isSynthetic) { + return false; + } + + const filePath = this.filePath; + + if (!filePath) { + return false; + } + + const libPaths = ["/lib/", "\\lib\\"]; + if (libPaths.some(path => filePath.includes(path))) { + return false; + } + + if (filePath.startsWith("<")) { + if (filePath.startsWith(" 1) { + for (const sysPathEntry of this.sysPath) { + const candidate = getRelPath(path, sysPathEntry) + if (pathSplit(candidate).length < pathSplit(result).length) { + result = candidate + } + } + } + + this._shortenPathCache[path] = result + return result + } +} + +function pathSplit(path: string): string[] { + return path.split(/[/\\]/) +} + +function getPathDrive(path: string): string | null { + const parts = pathSplit(path) + if (parts.length > 0 && parts[0].endsWith(":")) { + return parts[0] + } else { + return null + } +} + +function getRelPath(path: string, start: string): string { + // returns the relative path from start to path + // e.g. getRelPath("/a/b/c", "/a") -> "b/c" + // e.g. getRelPath("/a/b/c", "/a/d/e") -> "../../b/c" + + if (getPathDrive(path) != getPathDrive(start)) { + // different drives, can't make a relative path + return path + } + + const parts = pathSplit(path) + const startParts = pathSplit(start) + let i = 0 + while (i < parts.length && i < startParts.length && parts[i] == startParts[i]) { + i++ + } + const relParts = startParts.slice(i).map(_ => "..") + + return relParts.concat(parts.slice(i)).join("/") } diff --git a/html_renderer/src/lib/model/frameOps.ts b/html_renderer/src/lib/model/frameOps.ts new file mode 100644 index 00000000..bf6bbcfb --- /dev/null +++ b/html_renderer/src/lib/model/frameOps.ts @@ -0,0 +1,78 @@ +import { UnreachableCaseError } from "../utils"; +import Frame from "./Frame"; +import { SELF_TIME_FRAME_IDENTIFIER } from "./Frame"; + +export function deleteFrameFromTree(frame: Frame, options: {replaceWith: 'children'|'self_time'|'nothing'}) { + const {replaceWith} = options + const parent = frame.parent + if (!parent) { + throw new Error('Cannot delete the root frame') + } + + if (replaceWith == 'children') { + parent.addChildren(frame.children, {after: frame}) + } else if (replaceWith == 'self_time') { + parent.addChild( + new Frame({identifier: SELF_TIME_FRAME_IDENTIFIER}, parent.context), + ) + } else if (replaceWith == 'nothing') { + parent.absorbedTime += frame.time + } else { + throw new UnreachableCaseError(replaceWith) + } + + frame.removeFromParent() + removeFrameFromGroups(frame, true) +} + +/** + * Combines two frames into one. The frames must have the same parent. + * + * @param frame The frame to remove. + * @param into The frame to combine into. + */ +export function combineFrames(frame: Frame, into: Frame): void { + if (frame.parent !== into.parent) { + throw new Error("Both frames must have the same parent."); + } + + into.absorbedTime += frame.absorbedTime; + into.time += frame.time; + + Object.entries(frame.attributes).forEach(([attribute, time]) => { + if (into.attributes[attribute] !== undefined) { + into.attributes[attribute] += time; + } else { + into.attributes[attribute] = time; + } + }); + + into.addChildren(frame.children); + frame.removeFromParent(); + removeFrameFromGroups(frame, false); +} + +/** + * Removes a frame from any groups that it is a member of. Should be used when + * removing a frame from a tree, so groups don't keep references to removed frames. + * + * @param frame The frame to be removed from groups. + * @param recursive Whether to also remove all child frames from their groups. + */ +export function removeFrameFromGroups(frame: Frame, recursive: boolean): void { + if (recursive && frame.children) { + frame.children.forEach(child => { + removeFrameFromGroups(child, true); + }); + } + + if (frame.group) { + const group = frame.group; + group.removeFrame(frame); + + if (group.frames.length === 1) { + // A group with only one frame is meaningless; remove it entirely. + group.removeFrame(group.frames[0]); + } + } +} diff --git a/html_renderer/src/lib/model/processors.ts b/html_renderer/src/lib/model/processors.ts new file mode 100644 index 00000000..317c6708 --- /dev/null +++ b/html_renderer/src/lib/model/processors.ts @@ -0,0 +1,239 @@ +import type Frame from "./Frame"; +import { SELF_TIME_FRAME_IDENTIFIER } from "./Frame"; +import FrameGroup from "./FrameGroup"; +import { combineFrames, deleteFrameFromTree } from './frameOps' + +export type ProcessorOptions = Record +export type ProcessorFunction = (frame: Frame | null, options: ProcessorOptions) => Frame | null + +/** + * Removes `` = {}; + + for (const child of frame.children.slice()) { + if (childrenByIdentifier[child.identifier]) { + const aggregateFrame = childrenByIdentifier[child.identifier]; + combineFrames(child, aggregateFrame); + } else { + childrenByIdentifier[child.identifier] = child; + } + } + + frame.children.forEach(child => aggregate_repeated_calls(child, options)); + frame._children.sort((a, b) => b.time - a.time); + + return frame; +} + +/** + * Groups frames that should be hidden into FrameGroup objects, + * according to `hide_regex` and `show_regex` in the options dictionary. + */ +export function group_library_frames_processor(frame: Frame | null, options: ProcessorOptions): Frame | null { + if (!frame) { + return null; + } + + const hideRegex = options.hideRegex; + const showRegex = options.showRegex; + + function shouldHide(frame: Frame): boolean { + const filePath = frame.filePath || ""; + const show = showRegex && new RegExp(showRegex).test(filePath); + const hide = hideRegex && new RegExp(hideRegex).test(filePath); + + if (show) { + return false; + } + if (hide) { + return true; + } + return !frame.isApplicationCode + } + + function addFramesToGroup(frame: Frame, group: FrameGroup): void { + group.addFrame(frame); + frame.children.forEach(child => { + if (shouldHide(child)) { + addFramesToGroup(child, group); + } + }); + } + + frame.children.forEach(child => { + if (!child.group && shouldHide(child) && child.children.some(shouldHide)) { + const group = new FrameGroup(child); + addFramesToGroup(child, group); + } + + group_library_frames_processor(child, options); + }); + + return frame; +} + +/** + * Combines consecutive 'self time' frames. + */ +export function merge_consecutive_self_time(frame: Frame | null, options: ProcessorOptions, recursive: boolean = true): Frame | null { + if (!frame) { + return null; + } + + let previousSelfTimeFrame: Frame | null = null; + + for (const child of frame.children) { + if (child.identifier === SELF_TIME_FRAME_IDENTIFIER) { + if (previousSelfTimeFrame) { + previousSelfTimeFrame.time += child.time; + child.removeFromParent(); + } else { + previousSelfTimeFrame = child; + } + } else { + previousSelfTimeFrame = null; + } + } + + if (recursive) { + frame.children.forEach(child => merge_consecutive_self_time(child, options, true)); + } + + return frame; +} + +/** + * Removes unnecessary self-time nodes. + */ +export function remove_unnecessary_self_time_nodes(frame: Frame | null, options: ProcessorOptions): Frame | null { + if (!frame) { + return null; + } + + if (frame.children.length === 1 && frame.children[0].identifier === SELF_TIME_FRAME_IDENTIFIER) { + deleteFrameFromTree(frame.children[0], { replaceWith: "nothing" }); + } + + frame.children.forEach(child => remove_unnecessary_self_time_nodes(child, options)); + + return frame; +} + +/** + * Removes nodes that represent less than a certain percentage of the output. + */ +export function remove_irrelevant_nodes(frame: Frame | null, options: ProcessorOptions, totalTime: number | null = null): Frame | null { + if (!frame) { + return null; + } + + if (totalTime === null) { + totalTime = frame.time; + if (totalTime <= 0) { + totalTime = 1e-44; // Prevent divide by zero + } + } + + const filterThreshold = options.filterThreshold || 0.01; + + for (const child of frame.children.slice()) { + const proportionOfTotal = child.time / totalTime; + if (proportionOfTotal < filterThreshold) { + deleteFrameFromTree(child, { replaceWith: "nothing" }); + } + } + + frame.children.forEach(child => remove_irrelevant_nodes(child, options, totalTime)); + + return frame; +} + +/** + * Removes the initial frames specific to the command line use of pyinstrument. + */ +export function remove_first_pyinstrument_frames_processor(frame: Frame | null, options: ProcessorOptions): Frame | null { + if (!frame) { + return null; + } + + const isInitialPyinstrumentFrame = (f: Frame) => + f.filePath?.includes("pyinstrument/__main__.py") && f.children.length > 0; + + const isExecFrame = (f: Frame) => + f.proportionOfParent > 0.8 && f.filePath?.includes("") && f.children.length > 0; + + const isRunpyFrame = (f: Frame) => + f.proportionOfParent > 0.8 && (new RegExp(".*runpy.py").test(f.filePath ?? '') || f.filePath?.includes("")) && f.children.length > 0; + + let result = frame; + + if (!isInitialPyinstrumentFrame(result)) return frame; + + result = result.children[0]; + + if (!isExecFrame(result)) return frame; + + result = result.children[0]; + + if (!isRunpyFrame(result)) return frame; + + while (isRunpyFrame(result)) { + result = result.children[0]; + } + + result.removeFromParent(); + + return result; +} diff --git a/html_renderer/src/lib/utils.ts b/html_renderer/src/lib/utils.ts new file mode 100644 index 00000000..6f75c37d --- /dev/null +++ b/html_renderer/src/lib/utils.ts @@ -0,0 +1,6 @@ + +export class UnreachableCaseError extends Error { + constructor(value: never) { + super(`Unreachable case: ${value}`) + } +} diff --git a/pyinstrument/frame.py b/pyinstrument/frame.py index f1151ba0..9b155b1d 100644 --- a/pyinstrument/frame.py +++ b/pyinstrument/frame.py @@ -1,10 +1,11 @@ from __future__ import annotations +import json import math import os -import sys +import typing import uuid -from typing import Sequence +from typing import Callable, Sequence from pyinstrument.frame_info import ( ATTRIBUTE_MARKER_CLASS_NAME, @@ -43,6 +44,11 @@ ) +class FrameContext(typing.Protocol): + def shorten_path(self, path: str) -> str: + ... + + class Frame: """ Object that represents a stack frame in the parsed tree @@ -52,6 +58,9 @@ class Frame: group: FrameGroup | None time: float + # if this frame is a root frame, this is the session it belongs to + _context: FrameContext | None + # tracks the time from frames that were deleted during processing absorbed_time: float @@ -62,6 +71,7 @@ def __init__( identifier_or_frame_info: str = "", children: Sequence[Frame] | None = None, time: float = 0, + root_context: FrameContext | None = None, ): identifier = frame_info_get_identifier(identifier_or_frame_info) self.identifier = identifier @@ -69,6 +79,7 @@ def __init__( self.time = 0.0 self.group = None self.absorbed_time = 0.0 + self._context = root_context self._identifier_parts = identifier.split("\x00") self.attributes = {} @@ -98,6 +109,13 @@ def remove_from_parent(self): if self.parent: self.parent._children.remove(self) self.parent = None + self._context = None + + @property + def context(self): + if not self._context: + raise RuntimeError("Frame has no context") + return self._context @staticmethod def new_subclass_with_frame_info(frame_info: str) -> Frame: @@ -150,32 +168,10 @@ def file_path_short(self) -> str | None: if self.is_synthetic and self.parent: return self.parent.file_path_short - if not hasattr(self, "_file_path_short"): - result = None - - if self.file_path: - if len(self.file_path.split(os.sep)) == 1: - # probably not a file path at all, more likely - # or similar - result = self.file_path - else: - for path in sys.path: - # On Windows, if self.file_path and path are on - # different drives, relpath will result in exception, - # because it cannot compute a relpath in this case. - # The root cause is that on Windows, there is no root - # dir like '/' on Linux. - try: - candidate = os.path.relpath(self.file_path, path) - except ValueError: - continue - - if not result or (len(candidate.split(os.sep)) < len(result.split(os.sep))): - result = candidate - - self._file_path_short = result - - return self._file_path_short + if not self.file_path: + return None + + return self.context.shorten_path(self.file_path) @property def is_application_code(self) -> bool: @@ -205,11 +201,11 @@ def is_application_code(self) -> bool: return True - @property def code_position_short(self) -> str | None: - if self.file_path_short and self.line_no: - return "%s:%i" % (self.file_path_short, self.line_no) - return self.file_path_short + file_path_short = self.file_path_short + if file_path_short and self.line_no: + return "%s:%i" % (file_path_short, self.line_no) + return file_path_short _children: list[Frame] attributes: dict[str, float] @@ -226,6 +222,7 @@ def add_child(self, frame: Frame, after: Frame | None = None): frame.remove_from_parent() frame.parent = self + frame._context = self.context if after is None: self._children.append(frame) else: @@ -333,6 +330,23 @@ def __repr__(self): self.group, ) + def to_json_str(self): + # method that converts this object into a JSON string. Uses an inline + # technique because the json module uses 2x stack frames, so we'd get + # a RecursionError on deep stacks. + encode_str = typing.cast(Callable[[str], str], json.encoder.encode_basestring) # type: ignore + + property_decls: list[str] = [] + property_decls.append('"identifier": %s' % encode_str(self.identifier)) + property_decls.append('"time": %f' % self.time) + property_decls.append('"attributes": %s' % json.dumps(self.attributes)) + child_jsons: list[str] = [] + for child in self.children: + child_jsons.append(child.to_json_str()) + property_decls.append('"children": [%s]' % ",".join(child_jsons)) + + return "{%s}" % ",".join(property_decls) + class FrameGroup: _libraries: list[str] | None @@ -354,8 +368,9 @@ def libraries(self) -> list[str]: libraries: list[str] = [] for frame in self.frames: - if frame.file_path_short: - library = frame.file_path_short.split(os.sep)[0] + file_path_short = frame.file_path_short + if file_path_short: + library = file_path_short.split(os.sep)[0] library, _ = os.path.splitext(library) if library and library not in libraries: libraries.append(library) diff --git a/pyinstrument/frame_ops.py b/pyinstrument/frame_ops.py index 11727aae..420eb548 100644 --- a/pyinstrument/frame_ops.py +++ b/pyinstrument/frame_ops.py @@ -2,7 +2,12 @@ from typing import List, Sequence, Tuple -from pyinstrument.frame import DUMMY_ROOT_FRAME_IDENTIFIER, SELF_TIME_FRAME_IDENTIFIER, Frame +from pyinstrument.frame import ( + DUMMY_ROOT_FRAME_IDENTIFIER, + SELF_TIME_FRAME_IDENTIFIER, + Frame, + FrameContext, +) from pyinstrument.frame_info import frame_info_get_identifier from pyinstrument.typing import LiteralStr, assert_never @@ -16,11 +21,13 @@ class IdentifierDoesntMatchException(ValueError): pass -def build_frame_tree(frame_records: Sequence[FrameRecordType]) -> Frame | None: +def build_frame_tree( + frame_records: Sequence[FrameRecordType], context: FrameContext +) -> Frame | None: if len(frame_records) == 0: return None - root_frame = Frame(identifier_or_frame_info=DUMMY_ROOT_FRAME_IDENTIFIER) + root_frame = Frame(identifier_or_frame_info=DUMMY_ROOT_FRAME_IDENTIFIER, root_context=context) # put the root frame at the bottom of the stack frame_stack: list[Frame] = [root_frame] diff --git a/pyinstrument/profiler.py b/pyinstrument/profiler.py index ab1434dd..47972488 100644 --- a/pyinstrument/profiler.py +++ b/pyinstrument/profiler.py @@ -162,6 +162,7 @@ def stop(self) -> Session: program=" ".join(sys.argv), start_call_stack=self._active_session.start_call_stack, cpu_time=cpu_time, + sys_path=sys.path, ) self._active_session = None diff --git a/pyinstrument/renderers/html.py b/pyinstrument/renderers/html.py index 53bf3fa6..f44578cb 100644 --- a/pyinstrument/renderers/html.py +++ b/pyinstrument/renderers/html.py @@ -1,21 +1,20 @@ from __future__ import annotations import codecs +import json import tempfile import urllib.parse import webbrowser from pathlib import Path from typing import Any -from pyinstrument import processors -from pyinstrument.renderers.base import FrameRenderer, ProcessorList -from pyinstrument.renderers.jsonrenderer import JSONRenderer +from pyinstrument.renderers.base import Renderer from pyinstrument.session import Session # pyright: strict -class HTMLRenderer(FrameRenderer): +class HTMLRenderer(Renderer): """ Renders a rich, interactive web page, as a string of HTML. """ @@ -85,19 +84,8 @@ def open_in_browser(self, session: Session, output_filename: str | None = None): return output_filename def render_json(self, session: Session): - json_renderer = JSONRenderer() - json_renderer.processors = self.processors - json_renderer.processor_options = self.processor_options - return json_renderer.render(session) - - def default_processors(self) -> ProcessorList: - return [ - processors.remove_importlib, - processors.remove_tracebackhide, - processors.merge_consecutive_self_time, - processors.aggregate_repeated_calls, - processors.remove_unnecessary_self_time_nodes, - processors.remove_irrelevant_nodes, - processors.remove_first_pyinstrument_frames_processor, - processors.group_library_frames_processor, - ] + session_json = session.to_json(include_frame_records=False) + session_json_str = json.dumps(session_json) + root_frame = session.root_frame() + frame_tree_json_str = root_frame.to_json_str() if root_frame else "null" + return '{"session": %s, "frame_tree": %s}' % (session_json_str, frame_tree_json_str) diff --git a/pyinstrument/renderers/html_resources/app.css b/pyinstrument/renderers/html_resources/app.css index 08874077..92288777 100644 --- a/pyinstrument/renderers/html_resources/app.css +++ b/pyinstrument/renderers/html_resources/app.css @@ -1 +1 @@ -@import"https://fonts.googleapis.com/css?family=Source+Code+Pro:400,600|Source+Sans+Pro:400,600";html,body{background-color:#303538;color:#fff;padding:0;margin:0}.margins{padding:0 30px}.header.svelte-tewt95{background:#292f32}.row.svelte-tewt95{display:flex;align-items:center}.title.svelte-tewt95{font-size:34px;padding-top:20px;padding-bottom:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:10px;flex:1}.metrics.svelte-tewt95{display:grid;grid-template-columns:auto auto auto auto auto auto;font-size:14px;text-transform:uppercase;grid-gap:1px 8px}.metric-label.svelte-tewt95{font-weight:600;color:#a9abad}.metric-value.svelte-tewt95{color:#737779;margin-right:.5em}.frame.svelte-1aphj50.svelte-1aphj50{font-family:Source Code Pro,Roboto Mono,Consolas,Monaco,monospace;font-size:15px;z-index:0;position:relative;user-select:none}.group-header.svelte-1aphj50.svelte-1aphj50{margin-left:35px}.group-header-button.svelte-1aphj50.svelte-1aphj50{display:inline-block;color:#ffffff94;user-select:none;cursor:default;position:relative}.group-header-button.svelte-1aphj50.svelte-1aphj50:before{position:absolute;left:-3px;right:-3px;top:0px;bottom:-1px;content:"";z-index:-1;background-color:#3b4043}.group-header-button.svelte-1aphj50.svelte-1aphj50:hover:before{background-color:#4a4f54}.group-triangle.svelte-1aphj50.svelte-1aphj50,.frame-triangle.svelte-1aphj50.svelte-1aphj50{width:6px;height:10px;padding-left:6px;padding-right:5px;display:inline-block}.group-triangle.rotate.svelte-1aphj50.svelte-1aphj50,.frame-triangle.rotate.svelte-1aphj50.svelte-1aphj50{transform:translate(6px,4px) rotate(90deg)}.frame-description.svelte-1aphj50.svelte-1aphj50{display:flex}.frame-description.svelte-1aphj50.svelte-1aphj50:hover:before{position:absolute;left:-3px;right:-3px;top:-1px;height:22px;content:"";z-index:-1;background-color:#354759;opacity:.5}.frame-triangle.svelte-1aphj50.svelte-1aphj50{opacity:1}.frame-description.children-visible.svelte-1aphj50 .frame-triangle.svelte-1aphj50{opacity:0}.frame-description.children-visible.svelte-1aphj50:hover .frame-triangle.svelte-1aphj50{opacity:1}.name.svelte-1aphj50.svelte-1aphj50,.time.svelte-1aphj50.svelte-1aphj50,.code-position.svelte-1aphj50.svelte-1aphj50{user-select:text;cursor:default}.application-code.svelte-1aphj50 .name.svelte-1aphj50{color:#5db3ff}.time.svelte-1aphj50.svelte-1aphj50{margin-right:.55em;color:#b8e98685}.code-position.svelte-1aphj50.svelte-1aphj50{color:#ffffff80;text-align:right;margin-left:1em}.visual-guide{top:21px;bottom:0;left:0;width:2px;background-color:#fff;position:absolute;opacity:.08}.frame-description:hover~.visual-guide{opacity:.4}.frame-description:hover~.children .visual-guide{opacity:.1}.app.svelte-1gm5pcf.svelte-1gm5pcf{font-family:Source Sans Pro,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.program.svelte-1gm5pcf.svelte-1gm5pcf{font-size:14px;font-weight:600;margin-bottom:16px;color:#b4b4b4}.program.svelte-1gm5pcf .label.svelte-1gm5pcf{color:#eaeaea;text-transform:uppercase} +@import"https://fonts.googleapis.com/css?family=Source+Code+Pro:400,600|Source+Sans+Pro:400,600";html,body{background-color:#303538;color:#fff;padding:0;margin:0}.margins{padding:0 30px}.header.svelte-tewt95{background:#292f32}.row.svelte-tewt95{display:flex;align-items:center}.title.svelte-tewt95{font-size:34px;padding-top:20px;padding-bottom:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:10px;flex:1}.metrics.svelte-tewt95{display:grid;grid-template-columns:auto auto auto auto auto auto;font-size:14px;text-transform:uppercase;grid-gap:1px 8px}.metric-label.svelte-tewt95{font-weight:600;color:#a9abad}.metric-value.svelte-tewt95{color:#737779;margin-right:.5em}.frame.svelte-512hcv.svelte-512hcv{font-family:Source Code Pro,Roboto Mono,Consolas,Monaco,monospace;font-size:15px;z-index:0;position:relative;user-select:none}.group-header.svelte-512hcv.svelte-512hcv{margin-left:35px}.group-header-button.svelte-512hcv.svelte-512hcv{display:inline-block;color:#ffffff94;user-select:none;cursor:default;position:relative}.group-header-button.svelte-512hcv.svelte-512hcv:before{position:absolute;left:-3px;right:-3px;top:0px;bottom:-1px;content:"";z-index:-1;background-color:#3b4043}.group-header-button.svelte-512hcv.svelte-512hcv:hover:before{background-color:#4a4f54}.group-triangle.svelte-512hcv.svelte-512hcv,.frame-triangle.svelte-512hcv.svelte-512hcv{width:6px;height:10px;padding-left:6px;padding-right:5px;display:inline-block}.group-triangle.rotate.svelte-512hcv.svelte-512hcv,.frame-triangle.rotate.svelte-512hcv.svelte-512hcv{transform:translate(6px,4px) rotate(90deg)}.frame-description.svelte-512hcv.svelte-512hcv{display:flex;white-space:nowrap}.frame-description.svelte-512hcv.svelte-512hcv:hover:before{position:absolute;left:-3px;right:-3px;top:-1px;height:22px;content:"";z-index:-1;background-color:#354759;opacity:.5}.frame-triangle.svelte-512hcv.svelte-512hcv{opacity:1}.frame-description.children-visible.svelte-512hcv .frame-triangle.svelte-512hcv{opacity:0}.frame-description.children-visible.svelte-512hcv:hover .frame-triangle.svelte-512hcv{opacity:1}.name.svelte-512hcv.svelte-512hcv,.time.svelte-512hcv.svelte-512hcv,.code-position.svelte-512hcv.svelte-512hcv{user-select:text;cursor:default}.application-code.svelte-512hcv .name.svelte-512hcv{color:#5db3ff}.time.svelte-512hcv.svelte-512hcv{margin-right:.55em;color:#b8e98685}.code-position.svelte-512hcv.svelte-512hcv{color:#ffffff80;text-align:right;margin-left:2em}.visual-guide{top:21px;bottom:0;left:0;width:2px;background-color:#fff;position:absolute;opacity:.08;pointer-events:none}.frame-description:hover~.visual-guide{opacity:.4}.frame-description:hover~.children .visual-guide{opacity:.1}.app.svelte-1gm5pcf.svelte-1gm5pcf{font-family:Source Sans Pro,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.program.svelte-1gm5pcf.svelte-1gm5pcf{font-size:14px;font-weight:600;margin-bottom:16px;color:#b4b4b4}.program.svelte-1gm5pcf .label.svelte-1gm5pcf{color:#eaeaea;text-transform:uppercase} diff --git a/pyinstrument/renderers/html_resources/app.js b/pyinstrument/renderers/html_resources/app.js index 592f38b0..999fd774 100644 --- a/pyinstrument/renderers/html_resources/app.js +++ b/pyinstrument/renderers/html_resources/app.js @@ -1,2 +1,2 @@ -var pyinstrumentHTMLRenderer=function(){"use strict";var ct=Object.defineProperty;var dt=(R,C,H)=>C in R?ct(R,C,{enumerable:!0,configurable:!0,writable:!0,value:H}):R[C]=H;var k=(R,C,H)=>(dt(R,typeof C!="symbol"?C+"":C,H),H);const R="";function C(){}function H(t){return t()}function we(){return Object.create(null)}function O(t){t.forEach(H)}function be(t){return typeof t=="function"}function K(t,e){return t!=t?e==e:t!==e||t&&typeof t=="object"||typeof t=="function"}function Ie(t){return Object.keys(t).length===0}function Re(t,...e){if(t==null)return C;const i=t.subscribe(...e);return i.unsubscribe?()=>i.unsubscribe():i}function se(t,e,i){t.$$.on_destroy.push(Re(e,i))}function f(t,e){t.appendChild(e)}function X(t,e,i){t.insertBefore(e,i||null)}function N(t){t.parentNode&&t.parentNode.removeChild(t)}function _(t){return document.createElement(t)}function ke(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function L(t){return document.createTextNode(t)}function w(){return L(" ")}function ye(){return L("")}function W(t,e,i,n){return t.addEventListener(e,i,n),()=>t.removeEventListener(e,i,n)}function Ce(t){return function(e){return e.preventDefault(),t.call(this,e)}}function Ee(t){return function(e){return e.stopPropagation(),t.call(this,e)}}function m(t,e,i){i==null?t.removeAttribute(e):t.getAttribute(e)!==i&&t.setAttribute(e,i)}function Oe(t){return Array.from(t.childNodes)}function q(t,e){e=""+e,t.wholeText!==e&&(t.data=e)}function T(t,e,i,n){i===null?t.style.removeProperty(e):t.style.setProperty(e,i,n?"important":"")}function Q(t,e,i){t.classList[i?"add":"remove"](e)}let V;function Z(t){V=t}function Te(){if(!V)throw new Error("Function called outside component initialization");return V}function qe(t){Te().$$.on_mount.push(t)}function Ue(t){Te().$$.on_destroy.push(t)}const Y=[],Fe=[],j=[],Se=[],Ve=Promise.resolve();let ae=!1;function Ze(){ae||(ae=!0,Ve.then($e))}function ue(t){j.push(t)}const fe=new Set;let x=0;function $e(){const t=V;do{for(;x{ee.delete(t),n&&(i&&t.d(1),n())}),t.o(e)}else n&&n()}function Je(t,e){z(t,1,1,()=>{e.delete(t.key)})}function Ke(t,e,i,n,s,u,r,o,a,l,h,p){let d=t.length,g=u.length,A=d;const b={};for(;A--;)b[t[A].key]=A;const F=[],c=new Map,v=new Map;for(A=g;A--;){const y=p(s,u,A),S=i(y);let P=r.get(S);P?n&&P.p(y,e):(P=l(S,y),P.c()),c.set(S,F[A]=P),S in b&&v.set(S,Math.abs(A-b[S]))}const $=new Set,M=new Set;function E(y){D(y,1),y.m(o,h),r.set(y.key,y),h=y.first,g--}for(;d&&g;){const y=F[g-1],S=t[d-1],P=y.key,B=S.key;y===S?(h=y.first,d--,g--):c.has(B)?!r.has(P)||$.has(P)?E(y):M.has(B)?d--:v.get(P)>v.get(B)?(M.add(P),E(y)):($.add(B),d--):(a(S,r),d--)}for(;d--;){const y=t[d];c.has(y.key)||a(y,r)}for(;g;)E(F[g-1]);return F}function pe(t){t&&t.c()}function te(t,e,i,n){const{fragment:s,after_update:u}=t.$$;s&&s.m(e,i),n||ue(()=>{const r=t.$$.on_mount.map(H).filter(be);t.$$.on_destroy?t.$$.on_destroy.push(...r):O(r),t.$$.on_mount=[]}),u.forEach(ue)}function ie(t,e){const i=t.$$;i.fragment!==null&&(O(i.on_destroy),i.fragment&&i.fragment.d(e),i.on_destroy=i.fragment=null,i.ctx=[])}function We(t,e){t.$$.dirty[0]===-1&&(Y.push(t),Ze(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{const A=g.length?g[0]:d;return l.ctx&&s(l.ctx[p],l.ctx[p]=A)&&(!l.skip_bound&&l.bound[p]&&l.bound[p](A),h&&We(t,p)),d}):[],l.update(),h=!0,O(l.before_update),l.fragment=n?n(l.ctx):!1,e.target){if(e.hydrate){const p=Oe(e.target);l.fragment&&l.fragment.l(p),p.forEach(N)}else l.fragment&&l.fragment.c();e.intro&&D(t.$$.fragment),te(t,e.target,e.anchor,e.customElement),$e()}Z(a)}class he{$destroy(){ie(this,1),this.$destroy=C}$on(e,i){if(!be(i))return C;const n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(i),()=>{const s=n.indexOf(i);s!==-1&&n.splice(s,1)}}$set(e){this.$$set&&!Ie(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const U=[];function Pe(t,e=C){let i;const n=new Set;function s(o){if(K(t,o)&&(t=o,i)){const a=!U.length;for(const l of n)l[1](),U.push(l,t);if(a){for(let l=0;l{n.delete(l),n.size===0&&(i(),i=null)}}return{set:s,update:u,subscribe:r}}const De=Pe({}),ne=Pe("absolute"),pt="";function je(t){let e,i,n,s,u,r,o,a,l,h,p,d,g,A,b,F,c,v,$,M,E,y,S,P,B,re=t[0].sampleCount+"",ve,Xe,le,Qe,oe,Ae,Ge;return{c(){e=_("div"),i=_("div"),n=_("div"),s=_("div"),s.textContent="pyinstrument",u=w(),r=_("div"),o=_("label"),o.textContent="Absolute time",a=w(),l=_("input"),h=w(),p=_("div"),p.textContent="Recorded:",d=w(),g=_("div"),g.textContent=`${t[2]}`,A=w(),b=_("div"),b.textContent="Duration:",F=w(),c=_("div"),c.textContent=`${t[4]} seconds`,v=w(),$=_("label"),$.textContent="Proportional time",M=w(),E=_("input"),y=w(),S=_("div"),S.textContent="Samples:",P=w(),B=_("div"),ve=L(re),Xe=w(),le=_("div"),le.textContent="CPU time:",Qe=w(),oe=_("div"),oe.textContent=`${t[3]} seconds`,m(s,"class","title svelte-tewt95"),m(o,"class","metric-label svelte-tewt95"),m(o,"for","absolute"),m(l,"type","radio"),l.__value="absolute",l.value=l.__value,m(l,"id","absolute"),m(l,"name","time-format"),l.checked=!0,t[6][0].push(l),m(p,"class","metric-label svelte-tewt95"),m(g,"class","metric-value svelte-tewt95"),m(b,"class","metric-label svelte-tewt95"),m(c,"class","metric-value svelte-tewt95"),m($,"class","metric-label svelte-tewt95"),m($,"for","proportion"),m(E,"type","radio"),E.__value="proportion",E.value=E.__value,m(E,"id","proportion"),m(E,"name","time-format"),t[6][0].push(E),m(S,"class","metric-label svelte-tewt95"),m(B,"class","metric-value svelte-tewt95"),m(le,"class","metric-label svelte-tewt95"),m(oe,"class","metric-value svelte-tewt95"),m(r,"class","metrics svelte-tewt95"),m(n,"class","row svelte-tewt95"),m(i,"class","margins"),m(e,"class","header svelte-tewt95")},m(I,J){X(I,e,J),f(e,i),f(i,n),f(n,s),f(n,u),f(n,r),f(r,o),f(r,a),f(r,l),l.checked=l.__value===t[1],f(r,h),f(r,p),f(r,d),f(r,g),f(r,A),f(r,b),f(r,F),f(r,c),f(r,v),f(r,$),f(r,M),f(r,E),E.checked=E.__value===t[1],f(r,y),f(r,S),f(r,P),f(r,B),f(B,ve),f(r,Xe),f(r,le),f(r,Qe),f(r,oe),Ae||(Ge=[W(l,"change",t[5]),W(E,"change",t[7])],Ae=!0)},p(I,[J]){J&2&&(l.checked=l.__value===I[1]),J&2&&(E.checked=E.__value===I[1]),J&1&&re!==(re=I[0].sampleCount+"")&&q(ve,re)},i:C,o:C,d(I){I&&N(e),t[6][0].splice(t[6][0].indexOf(l),1),t[6][0].splice(t[6][0].indexOf(E),1),Ae=!1,O(Ge)}}}function xe(t,e,i){var p;let n;se(t,ne,d=>i(1,n=d));let{session:s}=e;const u=new Date(s.startTime*1e3).toLocaleString(),r=(p=s.cpuTime)==null?void 0:p.toLocaleString(void 0,{maximumSignificantDigits:3}),o=s.duration.toLocaleString(void 0,{maximumSignificantDigits:3}),a=[[]];function l(){n=this.__value,ne.set(n)}function h(){n=this.__value,ne.set(n)}return t.$$set=d=>{"session"in d&&i(0,s=d.session)},[s,n,u,r,o,l,a,h]}class et extends he{constructor(e){super(),me(this,e,xe,je,K,{session:0})}}const mt="";function Me(t,e,i){const n=t.slice();return n[14]=e[i],n}function Le(t){let e,i,n,s,u,r,o,a,l,h,p,d,g,A,b,F;return{c(){e=_("div"),i=_("div"),n=ke("svg"),s=ke("path"),u=w(),r=_("div"),o=L(t[5]),a=w(),l=_("div"),h=L(t[4]),p=w(),d=_("div"),g=w(),A=_("div"),A.textContent=`${t[9]}`,m(s,"d","M.937-.016L5.793 4.84.937 9.696z"),m(s,"fill",t[7]),m(s,"fill-rule","evenodd"),m(s,"fill-opacity",".582"),m(n,"width","6"),m(n,"height","10"),m(i,"class","frame-triangle svelte-1aphj50"),Q(i,"rotate",t[2]),T(i,"visibility",t[0].children.length>0?"visible":"hidden"),m(r,"class","time svelte-1aphj50"),T(r,"color",t[7]),T(r,"font-weight",t[0].proportionOfTotal<.2?500:600),m(l,"class","name svelte-1aphj50"),m(d,"class","spacer"),T(d,"flex","1"),m(A,"class","code-position svelte-1aphj50"),m(e,"class","frame-description svelte-1aphj50"),Q(e,"application-code",t[0].isApplicationCode),Q(e,"children-visible",t[2]),T(e,"padding-left",`${t[1]*35}px`)},m(c,v){X(c,e,v),f(e,i),f(i,n),f(n,s),f(e,u),f(e,r),f(r,o),f(e,a),f(e,l),f(l,h),f(e,p),f(e,d),f(e,g),f(e,A),b||(F=W(e,"click",Ee(Ce(t[10]))),b=!0)},p(c,v){v&128&&m(s,"fill",c[7]),v&4&&Q(i,"rotate",c[2]),v&1&&T(i,"visibility",c[0].children.length>0?"visible":"hidden"),v&32&&q(o,c[5]),v&128&&T(r,"color",c[7]),v&1&&T(r,"font-weight",c[0].proportionOfTotal<.2?500:600),v&16&&q(h,c[4]),v&1&&Q(e,"application-code",c[0].isApplicationCode),v&4&&Q(e,"children-visible",c[2]),v&2&&T(e,"padding-left",`${c[1]*35}px`)},d(c){c&&N(e),b=!1,F()}}}function Ne(t){let e,i,n,s,u=t[0].group.frames.length+"",r,o,a,l,h,p;return{c(){e=_("div"),i=_("div"),n=_("div"),n.innerHTML='',s=w(),r=L(u),o=L(` frames hidden - (`),a=L(t[6]),l=L(")"),m(n,"class","group-triangle svelte-1aphj50"),Q(n,"rotate",t[8]),m(i,"class","group-header-button svelte-1aphj50"),m(e,"class","group-header svelte-1aphj50"),T(e,"padding-left",`${t[1]*35}px`)},m(d,g){X(d,e,g),f(e,i),f(i,n),f(i,s),f(i,r),f(i,o),f(i,a),f(i,l),h||(p=W(e,"click",Ee(Ce(t[11]))),h=!0)},p(d,g){g&256&&Q(n,"rotate",d[8]),g&1&&u!==(u=d[0].group.frames.length+"")&&q(r,u),g&64&&q(a,d[6]),g&2&&T(e,"padding-left",`${d[1]*35}px`)},d(d){d&&N(e),h=!1,p()}}}function ze(t){let e=[],i=new Map,n,s,u=t[0].children;const r=o=>o[14].identifier;for(let o=0;o{l=null}),de()),p&2&&T(u,"left",`${h[1]*35+21}px`),p&128&&T(u,"backgroundColor",h[7])},i(h){r||(D(l),r=!0)},o(h){z(l),r=!1},d(h){h&&N(e),o&&o.d(),a&&a.d(),l&&l.d()}}}function it(t,e,i){let n,s,u;se(t,De,c=>i(12,s=c)),se(t,ne,c=>i(13,u=c));let{frame:r}=e,{indent:o=0}=e,a=!0,l,h;r.className?h=`${r.className}.${r.function}`:h=r.function;const p=`${r.filePathShort}:${r.lineNo.toString().padEnd(4,"\xA0")}`;let d,g=null;if(r.group){const c=r.group.libraries;c.length<4?g=c.join(", "):g=`${c[0]}, ${c[1]}, ${c[2]}...`}let A;r.proportionOfTotal>.6?A="#FF4159":r.proportionOfTotal>.3?A="#F5A623":r.proportionOfTotal>.2?A="#D8CB2A":A="#7ED321";function b(){i(2,a=!a)}function F(){De.update(c=>{var v;return{...c,[(v=r.groupId)!=null?v:""]:!n}})}return t.$$set=c=>{"frame"in c&&i(0,r=c.frame),"indent"in c&&i(1,o=c.indent)},t.$$.update=()=>{var c,v,$;if(t.$$.dirty&4097&&(r.group?s[(c=r.groupId)!=null?c:""]||((v=r.group)==null?void 0:v.rootFrame)===r||r.children.filter(M=>!M.group).length>1?i(3,l=!0):i(3,l=!1):i(3,l=!0)),t.$$.dirty&8193)if(u==="absolute")i(5,d=r.time.toLocaleString(void 0,{minimumFractionDigits:3,maximumFractionDigits:3}));else if(u==="proportion")i(5,d=`${(r.proportionOfTotal*100).toLocaleString(void 0,{minimumFractionDigits:1,maximumFractionDigits:1})}%`);else throw new Error("unknown timeFormat");t.$$.dirty&4097&&i(8,n=s[($=r.groupId)!=null?$:""]===!0)},[r,o,a,l,h,d,g,A,n,p,b,F,s,u]}class He extends he{constructor(e){super(),me(this,e,it,tt,K,{frame:0,indent:1})}}const nt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAFPklEQVRYCdWXu4skVRSHb3VXP2bcXUVMBkRMTVww2XQDExEEH4iKiUYGhuJEPgJhUSMzQQSDRVzETNDMTTfUwL/ARUwM1t3pV1WX33eqbnfP9MxOu5kHTt9T93F+v3vOubeqi7QhT1+58vhiVn1G19WiaQ6KIqVQOmyT+h9kuUxp2bAAtQkpij9pbw5G5fu/3br1x8ql4NW0+rVJzaN29nop9VUeCtoerXpMTj53g+AGcINR1YB3RIJMN6dIxd/luLxcZoftzltwAct+SiNGh2jJ84BnSQWJTeBNW2C0ZrvufrZA5y2JmuemWkfCjYq5IsC6q2iE2V0LuDdMaYxKZDxo+yS3JZkEY+5SsAU7P5q1qZNEAxnXGo0NubomQM4dWPnCMAU/fUCnoA7kFjPEPohuqfO6uc++0xKSVHUcHDbNwZpAeFyHyMcg408G16mSnwW3b5OEz3rtCAyJnHUQUSEFmMdki0CMmsNOX/gkpf1RSpf223Q43jC2MMw4tFWsjwHzBngsIOT6CaEf7wGKrTo/agFbH8oWAQdkWTF5htGntSDn2h2YBTal/9603Z2++swZ0+5BZIjdQwfUz5DcGwHVotSfdpYtAg7oUKzaycyo6PjmkA4cRmgBuf5zSj/80kbAuToaYHz9afdgCiCxJF3gpudfZampOyGnEwAwIkEbuROBXEauXZGdYzrEtFTTpx3zHGeewGoFcFxk2Cdlxempy8/oZyXm1KO3R14fIraPXEzpAnXgyVBmRMdjNgdVsqZgxLw9cl4C7m7N+d17pOqIuaj2LKetQzs1Ai3E+reRJip4CSnz2wPYHC9wFL66MYko9k8pwgmAU4hqbxZhO6tNXba321V8Uvruc4ZzGgQxErnFNszqItqC0DdpTtzfeqWJ21DwpRp5WkOdHwFJqM4UMLcdeB2AADPUkigSm00VOZixsOL8WfUB3oWd4ZWcT8CpgLz2XkoPX+IgEIU+q6K6QZqzqxoAr15vupqC8Air0wm7JwUL2AWJByIAuDXQEGZ1aegRASY4Ppq0AOZZIoZYsLh4zDsa4PSfeA+En/tGQMI5ZTe+xClhN+Q5z4b67TfZJeATiAQw4J4KwTzCOfT2nSb3JRALAJTEfKPQcrGBG5GwwCLMRCRAXcgiQY1IYD8ogbzuDd5qF7gL+p4ESM05Z//coWXH1oEE5oQkQPOi3EroDDk/Ai40Cp3SRE2AG+8MWyOk5h1j7ixnEogPD0dVcv/FVwXXLceKs20K5rCaFk06fKmOD424akkTXUFkVwanEtBZfH7hMK5eCEwBl0DNYHvJ0Idd4MHXr7djkGDtWQV3GqlTCRhybzqv1R4zbA/fXabRfhFAHkvflJO77XivuyElbRHG+h3yL6EtAu4iPkoF5q4veRn1ecEUAwYg0pSyQwAoRk3qz4p4DS+wawpxSVHoY9cobBHQtxBBBMBrN/rkvOEC6lF0hF/nKvaS31yE155btLVAFKIidbSDbBMI9HaluzjC4ZKQWHieBIcVPqvbyg/b503Dh91kTcB/LH4Z6wmNI8X2PnyxTkPSUI7JP7MjvE5hTrwDuO+rLvT2uXxnAXNNgL9LLHxdB16jOi24XgOEK68EyMKMb/uYRERol1w+FmRN67XrWonsKDdzRNPmXzPjbEXHxwWttsCcwpXki8cte91afP7zkdQuYch/zSizVv66ffvOwZNPfLus/YNSPMYuLkZIda66yw3NzwHMeCOBXcBNdVH8OBiXLx/7c5qJrFrK/GOYfETH97Sr/jOM38FnvodDGv8f+Rcj1XBLIcDKAQAAAABJRU5ErkJggg==",ht="";function rt(t){let e;return{c(){e=_("div"),e.textContent="No samples recorded.",m(e,"class","error")},m(i,n){X(i,e,n)},p:C,i:C,o:C,d(i){i&&N(e)}}}function lt(t){let e,i;return e=new He({props:{frame:t[0].rootFrame}}),{c(){pe(e.$$.fragment)},m(n,s){te(e,n,s),i=!0},p(n,s){const u={};s&1&&(u.frame=n[0].rootFrame),e.$set(u)},i(n){i||(D(e.$$.fragment,n),i=!0)},o(n){z(e.$$.fragment,n),i=!1},d(n){ie(e,n)}}}function ot(t){let e,i,n,s,u,r,o,a,l,h,p,d,g;i=new et({props:{session:t[0]}});const A=[lt,rt],b=[];function F(c,v){return c[0].rootFrame?0:1}return p=F(t),d=b[p]=A[p](t),{c(){e=_("div"),pe(i.$$.fragment),n=w(),s=_("div"),u=w(),r=_("div"),o=_("div"),a=_("span"),a.textContent="Program:\xA0",l=L(t[1]),h=w(),d.c(),m(s,"class","spacer"),T(s,"height","20px"),m(a,"class","label svelte-1gm5pcf"),m(o,"class","program svelte-1gm5pcf"),m(r,"class","margins"),m(e,"class","app svelte-1gm5pcf")},m(c,v){X(c,e,v),te(i,e,null),f(e,n),f(e,s),f(e,u),f(e,r),f(r,o),f(o,a),f(o,l),f(r,h),b[p].m(r,null),g=!0},p(c,[v]){const $={};v&1&&($.session=c[0]),i.$set($),(!g||v&2)&&q(l,c[1]);let M=p;p=F(c),p===M?b[p].p(c,v):(ce(),z(b[M],1,1,()=>{b[M]=null}),de(),d=b[p],d?d.p(c,v):(d=b[p]=A[p](c),d.c()),D(d,1),d.m(r,null))},i(c){g||(D(i.$$.fragment,c),D(d),g=!0)},o(c){z(i.$$.fragment,c),z(d),g=!1},d(c){c&&N(e),ie(i),b[p].d()}}}function ge(){document.body.style.minHeight=`${window.scrollY+window.innerHeight}px`}function st(t,e,i){let{session:n}=e;const s=document.createElement("link");s.rel="shortut icon",s.href=nt,document.head.appendChild(s),qe(()=>{window.addEventListener("scroll",ge),ge()}),Ue(()=>{window.removeEventListener("scroll",ge)});const u=n.rootFrame,r=u==null?void 0:u.time.toLocaleString(void 0,{maximumSignificantDigits:3});let o=u==null?void 0:u.function;return o==""&&(o=n.program),document.title=`${r}s - ${o} - pyinstrument`,t.$$set=a=>{"session"in a&&i(0,n=a.session)},[n,o]}class at extends he{constructor(e){super(),me(this,e,st,ot,K,{session:0})}}class ut{constructor(e,i){k(this,"id");k(this,"rootFrame");k(this,"frames",[]);this.id=e,this.rootFrame=i}addFrame(e){this.frames.push(e)}get exitFrames(){const e=[];for(const i of this.frames){let n=!1;for(const s of i.children)if(s.group!=this){n=!0;break}n&&e.push(i)}return e}get libraries(){const e=[];for(const i of this.frames){const n=/^[^\\/.]*/.exec(i.filePathShort)[0];e.includes(n)||e.push(n)}return e}}class _e{constructor(e,i=null,n={groups:{}}){k(this,"function");k(this,"filePath");k(this,"filePathShort");k(this,"lineNo");k(this,"time");k(this,"totalTime");k(this,"awaitTime");k(this,"isApplicationCode");k(this,"groupId");k(this,"className");k(this,"parent");k(this,"children");k(this,"group");var s,u;if(this.parent=i,this.function=e.function,this.filePath=e.file_path,this.filePathShort=e.file_path_short,this.lineNo=e.line_no,this.time=e.time,this.totalTime=this.parent?this.parent.totalTime:this.time,this.awaitTime=e.await_time,this.isApplicationCode=e.is_application_code,this.groupId=(s=e.group_id)!=null?s:null,this.className=(u=e.class_name)!=null?u:null,e.group_id){const r=e.group_id;let o=n.groups[r];o||(o=n.groups[r]=new ut(r,this)),o.addFrame(this),this.group=n.groups[r]}else this.group=null;this.children=e.children.map(r=>new _e(r,this,n))}get identifier(){return`${this.function}:${this.filePath}:${this.lineNo}`}get proportionOfTotal(){return this.time/this.totalTime}}class ft{constructor(e){k(this,"startTime");k(this,"duration");k(this,"sampleCount");k(this,"program");k(this,"cpuTime");k(this,"rootFrame");this.startTime=e.start_time,this.duration=e.duration,this.sampleCount=e.sample_count,this.program=e.program,this.cpuTime=e.cpu_time,this.rootFrame=e.root_frame?new _e(e.root_frame):null}}return{render(t,e){const i=new ft(e);return new at({target:t,props:{session:i}})}}}(); +var pyinstrumentHTMLRenderer=function(){"use strict";var Lt=Object.defineProperty;var Bt=(U,b,M)=>b in U?Lt(U,b,{enumerable:!0,configurable:!0,writable:!0,value:M}):U[b]=M;var P=(U,b,M)=>(Bt(U,typeof b!="symbol"?b+"":b,M),M);const U="";function b(){}function M(t){return t()}function Pe(){return Object.create(null)}function H(t){t.forEach(M)}function Ce(t){return typeof t=="function"}function V(t,e){return t!=t?e==e:t!==e||t&&typeof t=="object"||typeof t=="function"}function je(t){return Object.keys(t).length===0}function Je(t,...e){if(t==null)return b;const n=t.subscribe(...e);return n.unsubscribe?()=>n.unsubscribe():n}function pe(t,e,n){t.$$.on_destroy.push(Je(e,n))}function a(t,e){t.appendChild(e)}function O(t,e,n){t.insertBefore(e,n||null)}function I(t){t.parentNode&&t.parentNode.removeChild(t)}function et(t,e){for(let n=0;nt.removeEventListener(e,n,i)}function Te(t){return function(e){return e.preventDefault(),t.call(this,e)}}function ke(t){return function(e){return e.stopPropagation(),t.call(this,e)}}function d(t,e,n){n==null?t.removeAttribute(e):t.getAttribute(e)!==n&&t.setAttribute(e,n)}function nt(t){return Array.from(t.childNodes)}function X(t,e){e=""+e,t.wholeText!==e&&(t.data=e)}function y(t,e,n,i){n===null?t.style.removeProperty(e):t.style.setProperty(e,n,i?"important":"")}function $(t,e,n){t.classList[n?"add":"remove"](e)}let W;function q(t){W=t}function Re(){if(!W)throw new Error("Function called outside component initialization");return W}function it(t){Re().$$.on_mount.push(t)}function rt(t){Re().$$.on_destroy.push(t)}const Z=[],Se=[],ee=[],Ie=[],st=Promise.resolve();let me=!1;function ot(){me||(me=!0,st.then(De))}function ge(t){ee.push(t)}const _e=new Set;let te=0;function De(){const t=W;do{for(;te{ne.delete(t),i&&(n&&t.d(1),i())}),t.o(e)}else i&&i()}function ie(t){t&&t.c()}function x(t,e,n,i){const{fragment:r,after_update:u}=t.$$;r&&r.m(e,n),i||ge(()=>{const s=t.$$.on_mount.map(M).filter(Ce);t.$$.on_destroy?t.$$.on_destroy.push(...s):H(s),t.$$.on_mount=[]}),u.forEach(ge)}function Y(t,e){const n=t.$$;n.fragment!==null&&(H(n.on_destroy),n.fragment&&n.fragment.d(e),n.on_destroy=n.fragment=null,n.ctx=[])}function ct(t,e){t.$$.dirty[0]===-1&&(Z.push(t),ot(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{const C=v.length?v[0]:p;return l.ctx&&r(l.ctx[f],l.ctx[f]=C)&&(!l.skip_bound&&l.bound[f]&&l.bound[f](C),h&&ct(t,f)),p}):[],l.update(),h=!0,H(l.before_update),l.fragment=i?i(l.ctx):!1,e.target){if(e.hydrate){const f=nt(e.target);l.fragment&&l.fragment.l(f),f.forEach(I)}else l.fragment&&l.fragment.c();e.intro&&T(t.$$.fragment),x(t,e.target,e.anchor,e.customElement),De()}q(c)}class se{$destroy(){Y(this,1),this.$destroy=b}$on(e,n){if(!Ce(n))return b;const i=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return i.push(n),()=>{const r=i.indexOf(n);r!==-1&&i.splice(r,1)}}$set(e){this.$$set&&!je(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const G=[];function Oe(t,e=b){let n;const i=new Set;function r(o){if(V(t,o)&&(t=o,n)){const c=!G.length;for(const l of i)l[1](),G.push(l,t);if(c){for(let l=0;l{i.delete(l),i.size===0&&(n(),n=null)}}return{set:r,update:u,subscribe:s}}const Me=Oe({}),oe=Oe("absolute"),zt="";function ut(t){let e,n,i,r,u,s,o,c,l,h,f,p,v,C,g,A,w,k,S,_,F,N,B,ue,ae,fe=t[0].sampleCount+"",Ee,xe,de,Ye,he,Fe,Ke;return{c(){e=m("div"),n=m("div"),i=m("div"),r=m("div"),r.textContent="pyinstrument",u=E(),s=m("div"),o=m("label"),o.textContent="Absolute time",c=E(),l=m("input"),h=E(),f=m("div"),f.textContent="Recorded:",p=E(),v=m("div"),v.textContent=`${t[2]}`,C=E(),g=m("div"),g.textContent="Duration:",A=E(),w=m("div"),w.textContent=`${t[4]} seconds`,k=E(),S=m("label"),S.textContent="Proportional time",_=E(),F=m("input"),N=E(),B=m("div"),B.textContent="Samples:",ue=E(),ae=m("div"),Ee=D(fe),xe=E(),de=m("div"),de.textContent="CPU time:",Ye=E(),he=m("div"),he.textContent=`${t[3]} seconds`,d(r,"class","title svelte-tewt95"),d(o,"class","metric-label svelte-tewt95"),d(o,"for","absolute"),d(l,"type","radio"),l.__value="absolute",l.value=l.__value,d(l,"id","absolute"),d(l,"name","time-format"),l.checked=!0,t[6][0].push(l),d(f,"class","metric-label svelte-tewt95"),d(v,"class","metric-value svelte-tewt95"),d(g,"class","metric-label svelte-tewt95"),d(w,"class","metric-value svelte-tewt95"),d(S,"class","metric-label svelte-tewt95"),d(S,"for","proportion"),d(F,"type","radio"),F.__value="proportion",F.value=F.__value,d(F,"id","proportion"),d(F,"name","time-format"),t[6][0].push(F),d(B,"class","metric-label svelte-tewt95"),d(ae,"class","metric-value svelte-tewt95"),d(de,"class","metric-label svelte-tewt95"),d(he,"class","metric-value svelte-tewt95"),d(s,"class","metrics svelte-tewt95"),d(i,"class","row svelte-tewt95"),d(n,"class","margins"),d(e,"class","header svelte-tewt95")},m(z,j){O(z,e,j),a(e,n),a(n,i),a(i,r),a(i,u),a(i,s),a(s,o),a(s,c),a(s,l),l.checked=l.__value===t[1],a(s,h),a(s,f),a(s,p),a(s,v),a(s,C),a(s,g),a(s,A),a(s,w),a(s,k),a(s,S),a(s,_),a(s,F),F.checked=F.__value===t[1],a(s,N),a(s,B),a(s,ue),a(s,ae),a(ae,Ee),a(s,xe),a(s,de),a(s,Ye),a(s,he),Fe||(Ke=[J(l,"change",t[5]),J(F,"change",t[7])],Fe=!0)},p(z,[j]){j&2&&(l.checked=l.__value===z[1]),j&2&&(F.checked=F.__value===z[1]),j&1&&fe!==(fe=z[0].sampleCount+"")&&X(Ee,fe)},i:b,o:b,d(z){z&&I(e),t[6][0].splice(t[6][0].indexOf(l),1),t[6][0].splice(t[6][0].indexOf(F),1),Fe=!1,H(Ke)}}}function at(t,e,n){var f;let i;pe(t,oe,p=>n(1,i=p));let{session:r}=e;const u=new Date(r.startTime*1e3).toLocaleString(),s=(f=r.cpuTime)==null?void 0:f.toLocaleString(void 0,{maximumSignificantDigits:3}),o=r.duration.toLocaleString(void 0,{maximumSignificantDigits:3}),c=[[]];function l(){i=this.__value,oe.set(i)}function h(){i=this.__value,oe.set(i)}return t.$$set=p=>{"session"in p&&n(0,r=p.session)},[r,i,u,s,o,l,c,h]}class ft extends se{constructor(e){super(),re(this,e,at,ut,V,{session:0})}}const dt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAFPklEQVRYCdWXu4skVRSHb3VXP2bcXUVMBkRMTVww2XQDExEEH4iKiUYGhuJEPgJhUSMzQQSDRVzETNDMTTfUwL/ARUwM1t3pV1WX33eqbnfP9MxOu5kHTt9T93F+v3vOubeqi7QhT1+58vhiVn1G19WiaQ6KIqVQOmyT+h9kuUxp2bAAtQkpij9pbw5G5fu/3br1x8ql4NW0+rVJzaN29nop9VUeCtoerXpMTj53g+AGcINR1YB3RIJMN6dIxd/luLxcZoftzltwAct+SiNGh2jJ84BnSQWJTeBNW2C0ZrvufrZA5y2JmuemWkfCjYq5IsC6q2iE2V0LuDdMaYxKZDxo+yS3JZkEY+5SsAU7P5q1qZNEAxnXGo0NubomQM4dWPnCMAU/fUCnoA7kFjPEPohuqfO6uc++0xKSVHUcHDbNwZpAeFyHyMcg408G16mSnwW3b5OEz3rtCAyJnHUQUSEFmMdki0CMmsNOX/gkpf1RSpf223Q43jC2MMw4tFWsjwHzBngsIOT6CaEf7wGKrTo/agFbH8oWAQdkWTF5htGntSDn2h2YBTal/9603Z2++swZ0+5BZIjdQwfUz5DcGwHVotSfdpYtAg7oUKzaycyo6PjmkA4cRmgBuf5zSj/80kbAuToaYHz9afdgCiCxJF3gpudfZampOyGnEwAwIkEbuROBXEauXZGdYzrEtFTTpx3zHGeewGoFcFxk2Cdlxempy8/oZyXm1KO3R14fIraPXEzpAnXgyVBmRMdjNgdVsqZgxLw9cl4C7m7N+d17pOqIuaj2LKetQzs1Ai3E+reRJip4CSnz2wPYHC9wFL66MYko9k8pwgmAU4hqbxZhO6tNXba321V8Uvruc4ZzGgQxErnFNszqItqC0DdpTtzfeqWJ21DwpRp5WkOdHwFJqM4UMLcdeB2AADPUkigSm00VOZixsOL8WfUB3oWd4ZWcT8CpgLz2XkoPX+IgEIU+q6K6QZqzqxoAr15vupqC8Air0wm7JwUL2AWJByIAuDXQEGZ1aegRASY4Ppq0AOZZIoZYsLh4zDsa4PSfeA+En/tGQMI5ZTe+xClhN+Q5z4b67TfZJeATiAQw4J4KwTzCOfT2nSb3JRALAJTEfKPQcrGBG5GwwCLMRCRAXcgiQY1IYD8ogbzuDd5qF7gL+p4ESM05Z//coWXH1oEE5oQkQPOi3EroDDk/Ai40Cp3SRE2AG+8MWyOk5h1j7ixnEogPD0dVcv/FVwXXLceKs20K5rCaFk06fKmOD424akkTXUFkVwanEtBZfH7hMK5eCEwBl0DNYHvJ0Idd4MHXr7djkGDtWQV3GqlTCRhybzqv1R4zbA/fXabRfhFAHkvflJO77XivuyElbRHG+h3yL6EtAu4iPkoF5q4veRn1ecEUAwYg0pSyQwAoRk3qz4p4DS+wawpxSVHoY9cobBHQtxBBBMBrN/rkvOEC6lF0hF/nKvaS31yE155btLVAFKIidbSDbBMI9HaluzjC4ZKQWHieBIcVPqvbyg/b503Dh91kTcB/LH4Z6wmNI8X2PnyxTkPSUI7JP7MjvE5hTrwDuO+rLvT2uXxnAXNNgL9LLHxdB16jOi24XgOEK68EyMKMb/uYRERol1w+FmRN67XrWonsKDdzRNPmXzPjbEXHxwWttsCcwpXki8cte91afP7zkdQuYch/zSizVv66ffvOwZNPfLus/YNSPMYuLkZIda66yw3NzwHMeCOBXcBNdVH8OBiXLx/7c5qJrFrK/GOYfETH97Sr/jOM38FnvodDGv8f+Rcj1XBLIcDKAQAAAABJRU5ErkJggg==",Ut="";function $e(t,e,n){const i=t.slice();return i[16]=e[n],i}function Ne(t){let e,n,i,r,u,s,o,c,l,h,f,p,v,C;return{c(){e=m("div"),n=m("div"),i=ye("svg"),r=ye("path"),u=E(),s=m("div"),o=D(t[6]),c=E(),l=m("div"),h=D(t[5]),f=E(),p=m("div"),p.textContent=`${t[11]}`,d(r,"d","M.937-.016L5.793 4.84.937 9.696z"),d(r,"fill",t[8]),d(r,"fill-rule","evenodd"),d(r,"fill-opacity",".582"),d(i,"width","6"),d(i,"height","10"),d(n,"class","frame-triangle svelte-512hcv"),$(n,"rotate",t[3]),y(n,"visibility",t[0].children.length>0?"visible":"hidden"),d(s,"class","time svelte-512hcv"),y(s,"color",t[8]),y(s,"font-weight",t[10]<.2?500:600),d(l,"class","name svelte-512hcv"),d(p,"class","code-position svelte-512hcv"),d(e,"class","frame-description svelte-512hcv"),$(e,"application-code",t[0].isApplicationCode),$(e,"children-visible",t[3]),y(e,"padding-left",`${t[2]*35}px`)},m(g,A){O(g,e,A),a(e,n),a(n,i),a(i,r),a(e,u),a(e,s),a(s,o),a(e,c),a(e,l),a(l,h),a(e,f),a(e,p),v||(C=J(e,"click",ke(Te(t[12]))),v=!0)},p(g,A){A&256&&d(r,"fill",g[8]),A&8&&$(n,"rotate",g[3]),A&1&&y(n,"visibility",g[0].children.length>0?"visible":"hidden"),A&64&&X(o,g[6]),A&256&&y(s,"color",g[8]),A&32&&X(h,g[5]),A&1&&$(e,"application-code",g[0].isApplicationCode),A&8&&$(e,"children-visible",g[3]),A&4&&y(e,"padding-left",`${g[2]*35}px`)},d(g){g&&I(e),v=!1,C()}}}function Le(t){let e,n,i,r,u=t[0].group.frames.length+"",s,o,c,l,h,f;return{c(){e=m("div"),n=m("div"),i=m("div"),i.innerHTML='',r=E(),s=D(u),o=D(` frames hidden + (`),c=D(t[7]),l=D(")"),d(i,"class","group-triangle svelte-512hcv"),$(i,"rotate",t[9]),d(n,"class","group-header-button svelte-512hcv"),d(e,"class","group-header svelte-512hcv"),y(e,"padding-left",`${t[2]*35}px`)},m(p,v){O(p,e,v),a(e,n),a(n,i),a(n,r),a(n,s),a(n,o),a(n,c),a(n,l),h||(f=J(e,"click",ke(Te(t[13]))),h=!0)},p(p,v){v&512&&$(i,"rotate",p[9]),v&1&&u!==(u=p[0].group.frames.length+"")&&X(s,u),v&128&&X(c,p[7]),v&4&&y(e,"padding-left",`${p[2]*35}px`)},d(p){p&&I(e),h=!1,f()}}}function Be(t){let e,n,i=t[0].children,r=[];for(let s=0;sR(r[s],1,1,()=>{r[s]=null});return{c(){for(let s=0;s{l=null}),be()),f&4&&y(u,"left",`${h[2]*35+21}px`),f&256&&y(u,"backgroundColor",h[8])},i(h){s||(T(l),s=!0)},o(h){R(l),s=!1},d(h){h&&I(e),o&&o.d(),c&&c.d(),l&&l.d()}}}function pt(t,e,n){var S;let i,r,u;pe(t,Me,_=>n(14,r=_)),pe(t,oe,_=>n(15,u=_));let{frame:s}=e,{rootFrame:o}=e,{indent:c=0}=e,l=!0,h;const f=s.time/o.time;let p;s.className?p=`${s.className}.${s.function}`:p=s.function;const v=`${s.filePathShort}:${(S=s.lineNo)==null?void 0:S.toString().padEnd(4,"\xA0")}`;let C,g=null;if(s.group){const _=s.group.libraries;_.length<4?g=_.join(", "):g=`${_[0]}, ${_[1]}, ${_[2]}...`}let A;f>.6?A="#FF4159":f>.3?A="#F5A623":f>.2?A="#D8CB2A":A="#7ED321";function w(){n(3,l=!l)}function k(){Me.update(_=>{var F,N;return{..._,[(N=(F=s.group)==null?void 0:F.id)!=null?N:""]:!i}})}return t.$$set=_=>{"frame"in _&&n(0,s=_.frame),"rootFrame"in _&&n(1,o=_.rootFrame),"indent"in _&&n(2,c=_.indent)},t.$$.update=()=>{var _,F,N,B;if(t.$$.dirty&16385&&(s.group?r[(_=s.group.id)!=null?_:""]||((F=s.group)==null?void 0:F.rootFrame)===s||s.children.filter(ue=>!ue.group).length>1?n(4,h=!0):n(4,h=!1):n(4,h=!0)),t.$$.dirty&32769)if(u==="absolute")n(6,C=s.time.toLocaleString(void 0,{minimumFractionDigits:3,maximumFractionDigits:3}));else if(u==="proportion")n(6,C=`${(f*100).toLocaleString(void 0,{minimumFractionDigits:1,maximumFractionDigits:1})}%`);else throw new Error("unknown timeFormat");t.$$.dirty&16385&&n(9,i=r[(B=(N=s.group)==null?void 0:N.id)!=null?B:""]===!0)},[s,o,c,l,h,p,C,g,A,i,f,v,w,k,r,u]}class Ue extends se{constructor(e){super(),re(this,e,pt,ht,V,{frame:0,rootFrame:1,indent:2})}}const mt="\0",gt="[await]",le="[self]",_t=[gt,le,"[out-of-context]","[root]"],vt="c",bt="h";class K{constructor(e,n){P(this,"identifier");P(this,"_identifierParts");P(this,"time",0);P(this,"absorbedTime",0);P(this,"group",null);P(this,"attributes");P(this,"_children",[]);P(this,"parent",null);P(this,"context");var r,u,s;this.identifier=e.identifier,this._identifierParts=this.identifier.split(mt),this.time=(r=e.time)!=null?r:0,this.attributes=(u=e.attributes)!=null?u:{},this.context=n;const i=(s=e.children)==null?void 0:s.map(o=>new K(o,n));i&&this.addChildren(i)}cloneDeep(){return new K(this,this.context)}get children(){return this._children}addChild(e,n={}){if(e.removeFromParent(),e.parent=this,n.after){const i=this._children.indexOf(n.after);this._children.splice(i+1,0,e)}else this._children.push(e)}addChildren(e,n={}){n.after?(e.slice().reverse(),e.forEach(r=>this.addChild(r,n))):e.forEach(i=>this.addChild(i,n))}removeFromParent(){if(this.parent){const e=this.parent._children.indexOf(this);this.parent._children.splice(e,1),this.parent=null}}getAttributes(e){return Object.keys(this.attributes).filter(i=>i.startsWith(e)).map(i=>({data:i.slice(1),time:this.attributes[i]}))}getAttributeValue(e){const n=this.getAttributes(e);if(!n||n.length==0)return null;let i=0;for(let r=0;rn[i].time&&(i=r);return n[i].data}get hasTracebackhide(){return this.getAttributeValue(bt)=="1"}get function(){return this._identifierParts[0]}get filePath(){var e;return(e=this._identifierParts[1])!=null?e:null}get lineNo(){const e=this._identifierParts[2];return e?parseInt(e):null}get isSynthetic(){return _t.includes(this.identifier)}get filePathShort(){return this.isSynthetic&&this.parent?this.parent.filePathShort:this.filePath?this.context.shortenPath(this.filePath):null}get isApplicationCode(){if(this.isSynthetic)return!1;const e=this.filePath;return!e||["/lib/","\\lib\\"].some(i=>e.includes(i))?!1:e.startsWith("<")?!!e.startsWith("{e.attributes[n]!==void 0?e.attributes[n]+=i:e.attributes[n]=i}),e.addChildren(t.children),t.removeFromParent(),Ae(t,!1)}function Ae(t,e){if(e&&t.children&&t.children.forEach(n=>{Ae(n,!0)}),t.group){const n=t.group;n.removeFrame(t),n.frames.length===1&&n.removeFrame(n.frames[0])}}function He(t,e){if(!t)return null;for(const n of t.children)He(n),n.filePath&&n.filePath.includes("Ge(i)),t._children.sort((i,r)=>r.time-i.time),t}function Qe(t,e){if(!t)return null;const n=e.hideRegex,i=e.showRegex;function r(s){const o=s.filePath||"",c=i&&new RegExp(i).test(o),l=n&&new RegExp(n).test(o);return c?!1:l?!0:!s.isApplicationCode}function u(s,o){o.addFrame(s),s.children.forEach(c=>{r(c)&&u(c,o)})}return t.children.forEach(s=>{if(!s.group&&r(s)&&s.children.some(r)){const o=new At(s);u(s,o)}Qe(s,e)}),t}function Ve(t,e,n=!0){if(!t)return null;let i=null;for(const r of t.children)r.identifier===le?i?(i.time+=r.time,r.removeFromParent()):i=r:i=null;return n&&t.children.forEach(r=>Ve(r,e,!0)),t}function We(t,e){return t?(t.children.length===1&&t.children[0].identifier===le&&ce(t.children[0],{replaceWith:"nothing"}),t.children.forEach(n=>We(n)),t):null}function qe(t,e,n=null){if(!t)return null;n===null&&(n=t.time,n<=0&&(n=1e-44));const i=e.filterThreshold||.01;for(const r of t.children.slice())r.time/nqe(r,e,n)),t}function Ft(t,e){if(!t)return null;const n=s=>{var o;return((o=s.filePath)==null?void 0:o.includes("pyinstrument/__main__.py"))&&s.children.length>0},i=s=>{var o;return s.proportionOfParent>.8&&((o=s.filePath)==null?void 0:o.includes(""))&&s.children.length>0},r=s=>{var o,c;return s.proportionOfParent>.8&&(new RegExp(".*runpy.py").test((o=s.filePath)!=null?o:"")||((c=s.filePath)==null?void 0:c.includes("")))&&s.children.length>0};let u=t;if(!n(u)||(u=u.children[0],!i(u))||(u=u.children[0],!r(u)))return t;for(;r(u);)u=u.children[0];return u.removeFromParent(),u}function Pt(t){let e,n;return e=new Ue({props:{frame:t[0],rootFrame:t[0]}}),{c(){ie(e.$$.fragment)},m(i,r){x(e,i,r),n=!0},p:b,i(i){n||(T(e.$$.fragment,i),n=!0)},o(i){R(e.$$.fragment,i),n=!1},d(i){Y(e,i)}}}function Ct(t){let e;return{c(){e=m("div"),e.textContent="All frames were filtered out.",d(e,"class","error")},m(n,i){O(n,e,i)},p:b,i:b,o:b,d(n){n&&I(e)}}}function yt(t){let e,n,i,r;const u=[Ct,Pt],s=[];function o(c,l){return c[0]?1:0}return n=o(t),i=s[n]=u[n](t),{c(){e=m("div"),i.c(),d(e,"class","tree-view")},m(c,l){O(c,e,l),s[n].m(e,null),r=!0},p(c,[l]){i.p(c,l)},i(c){r||(T(i),r=!0)},o(c){R(i),r=!1},d(c){c&&I(e),s[n].d()}}}function Tt(t,e,n){let i=t;for(const r of e)if(i=r(i,n),!i)return null;return i}function kt(t,e,n){let{session:i}=e,u=[He,Xe,Ve,Ge,We,qe,Ft,Qe].slice();const s=Tt(i.rootFrame.cloneDeep(),u,{session:i});return t.$$set=o=>{"session"in o&&n(1,i=o.session)},[s,i]}class Rt extends se{constructor(e){super(),re(this,e,kt,yt,V,{session:1})}}const Gt="";function St(t){let e,n;return e=new Rt({props:{session:t[0]}}),{c(){ie(e.$$.fragment)},m(i,r){x(e,i,r),n=!0},p(i,r){const u={};r&1&&(u.session=i[0]),e.$set(u)},i(i){n||(T(e.$$.fragment,i),n=!0)},o(i){R(e.$$.fragment,i),n=!1},d(i){Y(e,i)}}}function It(t){let e;return{c(){e=m("div"),e.textContent="No samples recorded.",d(e,"class","error")},m(n,i){O(n,e,i)},p:b,i:b,o:b,d(n){n&&I(e)}}}function Dt(t){let e,n,i,r,u,s,o,c,l,h,f,p,v;n=new ft({props:{session:t[0]}});const C=[It,St],g=[];function A(w,k){return w[0].rootFrame?1:0}return f=A(t),p=g[f]=C[f](t),{c(){e=m("div"),ie(n.$$.fragment),i=E(),r=m("div"),u=E(),s=m("div"),o=m("div"),c=m("span"),c.textContent="Program:\xA0",l=D(t[1]),h=E(),p.c(),d(r,"class","spacer"),y(r,"height","20px"),d(c,"class","label svelte-1gm5pcf"),d(o,"class","program svelte-1gm5pcf"),d(s,"class","margins"),d(e,"class","app svelte-1gm5pcf")},m(w,k){O(w,e,k),x(n,e,null),a(e,i),a(e,r),a(e,u),a(e,s),a(s,o),a(o,c),a(o,l),a(s,h),g[f].m(s,null),v=!0},p(w,[k]){const S={};k&1&&(S.session=w[0]),n.$set(S),(!v||k&2)&&X(l,w[1]);let _=f;f=A(w),f===_?g[f].p(w,k):(ve(),R(g[_],1,1,()=>{g[_]=null}),be(),p=g[f],p?p.p(w,k):(p=g[f]=C[f](w),p.c()),T(p,1),p.m(s,null))},i(w){v||(T(n.$$.fragment,w),T(p),v=!0)},o(w){R(n.$$.fragment,w),R(p),v=!1},d(w){w&&I(e),Y(n),g[f].d()}}}function we(){document.body.style.minHeight=`${window.scrollY+window.innerHeight}px`}function Ot(t,e,n){let{session:i}=e;const r=document.createElement("link");r.rel="shortut icon",r.href=dt,document.head.appendChild(r),it(()=>{window.addEventListener("scroll",we),we()}),rt(()=>{window.removeEventListener("scroll",we)});const u=i.rootFrame,s=u==null?void 0:u.time.toLocaleString(void 0,{maximumSignificantDigits:3});let o=u==null?void 0:u.function;return o==""&&(o=i.program),document.title=`${s}s - ${o} - pyinstrument`,t.$$set=c=>{"session"in c&&n(0,i=c.session)},[i,o]}class Mt extends se{constructor(e){super(),re(this,e,Ot,Dt,V,{session:0})}}class $t{constructor(e){P(this,"startTime");P(this,"duration");P(this,"sampleCount");P(this,"program");P(this,"cpuTime");P(this,"rootFrame");P(this,"sysPath");P(this,"_shortenPathCache",{});this.startTime=e.session.start_time,this.duration=e.session.duration,this.sampleCount=e.session.sample_count,this.program=e.session.program,this.cpuTime=e.session.cpu_time,this.sysPath=e.session.sys_path,this.rootFrame=new K(e.frame_tree,this)}shortenPath(e){if(this._shortenPathCache[e])return this._shortenPathCache[e];let n=e;if(Q(e).length>1)for(const r of this.sysPath){const u=Nt(e,r);Q(u).length0&&e[0].endsWith(":")?e[0]:null}function Nt(t,e){if(Ze(t)!=Ze(e))return t;const n=Q(t),i=Q(e);let r=0;for(;r"..").concat(n.slice(r)).join("/")}return{render(t,e){const n=new $t(e);return new Mt({target:t,props:{session:n}})}}}(); diff --git a/pyinstrument/renderers/jsonrenderer.py b/pyinstrument/renderers/jsonrenderer.py index ec3c6b3d..766498c1 100644 --- a/pyinstrument/renderers/jsonrenderer.py +++ b/pyinstrument/renderers/jsonrenderer.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import typing from typing import Any, Callable from pyinstrument import processors @@ -13,7 +14,7 @@ # note: this file is called jsonrenderer to avoid hiding built-in module 'json'. -encode_str: Callable[[str], str] = json.encoder.encode_basestring # type: ignore +encode_str = typing.cast(Callable[[str], str], json.encoder.encode_basestring) # type: ignore def encode_bool(a_bool: bool): diff --git a/pyinstrument/renderers/pstatsrenderer.py b/pyinstrument/renderers/pstatsrenderer.py index 35428b32..831ecc06 100644 --- a/pyinstrument/renderers/pstatsrenderer.py +++ b/pyinstrument/renderers/pstatsrenderer.py @@ -77,7 +77,7 @@ def render_frame(self, frame: Frame | None, stats: StatsDict) -> None: def render(self, session: Session): frame = self.preprocess(session.root_frame()) - stats = {} + stats: StatsDict = {} self.render_frame(frame, stats) # marshal.dumps returns bytes, so we need to decode it to a string diff --git a/pyinstrument/session.py b/pyinstrument/session.py index 45f56ca3..d08cd7e2 100644 --- a/pyinstrument/session.py +++ b/pyinstrument/session.py @@ -1,6 +1,8 @@ from __future__ import annotations import json +import os +import sys from collections import deque from typing import Any @@ -28,6 +30,7 @@ def __init__( start_call_stack: list[str], program: str, cpu_time: float, + sys_path: list[str], ): """Session() @@ -42,6 +45,8 @@ def __init__( self.start_call_stack = start_call_stack self.program = program self.cpu_time = cpu_time + self.sys_path = sys_path + self._short_file_path_cache = {} @staticmethod def load(filename: PathOrStr) -> Session: @@ -63,17 +68,22 @@ def save(self, filename: PathOrStr) -> None: with open(filename, "w") as f: json.dump(self.to_json(), f) - def to_json(self): - return { - "frame_records": self.frame_records, + def to_json(self, include_frame_records: bool = True): + result: dict[str, Any] = { "start_time": self.start_time, "duration": self.duration, "sample_count": self.sample_count, "start_call_stack": self.start_call_stack, "program": self.program, "cpu_time": self.cpu_time, + "sys_path": self.sys_path, } + if include_frame_records: + result["frame_records"] = self.frame_records + + return result + @staticmethod def from_json(json_dict: dict[str, Any]): return Session( @@ -84,6 +94,7 @@ def from_json(json_dict: dict[str, Any]): start_call_stack=json_dict["start_call_stack"], program=json_dict["program"], cpu_time=json_dict["cpu_time"] or 0, + sys_path=json_dict.get("sys_path", sys.path), ) @staticmethod @@ -109,6 +120,9 @@ def combine(session1: Session, session2: Session) -> Session: start_call_stack=session1.start_call_stack, program=session1.program, cpu_time=session1.cpu_time + session2.cpu_time, + sys_path=( + session1.sys_path + [p for p in session2.sys_path if p not in session1.sys_path] + ), ) def root_frame(self, trim_stem: bool = True) -> Frame | None: @@ -119,7 +133,7 @@ def root_frame(self, trim_stem: bool = True) -> Frame | None: :rtype: A :class:`Frame` object, or None if the session is empty. """ - root_frame = build_frame_tree(self.frame_records) + root_frame = build_frame_tree(self.frame_records, context=self) if root_frame is None: return None @@ -148,3 +162,35 @@ def _trim_stem(self, frame: Frame): frame.remove_from_parent() return frame + + _short_file_path_cache: dict[str, str] + + def shorten_path(self, path: str) -> str: + """ + Shorten a path to a more readable form, relative to sys_path. Used by + Frame.short_file_path. + """ + if path in self._short_file_path_cache: + return self._short_file_path_cache[path] + + result = path + # if os.sep doesn't appear, probably not a file path at all, more + # likely or similar + if len(path.split(os.sep)) > 1: + for sys_path_entry in self.sys_path: + # On Windows, if path and sys_path_entry are on + # different drives, relpath will result in exception, + # because it cannot compute a relpath in this case. + # The root cause is that on Windows, there is no root + # dir like '/' on Linux. + try: + candidate = os.path.relpath(path, sys_path_entry) + except ValueError: + continue + + if not result or (len(candidate.split(os.sep)) < len(result.split(os.sep))): + result = candidate + + self._short_file_path_cache[path] = result + + return result diff --git a/test/test_renderers.py b/test/test_renderers.py index 9f18f0b0..f3291afb 100644 --- a/test/test_renderers.py +++ b/test/test_renderers.py @@ -15,7 +15,6 @@ frame_renderer_classes: list[type[renderers.FrameRenderer]] = [ renderers.ConsoleRenderer, - renderers.HTMLRenderer, renderers.JSONRenderer, renderers.PstatsRenderer, renderers.SpeedscopeRenderer, From c6b118c8fb38f42e75fa31b287161006ad6332ec Mon Sep 17 00:00:00 2001 From: Joe Rickerby Date: Mon, 29 Jul 2024 16:18:53 +0100 Subject: [PATCH 02/44] WIP new frontend rendering --- html_renderer/package-lock.json | 3456 +++++++---------- html_renderer/package.json | 20 +- html_renderer/src/lib/Frame.svelte | 2 +- html_renderer/src/lib/TreeView.svelte | 43 +- html_renderer/src/lib/model/processors.ts | 114 + html_renderer/tsconfig.node.json | 2 +- pyinstrument/__main__.py | 1 + pyinstrument/renderers/html_resources/app.css | 2 +- pyinstrument/renderers/html_resources/app.js | 4 +- 9 files changed, 1530 insertions(+), 2114 deletions(-) diff --git a/html_renderer/package-lock.json b/html_renderer/package-lock.json index d7b4dac1..b0fb8454 100644 --- a/html_renderer/package-lock.json +++ b/html_renderer/package-lock.json @@ -1,29 +1,58 @@ { "name": "svelte-test", "version": "0.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "svelte-test", "version": "0.0.0", "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^1.1.0", - "@tsconfig/svelte": "^3.0.0", - "rollup-plugin-visualizer": "^5.8.3", - "sass": "^1.56.1", - "svelte": "^3.52.0", - "svelte-check": "^2.9.2", - "svelte-preprocess": "^4.10.7", - "tslib": "^2.4.0", - "typescript": "^4.6.4", - "vite": "^3.2.3" + "@sveltejs/vite-plugin-svelte": "^3.0.2", + "@tsconfig/svelte": "^5.0.2", + "rollup-plugin-visualizer": "^5.12.0", + "sass": "^1.75.0", + "svelte": "^4.2.12", + "svelte-check": "^3.6.7", + "svelte-preprocess": "^5.1.4", + "tslib": "^2.6.2", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.13.tgz", - "integrity": "sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -36,517 +65,494 @@ "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.13.tgz", - "integrity": "sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==", + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ - "loong64" + "arm64" ], "dev": true, "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": ">=12" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.1.1.tgz", - "integrity": "sha512-NzIaGIzWh5hCSMUoxukYEGmxFCWgzaVglqHJLV5r0BA7hHZbHXu8DYR80i6QUX4xyoQ4PZ8ir7SUYsThbreMcg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "debug": "^4.3.4", - "deepmerge": "^4.2.2", - "kleur": "^4.1.5", - "magic-string": "^0.26.7", - "svelte-hmr": "^0.15.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.18.0 || >= 16" - }, - "peerDependencies": { - "diff-match-patch": "^1.0.5", - "svelte": "^3.44.0", - "vite": "^3.0.0" - }, - "peerDependenciesMeta": { - "diff-match-patch": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@tsconfig/svelte": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", - "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "node_modules/@types/pug": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", - "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", - "dev": true - }, - "node_modules/@types/sass": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", - "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=12" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { "node": ">=12" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ms": "2.1.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=12" } }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/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==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "dev": true + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } }, - "node_modules/esbuild": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.13.tgz", - "integrity": "sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.13", - "@esbuild/linux-loong64": "0.15.13", - "esbuild-android-64": "0.15.13", - "esbuild-android-arm64": "0.15.13", - "esbuild-darwin-64": "0.15.13", - "esbuild-darwin-arm64": "0.15.13", - "esbuild-freebsd-64": "0.15.13", - "esbuild-freebsd-arm64": "0.15.13", - "esbuild-linux-32": "0.15.13", - "esbuild-linux-64": "0.15.13", - "esbuild-linux-arm": "0.15.13", - "esbuild-linux-arm64": "0.15.13", - "esbuild-linux-mips64le": "0.15.13", - "esbuild-linux-ppc64le": "0.15.13", - "esbuild-linux-riscv64": "0.15.13", - "esbuild-linux-s390x": "0.15.13", - "esbuild-netbsd-64": "0.15.13", - "esbuild-openbsd-64": "0.15.13", - "esbuild-sunos-64": "0.15.13", - "esbuild-windows-32": "0.15.13", - "esbuild-windows-64": "0.15.13", - "esbuild-windows-arm64": "0.15.13" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.13.tgz", - "integrity": "sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.13.tgz", - "integrity": "sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==", - "cpu": [ - "arm64" - ], + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.13.tgz", - "integrity": "sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==", - "cpu": [ - "x64" - ], + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.13.tgz", - "integrity": "sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", + "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", "cpu": [ - "arm64" + "arm" ], "dev": true, "optional": true, "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "android" + ] }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.13.tgz", - "integrity": "sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", + "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "android" + ] }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.13.tgz", - "integrity": "sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", + "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "darwin" + ] }, - "node_modules/esbuild-linux-32": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.13.tgz", - "integrity": "sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", + "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", "cpu": [ - "ia32" + "x64" ], "dev": true, "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "darwin" + ] }, - "node_modules/esbuild-linux-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz", - "integrity": "sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", + "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", "cpu": [ - "x64" + "arm" ], "dev": true, "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.13.tgz", - "integrity": "sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", + "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", "cpu": [ "arm" ], @@ -554,15 +560,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.13.tgz", - "integrity": "sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", + "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", "cpu": [ "arm64" ], @@ -570,31 +573,25 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.13.tgz", - "integrity": "sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", + "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", "cpu": [ - "mips64el" + "arm64" ], "dev": true, "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.13.tgz", - "integrity": "sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", + "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", "cpu": [ "ppc64" ], @@ -602,15 +599,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.13.tgz", - "integrity": "sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", + "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", "cpu": [ "riscv64" ], @@ -618,15 +612,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.13.tgz", - "integrity": "sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", + "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", "cpu": [ "s390x" ], @@ -634,95 +625,38 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.13.tgz", - "integrity": "sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.13.tgz", - "integrity": "sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.13.tgz", - "integrity": "sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", + "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.13.tgz", - "integrity": "sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "linux" + ] }, - "node_modules/esbuild-windows-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.13.tgz", - "integrity": "sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", + "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "linux" + ] }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.13.tgz", - "integrity": "sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", + "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", "cpu": [ "arm64" ], @@ -730,2091 +664,1421 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/magic-string": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", - "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/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 - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-visualizer": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.3.tgz", - "integrity": "sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==", - "dev": true, - "dependencies": { - "open": "^8.4.0", - "source-map": "^0.7.4", - "yargs": "^17.5.1" - }, - "bin": { - "rollup-plugin-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "rollup": "2.x || 3.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sander": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", - "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", - "dev": true, - "dependencies": { - "es6-promise": "^3.1.2", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.2" - } - }, - "node_modules/sass": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", - "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/sorcery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", - "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", - "dev": true, - "dependencies": { - "buffer-crc32": "^0.2.5", - "minimist": "^1.2.0", - "sander": "^0.5.0", - "sourcemap-codec": "^1.3.0" - }, - "bin": { - "sorcery": "bin/index.js" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svelte": { - "version": "3.53.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.53.1.tgz", - "integrity": "sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/svelte-check": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.2.tgz", - "integrity": "sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.9", - "chokidar": "^3.4.1", - "fast-glob": "^3.2.7", - "import-fresh": "^3.2.1", - "picocolors": "^1.0.0", - "sade": "^1.7.4", - "svelte-preprocess": "^4.0.0", - "typescript": "*" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "peerDependencies": { - "svelte": "^3.24.0" - } - }, - "node_modules/svelte-hmr": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.0.tgz", - "integrity": "sha512-Aw21SsyoohyVn4yiKXWPNCSW2DQNH/76kvUnE9kpt4h9hcg9tfyQc6xshx9hzgMfGF0kVx0EGD8oBMWSnATeOg==", - "dev": true, - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": ">=3.19.0" - } - }, - "node_modules/svelte-preprocess": { - "version": "4.10.7", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", - "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/pug": "^2.0.4", - "@types/sass": "^1.16.0", - "detect-indent": "^6.0.0", - "magic-string": "^0.25.7", - "sorcery": "^0.10.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">= 9.11.2" - }, - "peerDependencies": { - "@babel/core": "^7.10.2", - "coffeescript": "^2.5.1", - "less": "^3.11.3 || ^4.0.0", - "postcss": "^7 || ^8", - "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", - "pug": "^3.0.0", - "sass": "^1.26.8", - "stylus": "^0.55.0", - "sugarss": "^2.0.0", - "svelte": "^3.23.0", - "typescript": "^3.9.5 || ^4.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "coffeescript": { - "optional": true - }, - "less": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "postcss": { - "optional": true - }, - "postcss-load-config": { - "optional": true - }, - "pug": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/svelte-preprocess/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/vite": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.3.tgz", - "integrity": "sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - } - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.13.tgz", - "integrity": "sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.13.tgz", - "integrity": "sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==", - "dev": true, - "optional": true - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + ] }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", + "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "cpu": [ + "ia32" + ], "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } + "optional": true, + "os": [ + "win32" + ] }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", + "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "optional": true, + "os": [ + "win32" + ] }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.0.tgz", + "integrity": "sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.9", + "svelte-hmr": "^0.16.0", + "vitefu": "^0.2.5" + }, + "engines": { + "node": "^18.0.0 || >=20" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" } }, - "@sveltejs/vite-plugin-svelte": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.1.1.tgz", - "integrity": "sha512-NzIaGIzWh5hCSMUoxukYEGmxFCWgzaVglqHJLV5r0BA7hHZbHXu8DYR80i6QUX4xyoQ4PZ8ir7SUYsThbreMcg==", + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", + "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", "dev": true, - "requires": { - "debug": "^4.3.4", - "deepmerge": "^4.2.2", - "kleur": "^4.1.5", - "magic-string": "^0.26.7", - "svelte-hmr": "^0.15.0" + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.0.0 || >=20" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" } }, - "@tsconfig/svelte": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", - "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "node_modules/@tsconfig/svelte": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", + "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==", "dev": true }, - "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, - "@types/pug": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", - "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "node_modules/@types/pug": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", + "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", "dev": true }, - "@types/sass": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", - "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, - "requires": { - "@types/node": "*" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "buffer-crc32": { + "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "callsites": { + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "requires": { + "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "cliui": { + "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" } }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "debug": { + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "requires": { + "dependencies": { "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "define-lazy-prop": { + "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "detect-indent": { + "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "emoji-regex": { + "node_modules/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 }, - "es6-promise": { + "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", "dev": true }, - "esbuild": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.13.tgz", - "integrity": "sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.15.13", - "@esbuild/linux-loong64": "0.15.13", - "esbuild-android-64": "0.15.13", - "esbuild-android-arm64": "0.15.13", - "esbuild-darwin-64": "0.15.13", - "esbuild-darwin-arm64": "0.15.13", - "esbuild-freebsd-64": "0.15.13", - "esbuild-freebsd-arm64": "0.15.13", - "esbuild-linux-32": "0.15.13", - "esbuild-linux-64": "0.15.13", - "esbuild-linux-arm": "0.15.13", - "esbuild-linux-arm64": "0.15.13", - "esbuild-linux-mips64le": "0.15.13", - "esbuild-linux-ppc64le": "0.15.13", - "esbuild-linux-riscv64": "0.15.13", - "esbuild-linux-s390x": "0.15.13", - "esbuild-netbsd-64": "0.15.13", - "esbuild-openbsd-64": "0.15.13", - "esbuild-sunos-64": "0.15.13", - "esbuild-windows-32": "0.15.13", - "esbuild-windows-64": "0.15.13", - "esbuild-windows-arm64": "0.15.13" - } - }, - "esbuild-android-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.13.tgz", - "integrity": "sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.13.tgz", - "integrity": "sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.13.tgz", - "integrity": "sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.13.tgz", - "integrity": "sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.13.tgz", - "integrity": "sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.13.tgz", - "integrity": "sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.13.tgz", - "integrity": "sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz", - "integrity": "sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.13.tgz", - "integrity": "sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.13.tgz", - "integrity": "sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.13.tgz", - "integrity": "sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.13.tgz", - "integrity": "sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.13.tgz", - "integrity": "sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.13.tgz", - "integrity": "sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.13.tgz", - "integrity": "sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.13.tgz", - "integrity": "sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.13.tgz", - "integrity": "sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.13.tgz", - "integrity": "sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==", + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, - "optional": true + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } }, - "esbuild-windows-64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.13.tgz", - "integrity": "sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==", + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, - "optional": true + "engines": { + "node": ">=6" + } }, - "esbuild-windows-arm64": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.13.tgz", - "integrity": "sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "dependencies": { + "@types/estree": "^1.0.0" + } }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" } }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "glob": { + "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "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" - } - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "dev": true }, - "import-fresh": { + "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { + "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/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 + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } }, - "is-wsl": { + "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "requires": { + "dependencies": { "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "kleur": { + "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", "dev": true }, - "magic-string": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", - "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" } }, - "merge2": { + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "min-indent": { + "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "mkdirp": { + "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "mri": { + "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "ms": { + "node_modules/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 }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, - "requires": { + "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } }, - "picocolors": { + "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, - "requires": { - "nanoid": "^3.3.4", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "rimraf": { + "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "node_modules/rollup": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", + "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", "dev": true, - "requires": { + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.16.4", + "@rollup/rollup-android-arm64": "4.16.4", + "@rollup/rollup-darwin-arm64": "4.16.4", + "@rollup/rollup-darwin-x64": "4.16.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", + "@rollup/rollup-linux-arm-musleabihf": "4.16.4", + "@rollup/rollup-linux-arm64-gnu": "4.16.4", + "@rollup/rollup-linux-arm64-musl": "4.16.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", + "@rollup/rollup-linux-riscv64-gnu": "4.16.4", + "@rollup/rollup-linux-s390x-gnu": "4.16.4", + "@rollup/rollup-linux-x64-gnu": "4.16.4", + "@rollup/rollup-linux-x64-musl": "4.16.4", + "@rollup/rollup-win32-arm64-msvc": "4.16.4", + "@rollup/rollup-win32-ia32-msvc": "4.16.4", + "@rollup/rollup-win32-x64-msvc": "4.16.4", "fsevents": "~2.3.2" } }, - "rollup-plugin-visualizer": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.3.tgz", - "integrity": "sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==", + "node_modules/rollup-plugin-visualizer": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz", + "integrity": "sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==", "dev": true, - "requires": { + "dependencies": { "open": "^8.4.0", + "picomatch": "^2.3.1", "source-map": "^0.7.4", "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "sade": { + "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, - "requires": { + "dependencies": { "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" } }, - "sander": { + "node_modules/sander": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", "dev": true, - "requires": { + "dependencies": { "es6-promise": "^3.1.2", "graceful-fs": "^4.1.3", "mkdirp": "^0.5.1", "rimraf": "^2.5.2" } }, - "sass": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", - "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", + "node_modules/sass": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz", + "integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==", "dev": true, - "requires": { + "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" } }, - "sorcery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", - "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", "dev": true, - "requires": { + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", "buffer-crc32": "^0.2.5", "minimist": "^1.2.0", - "sander": "^0.5.0", - "sourcemap-codec": "^1.3.0" + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" } }, - "source-map": { + "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-indent": { + "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "requires": { + "dependencies": { "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svelte": { - "version": "3.53.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.53.1.tgz", - "integrity": "sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==", - "dev": true + "node_modules/svelte": { + "version": "4.2.15", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.15.tgz", + "integrity": "sha512-j9KJSccHgLeRERPlhMKrCXpk2TqL2m5Z+k+OBTQhZOhIdCCd3WfqV+ylPWeipEwq17P/ekiSFWwrVQv93i3bsg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^4.0.0", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } }, - "svelte-check": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.2.tgz", - "integrity": "sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==", + "node_modules/svelte-check": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.7.0.tgz", + "integrity": "sha512-Va6sGL4Vy4znn0K+vaatk98zoBvG2aDee4y3r5X4S80z8DXfbACHvdLlyXa4C4c5tQzK9H0Uq2pbd20wH3ucjQ==", "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.9", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", "chokidar": "^3.4.1", "fast-glob": "^3.2.7", "import-fresh": "^3.2.1", "picocolors": "^1.0.0", "sade": "^1.7.4", - "svelte-preprocess": "^4.0.0", - "typescript": "*" + "svelte-preprocess": "^5.1.3", + "typescript": "^5.0.3" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" } }, - "svelte-hmr": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.0.tgz", - "integrity": "sha512-Aw21SsyoohyVn4yiKXWPNCSW2DQNH/76kvUnE9kpt4h9hcg9tfyQc6xshx9hzgMfGF0kVx0EGD8oBMWSnATeOg==", + "node_modules/svelte-hmr": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", + "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", "dev": true, - "requires": {} + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0" + } }, - "svelte-preprocess": { - "version": "4.10.7", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", - "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "node_modules/svelte-preprocess": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.4.tgz", + "integrity": "sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==", "dev": true, - "requires": { - "@types/pug": "^2.0.4", - "@types/sass": "^1.16.0", - "detect-indent": "^6.0.0", - "magic-string": "^0.25.7", - "sorcery": "^0.10.0", + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.30.5", + "sorcery": "^0.11.0", "strip-indent": "^3.0.0" }, - "dependencies": { - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true } } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, - "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } }, - "vite": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.3.tgz", - "integrity": "sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==", + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, - "requires": { - "esbuild": "^0.15.9", - "fsevents": "~2.3.2", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "requires": { + "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -2822,13 +2086,19 @@ "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + } } } } diff --git a/html_renderer/package.json b/html_renderer/package.json index ad2880ae..0597ff7f 100644 --- a/html_renderer/package.json +++ b/html_renderer/package.json @@ -10,15 +10,15 @@ "check": "svelte-check --tsconfig ./tsconfig.json" }, "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^1.1.0", - "@tsconfig/svelte": "^3.0.0", - "rollup-plugin-visualizer": "^5.8.3", - "sass": "^1.56.1", - "svelte": "^3.52.0", - "svelte-check": "^2.9.2", - "svelte-preprocess": "^4.10.7", - "tslib": "^2.4.0", - "typescript": "^4.6.4", - "vite": "^3.2.3" + "@sveltejs/vite-plugin-svelte": "^3.0.2", + "@tsconfig/svelte": "^5.0.2", + "svelte": "^4.2.12", + "svelte-check": "^3.6.7", + "tslib": "^2.6.2", + "typescript": "^5.2.2", + "vite": "^5.2.0", + "svelte-preprocess": "^5.1.4", + "rollup-plugin-visualizer": "^5.12.0", + "sass": "^1.75.0" } } diff --git a/html_renderer/src/lib/Frame.svelte b/html_renderer/src/lib/Frame.svelte index 3eb03c8a..223d41df 100644 --- a/html_renderer/src/lib/Frame.svelte +++ b/html_renderer/src/lib/Frame.svelte @@ -26,7 +26,7 @@ let name: string - if (frame.className) { + $: if (frame.className) { name = `${frame.className}.${frame.function}` } else { name = frame.function diff --git a/html_renderer/src/lib/TreeView.svelte b/html_renderer/src/lib/TreeView.svelte index ba54943a..0c6cb64c 100644 --- a/html_renderer/src/lib/TreeView.svelte +++ b/html_renderer/src/lib/TreeView.svelte @@ -2,10 +2,10 @@ import FrameView from './Frame.svelte' import type Frame from './model/Frame'; import type Session from './model/Session'; - import {aggregate_repeated_calls, group_library_frames_processor, merge_consecutive_self_time, remove_first_pyinstrument_frames_processor, remove_importlib, remove_irrelevant_nodes, remove_tracebackhide, remove_unnecessary_self_time_nodes, type ProcessorFunction, type ProcessorOptions} from './model/processors' + import {aggregate_repeated_calls, group_library_frames_processor, merge_consecutive_self_time, remove_first_pyinstrument_frames_processor, remove_importlib, remove_irrelevant_nodes, remove_tracebackhide, remove_unnecessary_self_time_nodes, type ProcessorFunction, type ProcessorOptions, allProcessors, type Processor} from './model/processors' export let session: Session - const allProcessorsList = [ + const defaultProcessorFunctions = [ remove_importlib, remove_tracebackhide, merge_consecutive_self_time, @@ -16,12 +16,23 @@ group_library_frames_processor, ] as ProcessorFunction[] - let activeProcessors = allProcessorsList.slice() + let activeProcessors: Processor[] + let enabledProcessors: {[name: string]: boolean} = {} - function applyProcessors(rootFrame: Frame, processors: ProcessorFunction[], options: ProcessorOptions) { + let processorOptions: Record = {} + for (const processor of allProcessors) { + enabledProcessors[processor.name] = defaultProcessorFunctions.includes(processor.function) + for (const optionSpec of processor.optionsSpec) { + processorOptions[optionSpec.name] = optionSpec.value.default + } + } + + $: activeProcessors = defaultProcessorFunctions.map(f => allProcessors.find(p => p.function == f)!).filter(p => enabledProcessors[p.name]) + + function applyProcessors(rootFrame: Frame, processors: Processor[], options: ProcessorOptions) { let frame: Frame|null = rootFrame for (const processor of processors) { - frame = processor(frame, options) + frame = processor.function(frame, options) if (!frame) { return null } @@ -29,10 +40,30 @@ return frame } - const rootFrame = applyProcessors(session.rootFrame.cloneDeep(), activeProcessors, {session}) + let rootFrame: Frame|null + $: rootFrame = applyProcessors(session.rootFrame.cloneDeep(), activeProcessors, processorOptions)
+
+

Options

+
+ {#each allProcessors as processor} + + {/each} +
+ +
{#if !rootFrame}
All frames were filtered out. diff --git a/html_renderer/src/lib/model/processors.ts b/html_renderer/src/lib/model/processors.ts index 317c6708..95403ea9 100644 --- a/html_renderer/src/lib/model/processors.ts +++ b/html_renderer/src/lib/model/processors.ts @@ -6,6 +6,34 @@ import { combineFrames, deleteFrameFromTree } from './frameOps' export type ProcessorOptions = Record export type ProcessorFunction = (frame: Frame | null, options: ProcessorOptions) => Frame | null +export interface Processor { + name: string + description: string + function: ProcessorFunction + optionsSpec: { + key: string, + name: string, + value: { + type: 'string', + default: string + } | { + type: 'number', + default: number + min?: number + max?: number + sliderMin?: number + sliderMax?: number + sliderLogarithmic?: boolean + } | { + type: 'boolean', + default: boolean + } + }[], + category: 'normal' | 'advanced' +} + +export const allProcessors: Processor[] = [] + /** * Removes ``